书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes认证考试自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客
configmap(简称为cm)的作用和secret一样,其主要作用是可以存储密码或者是往pod里传递文件。configmap也是以键值对的方式存储数据,格式为:键=值。
configmap可以用多种方式来创建。secret和configmap的主要区别在于,secret里的值使用了base64进行编码,而configmap是不需要的。
7.2.1 创建configmap
创建configmap的方法也很多,可以直接指定key和value,也可以把一个文件的内容作为value,还可以直接写yaml文件。
方法1:命令行的方式
kubectl create cm 名字 --from-literal=k1=v1 --from-literal=k2=v2 ...
这里k1的值为v1,k2的值为v2,如果而要多个变量,就写多个--from-literal。
下面创建一个名字为my1的configmap,里画有两个变量:xx和yy,它们的值分别是tom和redhat。
步骤1:创建cm。
[root@vms10 secret]# kubectl create configmap my1 --from-litral=xx=tom --from-literal=yy=redhat
configmap/my1 created
[root@vms10 secret]#
步骤2:查看已经创建的my1。
[root@vms10 secret]# kubectl get configmaps
NAME DATA AGE
my1 2 26s
[root@vms10 secret]# kubectl describe configmaps my1
Name: my1
... 输出 ...
Data
====
xx:
----
tom
yy:
----
redhat
Events: <none>
[root@vms10 secret]
这里在Data里可以直接看到,xx的值为tom,yy的值为redhat。
方法2:创建文件的方式
也可以把一个文件创建为configmap,此文件的文件名为key,文件的内容为value,如果要把一个文件创建为configmap的话,用的命令如下。
kubectl create configmap my2 --from-file=file1
如果configmap里需要包括多个file的话,就写多个--from-file。
这种创建configmap的作用是,把一个文件的内容写入configmap里,后面通过卷的方式来引用这个configmap,就可以把此文件写入pod里了。
下面把/etc/hosts和/etc/issue这两个文件创建到my2里。
步骤1:创建configmap。
[root@vms10 secret]# kubectl create configmap my2 --from-file=/etc/host --from-file=/etc/issue
configmap/my2 created
[root@vms10 secret]#
步骤2:查看现有的configmap。
[root@vms10 secret]# kubectl get cm
NAME DATA AGE
my1 2 17m
my2 2 63s
[root@vms10 secret]#
步骤3:查看my2的内容。
[root@vms10 secret]# kubectl describe cm my2
... 输出 ...
Data
====
hosts:
----
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.10 vms10.rhce.cc vms10
192.168.26.11 vms11.rhce.cc vms11
192.168.26.12 vms12.rhce.cc vms12
issue:
----
\S
Kernel \r on an \m
192.168.26.10
Events: <none>
[root@vms10 secret]#
或者:
[root@vms10 secret]# kubectl get cm my2 -o yaml
apiVersion: v1
data:
hosts:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.10 vms10.rhce.cc vms10
192.168.26.11 vms11.rhce.cc vms11
192.168.26.12 vms12.rhce.cc vms12
issue: |
\S
Kernel \r on an \m
192.168.26.10
... 输出 ...
[root@vms10 secret]#
从上面可以看到两个键hosts和issue,以及它们对应的值,还可以通过如下命令分别获取其key的值。
kubectl get cm my2 -o jsonpath='{.data.hosts}'
kubectl get cm my2 -o jsonpath='{.data.issue}'
这种把文件创建为configmap的方式和secret类似,主要用于给pod传递文件。
7.2.2 使用configmap
使用configmap有两种方式,分别是以卷的方式和以变量的方式。
方法1:以卷的方式
这种用法和secret一致。这里是在pod里创建一个类型为configmap的卷,然后把它挂载到容器指定的目录里,容器创建好之后,会在容器的挂载目录里创建一个文件,此文件的文件名为configmap里的key,文件的内容为对应key的value。
步骤1:创建pod的yaml文件。
[root@vms10 secret]# cat pod3.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod3
name: pod3
spec:
volumes:
- name: xx
configMap:
name: my2
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod3
resources: {}
volumeMounts:
- name: xx
mountPath: "/etc/test"
[root@vms10 secret]#
在这个pod里创建一个名字为xx、类型为configmap的卷,关联到configmap my2上,在创建的容器里挂载卷xx到目录/etc/test,此时容器的/etc/test里有两个文件:hosts和issue,它们的值分别是/etc/hosts和/etc/issue的内容。
步骤2:创建pod。
[root@vms10 secret]# kubectl appy -f pod3.yaml
pod/pod3 created
[root@vms10 secret]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod3 1/1 Running 0 2s
[root@vms10 secret]#
步骤3:到pod里查询是否把cm指定的文件写入目录。
[root@vms10 secret]# kubectl exec pod3 -- ls /etc/test
hosts
issue
[root@vms10 secret]#
步骤4:查看某一文件的内容。
[root@vms10 secret]# kubectl exec pod3 -- cat /etc/test/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.10 vms10.rhce.cc vms10
192.168.26.11 vms11.rhce.cc vms11
192.168.26.12 vms12.rhce.cc vms12
[root@vms10 secret]#
删除此pod。
类似的,configmap里有多个文件,但是只想挂载一个文件的话,则使用subPath。
方法2:以变量的方式
跟介绍secret部分时所讲的通过变量的方式引用一样,只是这里的关键字由secretKeyRef变成了configMapKeyRef。
步骤1:创建pod的yaml文件。
[root@vms10 secret]# cat pod4.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod4
name: pod4
spec:
containers:
- iamge: hub.c.163.com/library/mysql:latest
imagePullPolicy: IfNotPresent
name: pod4
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name:my1
key:yy
[root@vms10 secret]#
这里通过configMapKeyRef里的name引用my1,然后通过key引用my1里的yy这个键,整体的意思就是,MYSQL_ROOT_PASSWORD的值使用的是my1里yy这个键对应的值(为redhat)。
步骤2:创建pod。
[root@vms10 secret]# kubectl apply -f pod4.yaml
pod/pod4 created
[root@vms10 secret]#
步骤3:获取此pod的IP。
[root@vms10 secret]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP ...
pod4 1/1 Running 0 9s 10.244.3.41 ...
[root@vms10 secret]#
步骤4:登录验证。
[root@vms10 secret]# mysql -uroot -predhat -h10.244.3.41
Welcome to the MariaDB monitor. Commands end with ; or \g.
...
MySQL [(none)]>
删除此pod。