一、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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