在Kuberenetes中ConfigMap是最常用的功能了,尤其在容器化弹性快速部署的模式下,应用的配置就可以通过ConfigMap很好的管理。ConfigMap有Key和Value配成一对,一个ConfigMap中可以有很多个Key-Value对,创建ConfigMap时,Key-Value信息可以从字面量来,也可以从文件中来
kubectl create cm my-config --from-literal=key1=config1 --from-literal=key2=config2
从字面量创建key=value对kubectl create cm my-config --from-file=path/to/bar
从文件中创建key=value对,key则是文件名bar
,value就是文件内容
我们创建一个名为config1的ConfigMap,key=value从文件中来
node4 ~ # kubectl create cm config1 --from-file ./config.yaml
configmap/config1 created
node4 ~ # kubectl describe cm config1
Name: config1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
config.yaml:
----
name: 琼台博客
country: China
job: Programmer
Events: <none>
甚至,你可以文件和字面量同时混用,如:
node4 ~ # kubectl create cm config2 --from-file /root/config.yaml --from-literal=host=www.qttc.net
configmap/config2 created
node4 ~ # kubectl describe cm config2
Name: config2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
config.yaml:
----
name: 琼台博客
country: China
job: Programmer
host:
----
www.qttc.net
Events: <none>
要修改已创建好的ConfigMap很简单,直接kubectl edit cm
就好,如我们要修改config
kubectl edit cm config
通常情况下,有两个建议用于创建ConfigMap时要慎重考虑的
- 不建议从字面量创建ConfigMap,建议从文件,原因就是从文件中创建的东西不会因为Kubernetes异常而导致数据丢失
- 不建议使用
kubectl edit cm
命令修改从文件创建的ConfigMap,这样会迫使你保持本地配置文件永远跟ConfigMap中一致,从而更好维护
但如果我们已经从本地文件中创建好了一个ConfigMap,现在要修改内容但又不建议使用kubectl edit cm
直接修改怎么办?最蠢的方法是就是删除然后重新创建,已上面提到的config1
例子来说,我要在config.yaml末尾添加一些内容,最终内容如下
config.yaml
name: 琼台博客
country: China
job: Programmer
age: 30
我们现在要把config.yaml的内容更新到ConfigMap中,不能直接kubectl create cm config1 --from-file ./config.yaml
,会报错提示你config1
已存在
node4 ~ # kubectl create cm config1 --from-file ./config.yaml
Error from server (AlreadyExists): configmaps "config1" already exists
我们可以先删除,然后在创建
node4 ~ # kubectl delete cm config1
configmap "config1" deleted
node4 ~ # kubectl create cm config1 --from-file ./config.yaml
configmap/config1 created
node4 ~ # kubectl describe cm config1
Name: config1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
config.yaml:
----
name: 琼台博客
country: China
job: Programmer
age: 30
Events: <none>
如果你觉得先删除后创建两行命令太麻烦,可以利用--dry-run
配合Linux强大的管道符这么干
kubectl create --save-config cm config1 --from-file ./config.yaml -o yaml --dry-run | kubectl apply -f -
如我在config.yaml末尾在添加一行blog: www.qttc.net
,然后使用以上命令更新看看
node4 ~ # kubectl create --save-config cm config1 --from-file ./config.yaml -o yaml --dry-run | kubectl apply -f -
configmap/config1 configured
node4 ~ # kubectl describe cm config1
Name: config1
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"config.yaml":"\nname: 琼台博客\ncountry: China\njob: Programmer\nage: 30\nblog: www.qttc.net\n\n"},"kind":...
Data
====
config.yaml:
----
name: 琼台博客
country: China
job: Programmer
age: 30
blog: www.qttc.net
Events: <none>
内容已经更新到ConfigMap的config1里了,我比较喜欢这种方式去更新我的ConfigMap,即保证了本地文件跟Kubernetes中的内容一致,因为内容来源只有本地文件,在维护时不用担心ConfigMap跟本地文件不同步,同时也不担心Kubernetes挂了所有ConfigMap丢失