管理应用程序配置(configmap)
创建ConfigMap后,
数据实际会存储在K8s中Etcd,然后通过创建Pod时引用该数据
。
应用场景:应用程序配置
Pod使用configmap数据有两种方式:
•
变量注入
•
数据卷挂载
[root@k8s-master ~]# cat configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
abc: "123"
cde: "456"
redis.properties: |
port: 6379
host: localhost
[root@k8s-master ~]# kubectl apply -f configmap.yml
configmap/app-config created
[root@k8s-master ~]# kubectl get cm
NAME DATA AGE
app-config 3 46s
[root@k8s-master ~]# kubectl describe cm app-config
Name: app-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
abc:
----
123
cde:
----
456
redis.properties:
----
port: 6379
host: localhost
Events: <none>
这里就将环境变量和配置文件都保存在k8s当中了。现在就是部署应用可以读取这个配置
[root@k8s-master ~]# cat configmap-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: app-config-demo
spec:
containers:
- name: demo
image: nginx
env:
- name: XYZ
value: "666"
- name: ABCD
valueFrom:
configMapKeyRef:
name: app-config
key: abc
- name: CDEF
valueFrom:
configMapKeyRef:
name: app-config
key: cde
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
configMap:
name: app-config
items:
- key: "redis.properties"
path: "redis.config"
[root@k8s-master ~]# kubectl apply -f configmap-pod.yml
pod/app-config-demo created
- key: "redis.properties" 这是是configmap里面的key
path: "redis.config" 挂载配置文件的文件名,也就是使用容器卷挂载在某个目录下,这个文件名就是path对应的值
[root@k8s-master ~]# kubectl exec -it app-config-demo -- bash
root@app-config-demo:/# ls /config/
redis.config
root@app-config-demo:/# cat /config/redis.config
port: 6379
host: localhost
root@app-config-demo:/# echo $XYZ
666
root@app-config-demo:/# echo $ABCD
123
root@app-config-demo:/# echo $CDEF
456
应用程序如何动态更新配置
应用程序动态更新配置方案:没有完善的自动化机制
Configmap帮你存储了配置文件,也挂载在对应的目录下面,但是confimap不能帮你实现热加载
- 当ConfigMap发生变更时,应用程序自动感知动态加载(需要程序自身支持)(在pod当中专门一个容器监听配置文件有没有更改,也就是通过数据卷挂载在自己的目录下去探测有没有更改,如果有变化就通知程序进行加载)
- 触发滚动更新,即重启服务 当pod重建的时候就会去挂载configmap,也就是使用新的配置文件了,比如你明天升级,就可以将文件更新一下了,等明天更新就可以使用新的配置文件了