许多服务在启动/运行时需要读取配置文件、环境变量或命令行参数等信息,我们可以很方便地使用ConfigMap为pod完成这些配置信息的设置与更新。通过下面的例子来了解下ConfigMap吧。
生成ConfigMap
有两个文件info1
info2
保存了配置信息
1 | ming@ming-master:~/temp/configmap$ ls |
执行kubectl create configmap conf --from-file=.
命令生成ConfigMap
(conf
是指定的ConfigMap的名字,--from-file=.
指定了当前目录,只会将当前目录下的文件做为配置文件而不去读子目录。也可以从文件或命令行中取得配置,详细参考官网)
1 | ming@ming-master:~/temp/configmap$ kubectl create configmap conf --from-file=. |
然后使用kubectl describe configmap
查看下刚生成的ConfigMap
1 | ming@ming-master:~/temp/configmap$ kubectl describe configmap conf |
或使用kubectl get configmap *** -o yaml
查看详细信息
1 | ming@ming-master:~/temp/configmap$ kubectl get configmap conf -o yaml |
在pod中使用ConfigMap
ConfigMap生成后如何在pod中使用呢,继续使用上面的例子进行说明。假设我们的容器服务需要info1与info2两个配置文件。
pod文件如下,注意volumeMounts
与volumes
段,volumeMounts.name要与volumes.name一致,volumes.configMap.name与上面创建的ConfigMap名字一致
1 | ming@ming-master:~/temp/configmap$ cat pod.yaml |
启动pod
1 | ming@ming-master:~/temp/configmap$ kubectl create -f pod.yaml |
启动成功,到slave中的容器看下info1 info2两个文件是否正常
1 | ming@ming-slave:~$ docker ps |grep ubuntu.*testconfigmap |
bingo!
更进一步:热更新配置文件
可以使用kubectl replace
命令来更新ConfigMap,但此命令格式为kubectl replace -f FILENAME [flags]
,-f
后面需要指定ConfigMap的配置文件
而上面是用--from-file
指定目录取得的配置文件,更新文件后如何更新ConfigMap还没有查到正常的方法,下面说下比较恶心的方法。
1 | ming@ming-master:~/temp$ kubectl get configmap conf -o yaml |
取得ConfigMap信息保存到文件再删除/添加内容如下
1 | ming@ming-master:~/temp$ cat /tmp/configmap |
然后再使用kubectl replace
修改ConfigMap
1 | ming@ming-master:~/temp$ kubectl replace -f /tmp/configmap |
成功,切回slave看下配置文件
1 | root@testconfigmap:/# cat /etc/config/info1 |
修改成功
一些限制及问题
- 当create ConfigMap时–from-file指定的是目录时,在更新文件后,如何正常的更新ConfigMap
- 如何为有子目录的配置目录生成ConfigMap(子目录中也有配置文件)
- 配置文件不能实时更新,在master上使用
kubectrl replace
或kubectl edit
更新configmap后,相关pod内的文件延迟更新(测试两次30s,1min)(下一次syncLoop
时,才会更新配置) - 环境变量更新后旧Pod内环境变量不会改变,新启动的Pod是最新的环境变量
- 配置文件名(做为configmap.data中的key名字)有限制,Data contains the configuration data. Each key must be a valid DNS_SUBDOMAIN with an optional leading dot(可以有横线
-
点.
小写字母)