Hot For Coding
Kubernetes如何修改从文件创建的ConfigMap内容

Grumpy Cat

在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: Nicholas Lee
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: Nicholas Lee
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: Nicholas Lee
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: Nicholas Lee
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: Nicholas Lee\ncountry: China\njob: Programmer\nage: 30\nblog: www.qttc.net\n\n"},"kind":...

Data
====
config.yaml:
----

name: Nicholas Lee
country: China
job: Programmer
age: 30
blog: www.qttc.net


Events:  <none>

内容已经更新到ConfigMap的config1里了,我比较喜欢这种方式去更新我的ConfigMap,即保证了本地文件跟Kubernetes中的内容一致,因为内容来源只有本地文件,在维护时不用担心ConfigMap跟本地文件不同步,同时也不担心Kubernetes挂了所有ConfigMap丢失

TITLE: Kubernetes如何修改从文件创建的ConfigMap内容

LINK: https://www.qttc.net/503_how_change_exist_configmap_on_kubernetes.html

NOTE: 转载内容请注明出处