CKA备考实验 | configmap

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客


configmap(简称为cm)的作用和secret一样,其主要作用是可以存储密码或者是往pod里传递文件。configmap也是以键值对的方式存储数据,格式为:键=值。

configmap可以用多种方式来创建。secret和configmap的主要区别在于,secret里的值使用了base64进行编码,而configmap是不需要的。

查看现有configmap。

##########实操验证##########
[root@vms10 secret]# kubectl get configmaps
NAME               DATA   AGE
kube-root-ca.crt   1      24h
[root@vms10 secret]#

创建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-literal=xx=tom --from-literal=yy=redhat
configmap/my1 created
[root@vms10 secret]#

步骤2:查看已经创建的my1。

##########实操验证##########
[root@vms10 secret]# kubectl get configmaps
NAME               DATA   AGE
kube-root-ca.crt   1      24h
my1                2      19s
[root@vms10 secret]# kubectl describe configmaps my1
Name:         my1
Namespace:    nssec
Labels:       <none>
Annotations:  <none>

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/hosts --from-file=/etc/issue
configmap/my2 created
[root@vms10 secret]#

步骤2:查看现有的configmap。

##########实操验证##########
[root@vms10 secret]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      24h
my1                2      4m56s
my2                2      29s
[root@vms10 secret]#

步骤3:查看my2的内容。

##########实操验证##########
[root@vms10 secret]# kubectl describe cm my2
Name:         my2
Namespace:    nssec
Labels:       <none>
Annotations:  <none>

Data
====
hosts:
----
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.110   vms10.rhce.cc          vms10
192.168.1.111   vms11.rhce.cc          vms11
192.168.1.112   vms12.rhce.cc          vms12

issue:
----
\S
Kernel \r on an \m


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.1.110   vms10.rhce.cc          vms10
    192.168.1.111   vms11.rhce.cc          vms11
    192.168.1.112   vms12.rhce.cc          vms12
  issue: |+
    \S
    Kernel \r on an \m

kind: ConfigMap
metadata:
  creationTimestamp: "2023-05-31T08:09:09Z"
  name: my2
  namespace: nssec
  resourceVersion: "52543"
  selfLink: /api/v1/namespaces/nssec/configmaps/my2
  uid: 480f5cd1-1dcf-4a52-9220-e06bacd09775
[root@vms10 secret]#

从上面可以看到两个键hosts和issue,以及它们对应的值,还可以通过如下命令分别获取其key的值。

##########实操验证##########
[root@vms10 secret]# kubectl get cm my2 -o jsonpath='{.data.hosts}'
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.110   vms10.rhce.cc          vms10
192.168.1.111   vms11.rhce.cc          vms11
192.168.1.112   vms12.rhce.cc          vms12
[root@vms10 secret]# kubectl get cm my2 -o jsonpath='{.data.issue}'
\S
Kernel \r on an \m

[root@vms10 secret]#

这种把文件创建为configmap的方式和secret类似,主要用于给pod传递文件。

使用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 apply -f pod3.yaml 
pod/pod3 created
[root@vms10 secret]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod3   1/1     Running   0          5s
[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.1.110   vms10.rhce.cc          vms10
192.168.1.111   vms11.rhce.cc          vms11
192.168.1.112   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:
  - image: 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]#

此yaml文件用于创建一个MySQL的pod,在创建容器时需要指定一个变量MYSQL_ROOT_PASSWORD(用env下的name指定),这个变量的值并没有直接用value写出来,而是用valueFrom从其他地方引用过来。这里通过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             NODE            NOMINATED NODE   READINESS GATES
pod4   1/1     Running   0          58s   10.244.81.96   vms11.rhce.cc   <none>           <none>
[root@vms10 secret]#

步骤4:登录验证。

##########实操验证##########
[root@vms10 secret]# mysql -uroot -predhat -h10.244.81.96
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

删除此pod。

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/131473724
今日推荐