一: configMap简述
Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。
我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
ConfigMap
+--------+
| |
| key1 |
| value1|
| |
| key2 |
| value2|
+--------+
|
|---> Volume Mount
|
Pod
+--------+
| |
| Container |
| |
+--------+
- ConfigMap 包含两个键值对(key1/value1 和 key2/value2)。
- Pod 包含一个容器。
- ConfigMap 通过Volume Mount的方式将数据传递给Pod中的容器的那个目录下
二: 部署pod测试一下configMap的功能
先随便定义一个文件,比如说就my.cnf
vim my.cnf
[mysqld]
server_id=1
[client]
user=sjl
password=123456
创建configMap
kubectl create configmap mconfig --from-file=my.cnf
这条命令就是将刚才创建的文件my.cnf创建成configMap
kubectl get cm #查看创建的configMap
kubectl describe cm myconfig #查看刚刚创建的configMap的详细信息,可以看到key就是my.cnf
创建一个pod
vim test.yaml
apiVersion: v1
kind: Pod
metadata: name: mysqllabels:app: mysql
spec:containers:- name: myimage: nginx:1.26imagePullPolicy: IfNotPresentports:- containerPort: 80volumeMounts: - name: config #volume的名字mountPath: /mnt #挂载的目录volumes:- name: config configMap: #定义卷的类型为configMapname: myconfig #刚刚创建的configMap
kubectl apply -f test.yaml
kubectl get pod mysql #查看pod
kubectl exec -it mysql -- /bin/bash #进入容器里面
可以看到文件中也是我们定义的内容
configMap热更新:
热更新 这意味着你可以在不重启Pod的情况下更新配置数据
kubectl edit cm myconfig 编辑这个configMap
比如将这个server_id从1换成了123
再进入容器里面查看
也成功换成了123,经过测试大概需要10几秒的时间才会更新完成
这种热更新能力主要适用于通过卷挂载的ConfigMap,而通过环境变量或subPath挂载的文件则不支持动态更新
三:实战例子,挂载nginx配置
创建自己的nginx.conf文件
vim nginx.conf
就只加了一个server_tokens off; 这个表示隐藏nginx版本号如果没有这个参数的话访问错误的话就是会显示出版本号
创建configMap
kubectl create configmap nginx-config --from-file=nginx.conf
kubectl get configmap
可以看到已经创建成功了
创建pod
vim pod.yaml
apiVersion: v1
kind: Pod
metadata: name: testlabels:app: web
spec:containers:- name: cadimage: nginx:1.26imagePullPolicy: IfNotPresentports:- containerPort: 80volumeMounts:# 这里定义了如何将ConfigMap挂载到容器内部- name: nginxconf# 指定容器内挂载ConfigMap的路径mountPath: /etc/nginx/nginx.conf # 指定ConfigMap中的文件名称subPath: nginx.confvolumes:# 定义了一个名为nginxconf的卷,这个卷将被挂载到容器中- name: nginxconf# 指定了这个卷的类型为ConfigMap,并且引用了一个名为nginx-config的ConfigMap对象configMap:name: nginx-config
kubectl apply -f pod.yaml
kubectl get pod test
可以看到pod已经创建出来了
进入到容器查看一下
kubectl exec -it test -- /bin/bash
可以看到确实是我们自己定义的内容
curl pod ip测试一下
后面的aaa就是web服务没有这个路径所以显示404,可以看到确实已经隐藏了版本号了。
在浏览器访问看一下
浏览器访问的时候也是一样的隐藏了版本号!
注意: 在集群外部访问的话需要创建service 我这边是提前创建好了,创建nodePort类型的service就行。