一、介绍
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。
创建ConfigMap的方式有4种:
通过直接在命令行中指定configmap参数创建,即--from-literal
通过指定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件>
通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>
事先写好标准的configmap的yaml文件,然后kubectl create -f 创建
二、命令行创建ConfigMap
1、通过键值对创建configmap
创建:kubectl create configmap literal-config --from-literal=key1=hello --from-literal=key2=world
查看:kubectl describe configmap literal-config
2、通过文件的方式
$ echo hello > test1.txt
$ ehco world > test2.txt
$ kubectl create configmap my-config --from-file=key1=test1.txt --from-file=key2=test2.txt
之后查看configmap:kubectl describe configmap my-config
看到该configmap中有两个键值对,key1:hello 和 key2:world。
总结:通过文件创建其实就是将文件的内容作为value。本质上和第一种方式一致,但是性能会低一些,毕竟涉及到读取文件
2、
三、yaml创建ConfigMap
#config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
key1: hello
key2: world
创建:kubectl create -f config.yaml
查看:kubectl describe configmap my-config
四、ConfigMap使用
Pod的使用方式:
1. 将ConfigMap中的数据设置为容器的环境变量
2. 将ConfigMap中的数据设置为命令行参数
3. 使用Volume将ConfigMap作为文件或目录挂载
4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
配置到容器的环境变量
# test-pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod-configmap
spec:
containers:
- name: test-busybox
image: busybox
imagePullPolicy: IfNotPresent
args:
- sleep
- "86400"
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: my-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: my-config
设置为命令行参数
# test-pod-configmap-cmd
apiVersion: v1
kind: Pod
metadata:
name: test-pod-configmap-cmd
spec:
containers:
- name: test-busybox
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: my-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: my-config
key: key2
创建pod,该pod成功启动后会输出环境变量KEY1和KEY2的值
$ kubectl create -f test-pod-configmap-cmd.yaml
将configmap挂载到容器中
# test-pod-projected-configmap-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod-projected-configmap-volume
spec:
containers:
- name: test-pod-busybox
image: busybox
imagePullPolicy: IfNotPresent
args:
- sleep
- "86400"
volumeMounts:
- name: config-volume
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: config-volume
projected:
sources:
- configMap:
name: my-config
创建pod:kubectl create -f test-pod-projected-configmap-volume.yaml
进入容器:kubectl exec -it test-pod-projected-configmap-volume -- /bin/sh
查看挂在到容器中的文件内容
通过volume挂载和环境变量的区别:
通过Volume挂载到容器内部时,当该configmap的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。
参考: