一、ConfigMap
ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。和secret资源类似,不同之处在于,secret资源保存的是敏感信息,而configmap保存的是以明文方式存放的数据。
Secret和ConfigMap
相同点:都是用来保存一些信息数据的,可以被其他资源对象进行挂载使用。并且两个资源对象的创建方法及引用方法一样,都是以键值对的方法进行存储的。
不同点:Secret保存信息数据是以密文的形式保存的,保存一些敏感信息,如数据库的用户名及密码、认证密钥等。ConfigMap是用来保存一些不是太重要的数据的,是以明文形式保存的,当我查看详细信息时,是可以看的保存的数据的。
还有就是Secret与ConfigMap虽然挂载的方式一样,但是编写yaml文件时也存在着区别。注意编写的缩进,与yaml大小写的使用。

二、Volumes挂载和环境变量方式引用资源。
相同点:都是引用资源,能对其数据进行使用。
不同点:Volumes挂载会随着资源对象内保存的数据的更新,而实时更新,不过会等待一段时间后更新。环境变量的方式引用不会实时更新数据,如果想要更新数据只能重新生成Pod。

ConfigMap资源的创建基本与secret资源类似
三、使用四种不同的方式创建ConfigMap资源:

**1)通过 --from-literal(文字的):**
1.[root@master ~]# mkdir configmap  
2.[root@master ~]# cd configmap/  
3.[root@master configmap]# kubectl create configmap lbhconfigmap1 --from-literal=name=lbh --from-literal=age=18  
4.configmap/lbhconfigmap1 created  
5.[root@master configmap]# kubectl get configmaps   
6.NAME            DATA   AGE  
7.lbhconfigmap1   2      12s  

查看详细信息:
1.[root@master configmap]# kubectl describe configmaps lbhconfigmap1   
2.Name:         lbhconfigmap1  
3.Namespace:    default  
4.Labels:         
5.Annotations:    
6.  
7.Data  
8.====  
9.age:  
10.----  
11.18  
12.name:  
13.----  
14.lbh          #可以发现保存的数据是明文的。所以它用来保存一些不重要的数据。
15.Events:    

2)通过 --from-file(文件):一个文件只能保存一个数据。br/>1.[root@master configmap]# echo lbh > name  
2.[root@master configmap]# echo 18 > age  br/>3.[root@master configmap]# kubectl create configmap lbhconfigmap2 --from-file=name --from-file=age   
4.configmap/lbhconfigmap2 created  br/>5.[root@master configmap]# kubectl get configmaps   
6.NAME            DATA   AGE  
7.lbhconfigmap1   2      3m39s  
8.lbhconfigmap2   2      10s  

查看详细信息:br/>1.[root@master configmap]# kubectl describe configmaps lbhconfigmap2   
2.Name:         lbhconfigmap2  
3.Namespace:    default  
4.Labels:         
5.Annotations:    
6.  
7.Data  
8.====  
9.age:  
10.----  
11.18  
12.  
13.name:  
14.----  
15.lbh  
16.  
17.Events:    

**3)通过 --from-env-file:**
1.[root@master configmap]# cat > config-env.txt << EOF  
2.> name=lbh  
3.> age=18  
4.> EOF  
5.[root@master configmap]# kubectl create configmap lbhconfigmap3 --from-env-file=config-env.txt   
6.configmap/lbhconfigmap3 created  
7.[root@master configmap]# kubectl get configmaps   
8.NAME            DATA   AGE  
9.lbhconfigmap1   2      8m2s  
10.lbhconfigmap2   2      4m33s  
11.lbhconfigmap3   2      8s  

查看详细信息:
1.[root@master configmap]# kubectl describe configmaps lbhconfigmap3   
2.Name:         lbhconfigmap3  
3.Namespace:    default  
4.Labels:         
5.Annotations:    
6.  
7.Data  
8.====  
9.age:  
10.----  
11.18  
12.name:  
13.----  
14.lbh  
15.Events:    

4)通过yaml配置文件的方式br/>1.[root@master configmap]# vim lbhconfigmap4.yaml  
2.apiVersion: v1  
3.kind: ConfigMap  
4.metadata:  
5.  name: lbhconfigmap4  
6.data:  
7.  name: lbh  
8.  age: '18'   #这里注意,数字需要单引号,引起来。
9.[root@master configmap]# kubectl apply -f lbhconfigmap4.yaml    #执行yaml文件。br/>10.configmap/lbhconfigmap4 created  
11.[root@master configmap]# kubectl get configmaps   
12.NAME            DATA   AGE  
13.lbhconfigmap1   2      11m  
14.lbhconfigmap2   2      8m16s  
15.lbhconfigmap3   2      3m51s  
16.lbhconfigmap4   2      6s  

