Kubernetes认证考试自学系列 | configmap

书籍来源:《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。

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130816538