K8S 数据卷volumes之ConfigMap
ConfigMap介绍ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。ConfigMap创建通过命令行创建configmap可以
·
文章目录
一、ConfigMap介绍
ConfigMap是一种比较特殊的存储卷,它的主要作用是以键值对的形式来存储配置信息的。
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。
二、ConfigMap创建
(一)通过命令行创建configmap
可以使用 kubectl create configmap 从文件、目录或者 key-value 字符串创建等创建 ConfigMap
1. 通过文件创建configmap
用法:
# 创建,configmap简写为cm
# 第一种是将文件名作为键,文件内容作为值
kubectl create cm configmap名 --from-file=文件名 --from-file=文件名 ... -n namespace
# 第二种,不以文件名作为键,自定义键
kubectl create cm configmap名 --from-file=键值1=文件名 --from-file=键值2=文件名 ... -n namespace
# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
kubectl delete cm --all -n namespace # 删除所有cm
【例 】
[root@k8s-master ~]# echo admin > file1
[root@k8s-master ~]# echo 12345 > file2
# 第一种是将文件名作为键,文件内容作为值
[root@k8s-master ~]# kubectl create configmap my-cm1 --from-file=file1 --from-file=file2
configmap/my-cm1 created
[root@k8s-master ~]# kubectl describe cm my-cm1
Name: my-cm1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
file1:
----
admin
file2:
----
12345
Events: <none>
# 两个键值对,file1:admin 和 file2:12345 ,文件名作为键,文件内容作为值
# 第二种,不以文件名作为键,自定义键
# 创建
[root@k8s-master ~]# kubectl create configmap my-cm2 --from-file=user=file1 --from-file=password=file2
configmap/my-cm2 created
# 查看
[root@k8s-master ~]# kubectl get cm
NAME DATA AGE
my-cm1 2 30s
my-cm2 2 8s
[root@k8s-master ~]# kubectl describe cm my-cm2
Name: my-cm2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
password:
----
12345
user:
----
admin
Events: <none>
# 两个键值对,password:12345 和 user:admin
2. 通过文件夹创建configmap
用法:
# 创建
kubectl create cm cm名 --from-file=目录名 -n namespace
# 该目录下的每个文件被定义为一个键值对,其中文件名作为键,文件内容作为值
# 查看
kuebctl get cm cm名 -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
【例 】
[root@k8s-master ~]# mkdir cm-test
[root@k8s-master ~]# echo zhangsan > cm-test/sname
[root@k8s-master ~]# echo male > cm-test/sage
[root@k8s-master ~]# kubectl create cm dir-cm --from-file=cm-test/
configmap/dir-cm created
[root@k8s-master ~]# kubectl get cm
NAME DATA AGE
dir-cm 2 5s
my-cm 2 13m
[root@k8s-master ~]# kubectl describe cm dir-cm
Name: dir-cm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
sage:
----
male
sname:
----
zhangsan
Events: <none>
# 两个键值对 sage:male 和 sname:zhangsan,每个文件对应一个键值对,其中文件名作为键,文件内容作为值
3. 命令行声明键值对创建configmap
用法:
# 创建
kubectl create cm cm名 --from-literal=键1=值1 --from-literal=键2=值2 ... -n namespace
# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
【例 】
[root@k8s-master ~]# kubectl create cm literal-cm --from-literal=key1=hello --from-literal=key2=world
configmap/literal-cm created
[root@k8s-master ~]# kubectl describe cm literal-cm
Name: literal-cm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
key1:
----
hello
key2:
----
world
Events: <none>
(二)通过资源清单文件创建configmap
用法:
# 资源清单文件
apiVersion: v1
kind: ConfigMap
metadata:
name:
namespace:
data:
key1: value1
key2: value2
...
# 下面是嵌套写法
data:
key1:
key2:value2
key3:value2
...
# 创建
kubectl create -f 资源清单文件
kubectl apply -f 资源清单文件
# 查看
kubectl describe cm cm名 -n namespace
kubectl describe -f 资源清单文件
# 删除
kubectl delete cm cm名 -n namespace
kubectl delete -f 资源清单文件
【例 】
[root@k8s-master ~]# vim mycm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mycm
namespace: test
data:
key1: hello
key2: world
# 创建
[root@k8s-master ~]# kubectl create -f mycm.yaml
configmap/mycm created
# 查看
[root@k8s-master ~]# kubectl describe cm mycm -n test
Name: mycm
Namespace: test
Labels: <none>
Annotations: <none>
Data
====
key1:
----
hello
key2:
----
world
Events: <none>
# 删除
[root@k8s-master ~]# kubectl delete -f mycm.yaml
configmap "mycm" deleted
# 嵌套使用
[root@k8s-master ~]# vim mycm2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mycm2
namespace: test
data:
zhangsan:
sno:1001
sage:20
ssex:male
yangyin:
sno:1002
sage:21
ssex:female
# 创建
[root@k8s-master ~]# kubectl create -f mycm2.yaml
configmap/mycm2 created
# 查看
[root@k8s-master ~]# kubectl describe -f mycm2.yaml
Name: mycm2
Namespace: test
Labels: <none>
Annotations: <none>
Data
====
yangyin:
----
sno:1002 sage:21 ssex:female
zhangsan:
----
sno:1001 sage:20 ssex:male
Events: <none>
三、ConfigMap的使用
1. 将ConfigMap中的数据设置为容器的环境变量
[root@k8s-master ~]# vim mycm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mycm
namespace: test
data:
mycm1: hello
mycm2: world
# 创建
[root@k8s-master ~]# kubectl create -f mycm.yaml
configmap/mycm created
# 查看
[root@k8s-master ~]# kubectl describe cm mycm -n test
Name: mycm
Namespace: test
Labels: <none>
Annotations: <none>
Data
====
mycm1:
----
hello
mycm2:
----
world
Events: <none>
# 在容器中使用定义的configmap
[root@k8s-master ~]# vim pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap
namespace: test
spec:
containers:
- name: test-busybox
image: busybox:1.30.1
imagePullPolicy: IfNotPresent
args:
- sleep
- "86400"
env:
- name: KEY1 # 环境变量名
valueFrom:
configMapKeyRef:
name: mycm # 定义好的cm
key: mycm1 # cm中的键
- name: KEY2
valueFrom:
configMapKeyRef:
name: mycm
key: mycm2
# 创建
[root@k8s-master ~]# kubectl create -f pod-configmap.yaml
pod/pod-configmap created
# 查看
[root@k8s-master ~]# kubectl get pod pod-configmap -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-configmap 1/1 Running 0 43s 10.244.2.220 k8s-node02 <none> <none>
# 进入容器验证环境变量
[root@k8s-master ~]# kubectl exec -it pod-configmap -n test -- sh
/ # env
KEY1=hello
KEY2=world
……省略……
/ # echo $KEY1
hello
/ # echo $KEY2
world
/ # exit
2. 使用Volume将ConfigMap作为文件或目录挂载
[root@k8s-master ~]# vim pod-volume-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-configmap
namespace: test
spec:
containers:
- name: busybox
image: busybox:1.30.1
imagePullPolicy: IfNotPresent
args:
- sleep
- "86400"
volumeMounts:
- name: config-volume
mountPath: "/my-configmap"
volumes:
- name: config-volume
configMap:
name: mycm
# 创建
[root@k8s-master ~]# kubectl create -f pod-volume-configmap.yaml
pod/pod-volume-configmap created
# 查看
[root@k8s-master ~]# kubectl get pod pod-volume-configmap -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-volume-configmap 1/1 Running 0 4s 10.244.2.221 k8s-node02 <none> <none>
# 验证挂载情况
[root@k8s-master ~]# kubectl exec -it pod-volume-configmap -n test -- sh
/ # cd /my-configmap
/my-configmap # ls
mycm1 mycm2
/my-configmap # ls -l
total 0
lrwxrwxrwx 1 root root 12 Jun 5 10:12 mycm1 -> ..data/mycm1
lrwxrwxrwx 1 root root 12 Jun 5 10:12 mycm2 -> ..data/mycm2
/my-configmap # cat mycm1
hello
/my-configmap # cat mycm2
world
#可以看到映射已经成功,configmap中的每个键都映射成了一个文件,value映射成为文件的内容
#key--->文件 value---->文件中的内容
#此时如果更新configmap的内容,容器中的值也会动态更新
# 修改configmap中的值,在容器内的挂载目录下的文件会同步更新
[root@k8s-master ~]# kubectl edit cm mycm -n test
# mycm1: hello 修改为 mycm1: hi
configmap/mycm edited
# 查看修改是否生效
[root@k8s-master ~]# kubectl describe cm mycm -n test
Name: mycm
Namespace: test
Labels: <none>
Annotations: <none>
Data
====
mycm2:
----
world
mycm1:
----
hi
Events: <none>
# 查看容器内是否同步更新过来
[root@k8s-master ~]# kubectl exec -it pod-volume-configmap -n test -- sh
/ # cd /my-configmap
/my-configmap # cat mycm1
hi
/my-configmap # cat mycm2
world
# 删除
[root@k8s-master ~]# kubectl delete -f mycm
mycm2.yaml mycm.yaml
[root@k8s-master ~]# kubectl delete -f mycm.yaml
configmap "mycm" deleted
通过volume挂载和环境变量的区别:
通过Volume挂载到容器内部时,当该configmap的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。
注意:
- ConfigMap必须在Pod使用它之前创建
- 使用envFrom时,将会自动忽略无效的键
- Pod只能使用同一个命名空间的ConfigMap
更多推荐
已为社区贡献4条内容
所有评论(0)