前言:
    PV和PVC解决了pod间共享目录的挂载,有时候,我们只期望挂载pod内部的配置文件,以便于在pod外部对pod的配置进行修改,PV和PVC就搞不定了,新的机制来满足上述需求,这就是ConfigMap。

    第1章 ConfigMap概述
    1.1 什么是ConfigMap?
    为了让Docker镜像和Docker镜像运行时的配置文件解耦,以便实现镜像的可移植性和可复用性,进入了ConfigMap。

    ConfigMap是用来存储集群中的Pod所需要的配置文件信息的kubernetes资源对象。Map是键值对的映射,是一种字典。

    ConfigMap所管辖的配置信息是非加密的非安全性要求的数据。

    image.png

    通过configmpa,多个pods对象可以在集群内部共享相同的配置文件。
    image.png

    1.2 配置信息真正的保存地方
    ConfigMap只是用来在集群内部,在Pod外部,描述配置信息的对资源对象,本身并不存放配置信息。所有的配置内容实际上都存储在K8S系统中的etcd,并通过ConfigMap这个对象实现pod之间,pod与pod外部共享配置信息。
    image.png

    1.3 配置信息保存格式
    存放在etcd中的配置文件信息,是按照键值对的方式存储的,如IP:value; port:value等。

    1.4 创建ConfigMap对象的4种方式
    (1)通过指定命令行参数创建,即—from-literal

    (2)通过指定特定文件创建,即将一个配置文件创建为一个ConfigMap—from-file=<文件>

    (3)通过指定特定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,—from-file=<目录>

    (4)事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

    第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径
    2.1 通过命令行参数—from-literal创建
    $ kubectl create configmap config-map1 —from-literal=db.host=10.5.10.116 —from-literal=db.port=’3306’

    $ kubectl get configmap

    # 以yaml 格式输出config map的内容
    $ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
    $ cat config-map1.yaml
    [root@k8s-master1 ~]# cat config-map1.yaml
    apiVersion: v1
    data: # 配置文件的名称data
    db.host: 10.5.10.116 # 配置文件的内容
    db.port: “3306” # 配置文件的内容
    kind: ConfigMap
    metadata:
    creationTimestamp: “2022-02-10T06:23:49Z”
    name: config-map1 # configmap对象的名称
    namespace: default
    resourceVersion: “72089”
    uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84
    因此,configmap的内容以字典的形式存在的:

    configmap对象的名称:name: config-map1

    配置文件的名称:无

    配置文件的内容:

    db.host: 10.5.10.116
    db.port: “3306”

    2.2 根据键值对文件创建(非configmap文件)
    (1)生成属性文件

    touch app.properties
    vi app.properties

    propertie1 = 1
    propertie2 = 2
    propertie3 = 3
    (2)根据属性文件生成configmap对象

    kubectl create configmap config-map2 —from-file=./app.properties —from-file=./app.params
    —from-file=./app.properties : 指定配置文件名
    (3)展现configmap对象的内容

    [root@k8s-master1 ~]# kubectl get configmap config-map2 -o yaml
    apiVersion: v1
    data:
    app.properties: | # 配置文件的名称
    propertie1 = 1 # 配置文件的内容
    propertie2 = 2 # 配置文件的内容
    propertie3 = 3 # 配置文件的内容
    kind: ConfigMap
    metadata:
    creationTimestamp: “2022-02-10T06:35:55Z”
    name: config-map2 # configmap对象的名称
    namespace: default
    resourceVersion: “73035”
    uid: 8d773265-b04f-4017-ace4-c557c1c517fd
    configmap对象的名称:name: config-map2

    配置文件的名称:app.properties,一个configmap可以包含多个配置文件

    配置文件的内容:

    1. propertie1 = 1 # 配置文件的内容<br /> propertie2 = 2 # 配置文件的内容<br /> propertie3 = 3 # 配置文件的内容

    2.3 根据多个键值对文件创建(一个configmap支持多个配置文件)
    (1)生成多个配置文件

    touch app.properties1
    vi app.properties1

    propertie1 = 1
    propertie2 = 2
    propertie3 = 3



    touch app.properties2
    vi app.properties2

    propertie1 = 4
    propertie2 = 5
    propertie3 = 6
    (2)根据多个配置文件生成configmap对象

    kubectl create configmap config-map3 —from-file=./app.properties1 —from-file=./app.properties2
    —from-file=./app.properties : 指定配置文件名

    (3)展现configmap对象的内容

    2.4 根据键值对文件所在文件目录(目录中可能有多个文件)
    方法基本同2.2, 不同的是:—from-file参数指定的是键值对文件所在的目录,而是是文件本身。

    $ mkdir config

    $ kubectl create configmap config-map2 —from-file=./config/
    [root@k8s-master1 ~]# kubectl get configmap config-map3 -o yaml
    apiVersion: v1
    data:
    app.properties1: |
    propertie1 = 1
    propertie2 = 2
    propertie3 = 3
    app.properties2: |
    propertie1 = 4
    propertie2 = 5
    propertie3 = 6
    kind: ConfigMap
    metadata:
    creationTimestamp: “2022-02-10T09:14:46Z”
    name: config-map3
    namespace: default
    resourceVersion: “85423”
    uid: f0b24171-b45a-460f-8fd8-d11a343d2699
    app.properties1: 配置文件1

    app.properties2: 配置文件2

    通过items来指定configmap中的多个不同的文件名。

    2.5 根据configmap.yaml文件生成
    这是最标准的方法。

    kubectl create configmap config-map1 —from-file=./config-map1.yaml
    # 以yaml 格式输出config map的内容
    $ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
    $ cat config-map1.yaml

    [root@k8s-master1 ~]# cat config-map1.yaml
    apiVersion: v1
    data:
    db.host: 10.5.10.116
    db.port: “3306”
    kind: ConfigMap
    metadata:
    creationTimestamp: “2022-02-10T06:23:49Z”
    name: config-map1
    namespace: default
    resourceVersion: “72089”
    uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84
    configmap对象的名称:name: config-map1

    配置文件的名称:无

    配置文件的内容:

    db.host: 10.5.10.116
    db.port: “3306”

    第3章 创建pod,关联ConfigMap对象
    创建ConfigMap对象后,把配置文件的内容存放在K8S的etcd档案库中,并且通过ConfigMap对象就可以访问键值对的配置文件的值,而不是需要通过文件路径名访问。

    前一章创建了configmap对象以及相关的内容,有三种使用configmap中键值对配置的方式。

    第一种是通过环境变量的方式,直接传递给pod
    使用configmap中指定的key
    使用configmap中所有的key
    第二种是通过在pod的命令行下运行的方式(启动命令中)
    第三种是作为volume的方式挂载到pod内。
    3.1 通过环境变量使用
    3.2 通过在pod的命令行下运行的方式(启动命令中)
    3.3 作为volume的方式挂载到pod内。
    image.png

    (1)configmap的内容解读

    configmap对象的名称:name: config-map1

    配置文件的名称:redis-conf, 一个configmap可以包含多个配置文件名。

    配置文件的内容:

    appendonly=yes

    (2)pod的mount映射解读

    第1个mount
    本地的路径:mountpath=data

    远程的volume:data

        data即不是NFS, 也不是configmap,而是空目录
    

    第2个mount
    本地的路径:mountpath=redis-master

    远程的volume:config

        config对象的类型是K8S的configmap,而不是NFS, 也不是本地目录
    
        config对应的configmap的对象名为redis-conf
    
                items: 指定redis-master目录应该包含configmap中哪些配置文件。
    
                        key:redis-conf =》指定configmap中一个配置文件名。
    
                        path:redis-conf =》 指定configmap中的配置文件名,mount后的文件名。
    

    至此,第2个mount为的映射结果为:redis-master/redis-conf

    如果有多个配置文件需要映射到redis-master/目录中,则至少有两个步骤要改进

    首先,configmap中有多个配置文件,至少有两个配置文件。

    然后,在items再增加新的key和path。

    3.4 配置命令详解

    $ vi cm-redis.conf

    appendonly = yes
    $ kubectl create configmap cm-redis-conf —from-file=./cm-redis.conf


    [root@k8s-master1 ~]# kubectl get configmap cm-redis-conf -o yaml
    apiVersion: v1
    data:
    cm-redis.conf: |+
    appendonly yes

    kind: ConfigMap
    metadata:
    creationTimestamp: “2022-02-10T16:44:40Z”
    name: cm-redis-conf
    $ touch redis-pod-cm.yaml

    apiVersion: v1
    kind: Pod
    metadata:
    name: my-redis-pod
    spec:
    containers:
    - name: my-redis-container
    image: kubernetes/redis:v1
    env:
    - name: MASTER
    value: “true”
    ports:
    - containerPort: 6379
    resources:
    limits:
    cpu: “0.1”
    volumeMounts:
    - mountPath: /redis-master-data
    name: data
    - mountPath: /redis-master
    name: config
    volumes:
    - name: data
    emptyDir: {}
    - name: config
    configMap:
    name: cm-redis-conf
    items:
    - key: cm-redis.conf
    path: redis.conf
    $ kubectl apply -f redis-pod-cm.yaml


    $ kubectl get pod


    $ kubectl exec -it my-redis-pod — /bin/sh


    [root@k8s-master1 ~]# kubectl exec -it my-redis-pod — /bin/sh
    # cd /redis-master-data
    # ls

    # cd /redis-master
    # ls
    redis.conf

    # cat redis.conf
    appendonly yes

    原文链接:https://blog.csdn.net/HiWangWenBing/article/details/122856681