一、ConfigMap资源概述

        ConfigMap资源,简称CM资源,它生成的键值对数据,存储在ETCD数据库中;

        应用场景:主要是对应用程序的配置;

        pod通过env变量引入ConfigMap,或者通过数据卷挂载volume的方式引入ConfigMap资源;

二、查看k8s集群系统中都有哪些资源类型

[root@k8s231 pod]# kubectl api-resources 

三、ConfigMap资源管理

1,创建工作目录

[root@k8s231 pod]# mkdir /xinjizhiwa/configmap
[root@k8s231 pod]# cd /xinjizhiwa/configmap

2,创建ConfigMap资源

· 声明式创建ConfigMap资源

1,编辑ConfigMap资源清单

[root@k8s231 configmap]# vim 01-cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm01
#声明cm资源的数据
data:
  #第一种写法【key:value】
  xinjizhiwa: "HELLO WORLD"
  k8s: "1.23.17"

  #第二种写法【key:| value value value。。。】
  my.cnf: |
    [mysqld]
    datadir=/xinjizhiwa/data
    basedir=/usr/bin/mysqld/bin/
    socket=/tmp/mysql.socket
    skip-name-resolve=1
    port=3306
    [client]
    username=admin
    password=1

2,创建ConfigMap资源

[root@k8s231 configmap]# kubectl apply -f 01-cm.yaml 
configmap/cm01 created

查看ConfigMap资源

[root@k8s231 configmap]# kubectl get cm cm01 
NAME   DATA   AGE
cm01   3      28s

· 响应式创建ConfigMap资源

        命令行创建ConfigMap资源;

[root@k8s231 configmap]# kubectl create cm cm001 --from-literal=xinjizhiwa=k8s12317 --from-literal=k8s=kubernetes
configmap/cm001 created

查看cm资源

[root@k8s231 configmap]# kubectl get cm cm001 -o wide 
NAME    DATA   AGE
cm001   2      10s

指定文件方式创建cm资源

1,编辑一个文件

[root@k8s231 configmap]# cat > 1.txt <<EOF
> 11111111111111
> 222222222222
> 3333333333333
> 4444444444444
> 5555555555555
> 666666666666
> EOF

2,指定文件创建cm资源

[root@k8s231 configmap]# kubectl create cm cm002 --from-file=1.txt=1.txt
configmap/cm002 created

3,查看cm资源

[root@k8s231 configmap]# kubectl get cm cm002 -o wide 
NAME    DATA   AGE
cm002   1      22s

3,查看cm资源的详细信息

[root@k8s231 configmap]# kubectl describe cm cm002
Name:         cm002
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
1.txt:
----
11111111111111
222222222222
3333333333333
4444444444444
5555555555555
666666666666

...

4,删除cm资源

[root@k8s231 configmap]# kubectl delete cm --all
configmap "cm001" deleted
configmap "cm002" deleted
configmap "cm01" deleted
configmap "kube-root-ca.crt" deleted

四、pod引入CM资源

        pod引入cm资源的方式,有两种,env变量引入和volume挂载卷引入;

1,创建cm资源

[root@k8s231 configmap]# cat 01-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm01
#声明cm资源的数据
data:
  #第一种写法【key:value】
  xinjizhiwa: "HELLO WORLD"
  k8s: "1.23.17"
  
  #第二种写法【key:| value value value。。。】
  my.cnf: |
    [mysqld]
    datadir=/xinjizhiwa/data
    basedir=/usr/bin/mysqld/bin/
    socket=/tmp/mysql.socket
    skip-name-resolve=1
    port=3306
    [client]
    username=admin
    password=1

[root@k8s231 configmap]# kubectl apply -f 01-cm.yaml

2,创建pod资源,env变量引入cm

