【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用

前言

在上一篇文章中,我们学习了ConfigMap的创建,那么创建成功了,我们应该怎么在 Pod 中来使⽤它呢?今天我们就来深入地学习ConfigMap的使用。

【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用_第1张图片

文章目录

  • 前言
  • 使用
  • 使用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_HOSTDB_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覆盖

【云原生丨Kubernetes系列16】深入学习 ConfigMap 的使用_第2张图片

你可能感兴趣的:(云原生,从入门到进阶,kubernetes,云原生,学习)