【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用
前言
在上一篇文章中,我们学习了ConfigMap的创建,那么创建成功了,我们应该怎么在 Pod 中来使⽤它呢?今天我们就来深入地学习ConfigMap的使用。
文章目录
- 前言
- 使用
- 使用ConfigMap的限制条件
使用
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。
我们说ConfigMap 这些配置数据可以通过很多种⽅式在 Pod ⾥使⽤,主要有以下⼏种⽅式:
- 设置环境变量的值
- 在容器⾥设置命令⾏参数
- 在数据卷⾥⾯创建config⽂件
⾸先,我们使⽤ ConfigMap 来填充我们的环境变量:
apiVersion: v1
kind: Pod
metadata:
name: testcm1-pod
spec:
containers:
- name: testcm1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
envFrom:
- configMapRef:
name: cm-demo1
这个Pod运⾏后会输出如下⼏⾏:
$ kubectl logs testcm1-pod
......
DB_HOST=localhost
DB_PORT=3306
mysql.conf=host=127.0.0.1
port=3306
redis.conf=host=127.0.0.1
port=6379
......
我们可以看到 DB_HOST
和 DB_PORT
都已经正常输出了,另外的环境变量是因为我们这⾥直接把 cmdemo1
给注⼊进来了,所以把他们的整个键值给输出出来了,这也是符合预期的。
另外我们可以使⽤ ConfigMap 来设置命令⾏参数, ConfigMap 也可以被⽤来设置容器中的命令或者参数值,如下 Pod :
apiVersion: v1
kind: Pod
metadata:
name: testcm2-pod
spec:
containers:
- name: testcm2
image: busybox
command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)" ]
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
运⾏这个 Pod 后会输出如下信息:
$ kubectl logs testcm2-pod
localhost 3306
另外⼀种是⾮常常⻅的使⽤ ConfigMap 的⽅式:通过数据卷使⽤,在数据卷⾥⾯使⽤ ConfigMap ,就是将⽂件填⼊数据卷,在这个⽂件中,键就是⽂件名,键值就是⽂件内容:
apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo2
运⾏这个 Pod 的,查看⽇志:
$ kubectl logs testcm3-pod
host=127.0.0.1
port=6379
当然我们也可以在 ConfigMap 值被映射的数据卷⾥去控制路径,如下 Pod 定义:
apiVersion: v1
kind: Pod
metadata:
name: testcm4-pod
spec:
containers:
- name: testcm4
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo1
items:
- key: mysql.conf
path: path/to/msyql.conf
运⾏这个 Pod 的,查看⽇志:
$ kubectl logs testcm4-pod
host=127.0.0.1
port=3306
另外需要注意的是,当 ConfigMap 以数据卷的形式挂载进 Pod 的时,这时更新 ConfigMap (或删掉重建 ConfigMap ), Pod 内挂载的配置信息会热更新。这时可以增加⼀些监测配置⽂件变更的脚本,然后 reload 对应服务。
使用ConfigMap的限制条件
使用ConfigMap
的限制条件如下:
- ConfigMap必须在Pod之前创建(除非把 ConfigMap 标志成”optional”)。如果您引用了一个不存在的 ConfigMap, 那这个Pod是无法启动的。就像引用了不存在的 Key 会导致 Pod 无法启动一样。
- ConfigMap受Namespace限制,只有处于相同的
Namespace
中的Pod可以引用它; - ConfigMap中的配额管理还未能实现;
- kubelet值支持可以被API Server管理的Pod使用ConfigMap。kubelet在当前Node上通过
--manifest-url
或--config
自动创建的静态Pod将无法引用ConfigMap; - 在Pod对ConfigMap进行挂载(volumeMount)操作是,容器内部只能挂载为目录,无法挂载为文件。
- 在挂载到容器内部后,目录中将包含ConfigMap定义的每个item,如果该目录下原理还有其他文件,则容器内的该目录会被挂载的ConfigMap覆盖。