configMap
configMap
ConfigMap : 许多应用程序会从 配置文件 、 命令行参数 或 环境变量 中读取配置信息。
ConfigMap API : 给我们提供了向容器中注入配置信息的机制,可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制大对象
configmap 注入方式有两种
- configMap 做为存储卷
- 将 configMap 通过 env 中 configMapKeyRef 注入到容器中。
ConfigMap 的创建
使用目录创建
1 | $ mkdir configMap |
--from-file 指定目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对, 键的名字就是文件名,值就是文件的内容
使用文件创建
只要指定为一个文件就可以从单个文件中创建 ConfigMap
1 | [root@k8s01 storage]# kubectl create configmap game-config-2 --from-file=configMap/game.properties --from-file=configMap/ui.properties |
--from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
使用字面值创建
使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下
1 | [root@k8s01 storage]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm |
1 | [root@k8s01 storage]# kubectl delete cm --all |
Pod 中使用 ConfigMap
使用 ConfigMap 来替代环境变量
special-config.yaml
1 | apiVersion: v1 |
env-config.yaml
1 | apiVersion: v1 |
test-pod01.yaml
1 | apiVersion: v1 |
1 | [root@k8s01 storage]# kubectl apply -f special-config.yaml |
通过环境变量引入:使用 envfrom
用 ConfigMap 设置命令行参数
test-pod02.yaml
1 | apiVersion: v1 |
1 | [root@k8s01 storage]# kubectl apply -f test-pod02.yaml |
通过数据卷插件使用ConfigMap
在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
test_pod03.yaml
1 | apiVersion: v1 |
1 | [root@k8s01 storage]# kubectl exec test-pod03 -it -- /bin/bash |
ConfigMap 的热更新
test04.yaml
1 | apiVersion: v1 |
1 | [root@k8s01 storage]# kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2 |
修改 ConfigMap
1 | [root@k8s01 storage]# kubectl edit configmap log-config # 修改log_level的值为DEBUG等待大概 10 秒钟时间,再次查看环境变量的值 |
ConfigMap 更新后滚动更新 Pod
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新
1 | [root@k8s01 storage]# kubectl describe deployment my-nginx-test |
这个例子里我们在 .spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config 来触发滚动更新
!!!更新 ConfigMap 后:
- 使用该 ConfigMap 挂载的 Env 不会同步更新
- 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
DownwardAPI
DownwardAPI 可以获取 Pod 对象中定义的字段,比如 Pod 的标签(Labels)、Pod 的 IP 地址及 Pod 所在的命名空间(namespace)等。
Downward API 有两种使用方法,既支持环境变量注入,也支持通过 Volume 挂载。
DownwardAPI 使用
1 | [root@k8s01 stroage]# cat downwardapi-volume-demo.yaml |
查看
1 | [root@k8s01 stroage]# kubectl apply -f downwardapi-volume-demo.yaml |
数据变量更新
对于挂载目录,文件
1 | / # ls -alh /etc/podinfo/ |
对于环境变量
目前有个开源工具 Reloader,通过 watch ConfigMap 和 Secret 等,一旦发现对象更新,就自动触发对 Deployment 或 StatefulSet 等工作负载对象进行滚动升级。
可以参考 ConfigMap 的热更新
不可变 Secret 和 ConfigMap
添加字段
1 | immutable: true # 字段名是 immutable;拼错属于未知字段,会被忽略/告警,ConfigMap 依旧可改 |