这是我参与更文挑战的第9天,活动详情查看: 更文挑战
ConfigMap
ConfigMap是k8s集群中一个单独的资源,用来存储键值对形式的配置信息。通过将业务代码和配置信息隔离开来,可以减少容器的复杂度,同时让容器能动态部署到不同环境(开发,测试,生产),以及在不影响容器运行下进行配置的热更新。
但是因为ConfigMap中的数据都是用明文存储,不应该存放密码等私密信息。私密信息可以通过下一节要学习的Secret来进行存储
工作原理
1、首先,需要准备多个不同ConfigMap,这里是一个环境一份
2、然后,根据需要,将合适环境的ConfigMap加入到k8s集群中
3、最后,pod中的容器去ConfigMap中检索需要的内容
生成ConfigMap
这里分两种情况来看。如果是类似nginx.conf这种大篇的配置信息文件,考虑用文件或者文件夹去生成ConfigMap,方便后期维护,这时ConfigMap的key是文件名,value是文件内容;如果只是三两个环境变量,考虑用yaml文件或者直接命令行生成ConfigMap,简单快捷,这时ConfigMap是键值对和yaml文件或者命令行中的一致。
这里将这两种方式都演示一下。
根据文件或者文件夹生成ConfigMap
创建如下两个文件
[root@k8s-master Configs]# ll
total 8
-rw-r--r--. 1 root root 30 May 10 10:42 file-1
-rw-r--r--. 1 root root 30 May 10 10:42 file-2
[root@k8s-master Configs]# cat file-1
config1=value1
config2=value2
[root@k8s-master Configs]# cat file-2
config3=value3
config4=value4
复制代码
然后通过下面的命令根据单个文件或者文件夹生成ConfigMap
kubectl create configmap NAME --from-file=xxx
复制代码
之后就可以去查看ConfigMap的具体信息了,可以用describe命令
[root@k8s-master Configs]# kubectl describe cm test-cm-2
Name: test-cm-2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
file-1:
----
config1=value1
config2=value2
file-2:
----
config3=value3
config4=value4
Events: <none>
复制代码
可以看到data字段下声明了ConfigMap中存储的信息,key是文件名,value是文件的内容
根据yaml文件或命令行生成ConfigMap
上面我们将ConfigMap信息用yaml格式展示出来,也可以用相同的格式去自定义自己的yaml文件。
创建yaml文件test-configmap.yaml如下
apiVersion: v1
kind: ConfigMap
metadata:
name: test-cm-3
data:
database: mongodb
database_uri: mongodb://localhost:27017
keys: |
image.public.key=771
rsa.public.key=42
复制代码
创建出新的ConfigMap
[root@k8s-master Configs]# vim test-configmap.yaml
[root@k8s-master Configs]# kubectl apply -f test-configmap.yaml
configmap/test-cm-3 created
[root@k8s-master Configs]# kubectl describe cm test-cm-3
Name: test-cm-3
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"database":"mongodb","database_uri":"mongodb://localhost:27017","keys":"image.public.key=771\nrsa.public.key=42...
Data
====
database:
----
mongodb
database_uri:
----
mongodb://localhost:27017
keys:
----
image.public.key=771
rsa.public.key=42
Events: <none>
复制代码
也可以直接用下面的命令行格式去直接生成ConfigMap中的键值对
kubectl create configmap NAME --from-literal=KEY=VALUE --from-literal=KEY=VALUE
复制代码
例如
[root@k8s-master Configs]# kubectl create configmap test-cm-4 --from-literal=name=xiaofu --from-literal=password=123456
configmap/test-cm-4 created
[root@k8s-master Configs]# kubectl get cm
NAME DATA AGE
test-cm-1 1 19m
test-cm-2 2 18m
test-cm-3 3 6m13s
test-cm-4 2 10s
复制代码