[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap相关的知识,希望对你有一定的参考价值。

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681


目录

前言:

第1章 ConfigMap概述

1.1 什么是ConfigMap?

1.2 配置信息真正的保存地方

1.3 配置信息保存格式

1.4 创建ConfigMap对象的4种方式

第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径

2.1 通过命令行参数--from-literal创建

2.2 根据键值对文件创建(非configmap文件)

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

2.4 根据键值对文件所在文件目录(目录中可能有多个文件)

2.5 根据configmap.yaml文件生成

第3章 创建pod,关联ConfigMap对象

3.1 通过环境变量使用

3.2 通过在pod的命令行下运行的方式(启动命令中)

3.3 作为volume的方式挂载到pod内。


前言:

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

第1章 ConfigMap概述

1.1 什么是ConfigMap?

为了让Docker镜像和Docker镜像运行时的配置文件解耦,以便实现镜像的可移植性和可复用性,进入了ConfigMap。

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

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

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

1.2 配置信息真正的保存地方

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

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可以包含多个配置文件

配置文件的内容:

    propertie1 = 1     # 配置文件的内容
    propertie2 = 2     # 配置文件的内容
    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内。

(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

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681

以上是关于[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据

[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务

[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC

[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)

[云原生专题-33]:K8S - 核心概念 - 服务Service管理服务发现负载均衡

[云原生专题-32]:K8S - 核心概念 - 工作负载资源之Depolyment(无状态应用)的概念与常见操作命令