查看详细信息:br/>1.[root@master configmap]# kubectl describe configmaps lbhconfigmap4   
2.Name:         lbhconfigmap4  
3.Namespace:    default  
4.Labels:         
5.Annotations:  kubectl.kubernetes.io/last-applied-configuration:  
6.                {"apiVersion":"v1","data":{"age":"18","name":"lbh"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"lbhconfigmap4","namespace":"de...  
7.  
8.Data  
9.====  
10.age:  
11.----  
12.18  
13.name:  
14.----  
15.lbh  
16.Events:    

以voluems和环境变量的方式引用其中一个资源对象。
1)以volume挂载方式引用资源。
1.[root@master configmap]# vim pod1.yaml  
2.apiVersion: v1  
3.kind: Pod  
4.metadata:  
5.  name: pod1  
6.spec:  
7.  containers:  
8.  - name: lbhpod  
9.    image: busybox  
10.    args:  
11.      - /bin/sh  
12.      - -c  
13.      - sleep 300000  
14.    volumeMounts:  
15.    - name: cmp-lbh  
16.      mountPath: "/etc/cmp-lbh"   #挂载到容器内的路径。  
17.      readOnly: true    #只读权限  
18.  volumes:  
19.  - name: cmp-lbh  
20.    configMap:  
21.     name: lbhconfigmap2  
22.[root@master configmap]# kubectl apply -f pod1.yaml   
23.pod/pod1 created  
24.[root@master configmap]# kubectl get pod   
25.NAME   READY   STATUS    RESTARTS   AGE  
26.pod1   1/1     Running   0          7s  
2)以环境变量的方式引用资源:
1.[root@master configmap]# vim pod2.yaml  
2.apiVersion: v1  
3.kind: Pod  
4.metadata:  
5.  name: pod2  
6.spec:  
7.  containers:  
8.  - name: lbhpod  
9.    image: busybox  
10.    args:  
11.      - /bin/sh  
12.      - -c  
13.      - sleep 300000  
14.    env:  
15.      - name: CONFIGMAP_NAME  
16.        valueFrom:  
17.          configMapKeyRef:  
18.            name: lbhconfigmap4  
19.            key: name  
20.      - name: CONFIGMAP_AGE  
21.        valueFrom:  
22.          configMapKeyRef:  
23.            name: lbhconfigmap4  
24.            key: age  
25.[root@master configmap]# kubectl apply -f pod2.yaml   
26.pod/pod2 created  
27.[root@master configmap]# kubectl get pod  
28.NAME   READY   STATUS              RESTARTS   AGE  
29.pod1   1/1     Running   0          2m20s  
30.pod2   1/1     Running   0          10s  

现在将configmap资源内保存的数据进行更新,Pod内的数据是否更新。

1)volumes挂载的方式测试:
查看Pod1的yaml文件,使用的是lbhconfigmap2,修改lbhconfigmap2的数据:
1.[root@master configmap]# kubectl get configmaps lbhconfigmap2 -o yaml              #查看lbhconfigmap2以yaml文件输出。
2.apiVersion: v1  
3.data:  
4.  age: |  
5.    18  
6.  name: |  
7.    lbh  
8.kind: ConfigMap  
9.metadata:  
10.  creationTimestamp: "2020-02-17T09:23:53Z"  
11.  name: lbhconfigmap2  
12.  namespace: default  
13.  resourceVersion: "158563"  
14.  selfLink: /api/v1/namespaces/default/configmaps/lbhconfigmap2  
15.  uid: 41fb7689-51c9-4f20-be70-c6caa6de436b  
16.[root@master configmap]# kubectl edit configmaps lbhconfigmap2   
17.#编辑lbhconfigmap2,并修改文件。
18.apiVersion: v1  
19.data:  
20.  age: |  
21.    18  
22.  name: |  
23.    lisi  
24.kind: ConfigMap  
25.metadata:  
26.[root@master configmap]# kubectl get configmaps lbhconfigmap2 -o yaml  
27.#再次查看,确认修改。
28.apiVersion: v1  
29.data:  
30.  age: |  
31.    18  
32.  name: |  
33.    lisi  
34.kind: ConfigMap  
35.metadata:  
36.  creationTimestamp: "2020-02-17T09:23:53Z"  
37.  name: lbhconfigmap2  
38.  namespace: default  
39.  resourceVersion: "160495"  
40.  selfLink: /api/v1/namespaces/default/configmaps/lbhconfigmap2  
41.  uid: 41fb7689-51c9-4f20-be70-c6caa6de436b  

修改完成后,进入容器,查看数据是否实时更新:
1.[root@master configmap]# kubectl exec -it pod1 /bin/sh  
2./ # cat /etc/cmp-lbh/name   
3.lisi  
数据成功更新。
2)以环境变量的方式测试:
查看pod的yaml文件,使用的是lbhconfigmap4,修改lbhconfigmap4的数据:
1.[root@master configmap]# kubectl get configmaps lbhconfigmap4 -o yaml  
2.apiVersion: v1  
3.data:  
4.  age: "18"  
5.  name: lbh  
6.kind: ConfigMap  
7.[root@master configmap]# kubectl edit configmaps lbhconfigmap4   
8.apiVersion: v1  
9.data:  
10.  age: "18"  
11.  name: lisi  
12.kind: ConfigMap  
13.[root@master configmap]# kubectl get configmaps lbhconfigmap4 -o yaml  
14.apiVersion: v1  
15.data:  
16.  age: "18"  
17.  name: lisi  
18.kind: ConfigMap  

数据成功修改,进入容器,查看数据是否修改:
1.[root@master configmap]# kubectl exec -it pod2 /bin/sh  
2./ # echo $CONFIGMAP_NAME  
3.lbh  

数据并没有更新。
总结:secret和configmap资源相同,如果引用资源数据的应用,要求会随着资源对象内保存的数据的更新,而实时更新,那么应该使用volumes挂载的方式引用资源。因为用环境变量的方式引用不会实时更新数据。