[root@k8s231 configmap]# cat pod-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: m1
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    env:
    #引入一个变量
    - name: env-cm01
      #从其他位置引入变量
      valueFrom:
        #声明从ConfigMap中引入变量
        configMapKeyRef:
          #引入变量ConfigMap的名称
          name: cm01
          #引用ConfigMap中的哪个key?
          key: xinjizhiwa
    #引入第二个变量
    - name: env-cm02
      valueFrom:
        configMapKeyRef:
          name: cm01
          #引用ConfigMap中的哪个key?
          key: my.cnf

进入容器查看变量是否引入成功

[root@k8s231 configmap]# kubectl exec m1 -it -- sh
/ # env
env-cm01=HELLO WORLD
env-cm02=[mysqld]
datadir=/xinjizhiwa/data
basedir=/usr/bin/mysqld/bin/
socket=/tmp/mysql.socket
skip-name-resolve=1
port=3306
[client]
username=admin
password=1

3,创建pod资源,volume挂载卷引入cm

· 编辑pod资源清单

[root@k8s231 configmap]# vim pod-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m1
spec:
  #声明pod存储卷
  volumes:
  - name: vol-cm
    #声明挂载cm资源
    configMap:
      #指定cm组员名称
      name: cm01
      #如果不写items,则引用cm资源中全部的key:value作为文件挂载
      items:
      #cm资源的key是什么
      - key: xinjizhiwa
        #key的value值挂载到容器中变成文件内容,文件名叫什么?
        path: xinjizhiwa.txt
      - key: my.cnf
        path: my.cnf


  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: vol-cm
      mountPath: /k8s

[root@k8s231 configmap]# kubectl apply -f pod-env.yaml 
pod/m1 created

· 进入pod容器查看是否挂载成功,变成文件

[root@k8s231 configmap]# kubectl exec m1 -it -- sh
/ # ls
bin                   etc                   media                 root                  sys
dev                   home                  mnt                   run                   tmp
docker-entrypoint.d   k8s                   opt                   sbin                  usr
docker-entrypoint.sh  lib                   proc                  srv                   var
/ # ls -l k8s
total 0
lrwxrwxrwx    1 root     root            13 Feb  7 11:26 my.cnf -> ..data/my.cnf
lrwxrwxrwx    1 root     root            21 Feb  7 11:26 xinjizhiwa.txt -> ..data/xinjizhiwa.txt
/ # cd k8s/
/k8s # ls
my.cnf          xinjizhiwa.txt
/k8s # cat my.cnf 
[mysqld]
datadir=/xinjizhiwa/data
basedir=/usr/bin/mysqld/bin/
socket=/tmp/mysql.socket
skip-name-resolve=1
port=3306
[client]
username=admin
password=1
/k8s # cat xinjizhiwa.txt 
HELLO WORLD/k8s # 

拓展:当pod挂载cm资源到容器的目录后,若容器的原目录中有文件,则会被清空,那么如何做到,及把cm资源挂载成为文件到容器的指定目录,又能保证容器原目录中的文件不清空呐?

[root@k8s231 configmap]# cat pod-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: m1
spec:
  #声明pod存储卷
  volumes:
  - name: vol-cm
    #声明挂载cm资源
    configMap:
      #指定cm组员名称
      name: cm01
      #如果不写items,则引用cm资源中全部的key:value作为文件挂载
      items:
      #cm资源的key是什么
      - key: xinjizhiwa
        #key的value值挂载到容器中变成文件内容,文件名叫什么?
        path: xinjizhiwa.txt
      - key: my.cnf
        path: my.cnf


  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: vol-cm
      mountPath: /k8s
      #如果subPath不指定任何值(默认),则默认容器挂载路径为空,表示清空挂载点;
      #如果subPath指定名称和cm的Path相同,表示仅仅挂载这个文件,不清空挂在的目录保留原本容器路径的文件;
      #也就是说volumes>>configMap>items>path只有与subPath的值相等时,才是挂载文件;否则就是挂载目录;会清空目录; 
      subPath: my.cnf
      #resdOnly: true #只读设置;表示不允许容器内编辑或删除这个文件;

至此,configmap资源结束;

Logo

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

更多推荐