configmap详解

ConfigMap详解

官方文档:

配置 Pod 使用 ConfigMap | Kubernetes

一.configMap简介

ConfigMap是一种API对象,用来将非加密数据保存到键值对中,如etcd中。

可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap可以将 环境变量 配置信息和容器镜像解耦,便于应用配置的修改。

如果需要存储加密信息时可以使用Secret对象。

二.创建ConfigMap

1.创建方式:

可以使用 kubectl create configmap 命令基于目录文件或者键值对来创建 ConfigMap

  • 基于键值对创建ConfigMap, 即命令行指定ConfigMap参数,使用 --from-liternal
  • 基于指定文件创建,即将一个配置文件创建为一个ConfigMap, 使用--from-file=<file>
  • 基于指定目录创建,即将一个目录下所有配置文件创建为一个ConfigMap,使用 --from-file=<Directory>
  • 基于指定写好的ConfigMap资源的yaml文件,使用 kubectl create -f 创建

2.基于键值对创建

--from-literal指定键值对内容,可以有多个--from-literal

语法:

kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

示例:

kubectl create configmap cm-test --from-literal=METHOD=chacha20 --from-literal=PASSWORD=password

查看 configmap中 data 内容

kubectl get configmap cm-test -o yaml

---
apiVersion: v1
data:
  METHOD: chacha20
  PASSWORD: password
kind: ConfigMap
metadata:
  creationTimestamp: "2022-05-27T08:20:37Z"
  name: cm-test
  namespace: default
  resourceVersion: "151475"
  uid: a9868ca7-a5ef-43f2-9dba-4c04ebf026a8

3.基于指定文件创建

使用 --from-file=<file> 从文件中创建

可以指定key的名称,不指定默认key为文件名

语法:

kubectl create configmap NAME --from-file=[key1]=file1 --from-file=[key2]=file2

示例:

kubectl create configmap testfile-cm --from-file=/root/test1 --from-file=/root/test2

查看 configmap中 data 内容

kubectl get configmap/testfile-cm -o yaml

---
apiVersion: v1
data:
  test1: |
    configmap test file1
  test2: |
    configmap test file2
kind: ConfigMap
metadata:
  creationTimestamp: "2022-05-27T08:55:07Z"
  name: testfile-cm
  namespace: default
  resourceVersion: "152734"
  uid: 71fff6b4-0aad-4298-827f-dc13d99a1bd5

4.基于指定目录创建

通过--from-file=<Dir> 参数从目录中进行创建

该目录下的每个配置文件名称都被设置为key,文件的内容被设置为value

语法:

kubectl create configmap NAME  --from-file=config-files-Directory

示例:

kubectl create configmap testdir-cm --from-file=/root/cm-dir

查看 configmap中 data 内容

kubectl get configmap/testdir-cm -o yaml

---
apiVersion: v1
data:
  test1: |
    configmap test file1
  test2: |
    configmap test file2
  test3: |
    configmap test file3
kind: ConfigMap
metadata:
  creationTimestamp: "2022-05-27T09:01:54Z"
  name: testdir-cm
  namespace: default
  resourceVersion: "152979"
  uid: 5f93d676-59c7-4af2-bdcm-906735fb2229

5.基于yaml文件创建

创建configmap资源类型的yaml文件,然后使用 kubectl apply -f 创建 configmap

yaml文件示例:

vi cm-test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-test
data:
  key1: value1
  key2: value2

执行 kubectl create 创建

kubectl create -f cm-test.yaml

三.使用ConfigMap

容器应用对ConfigMap的使用有以下两种方法:

  • 通过环境变量获取ConfigMap
  • 通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录

1.容器环境变量中使用ConfigMap

使用 env.valueFrom.configMapkeyRef 中的name和key进行获值

需要说明的是,环境变量的名称受POSIX命名规范([a-zA-Z_][a-zA-Z0-9_]*)约束,不能以数字开头。

如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来描述环境变量无法生成,但不会阻止Pod的启动

1.1 基于yaml文件 创建 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-test
data:
  cm-key1: cm-value1
  cm-key2: cm-value2

1.2 在Pod中通过环境变量获取ConfigMap

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    # env打印环境变量,使用grep过滤以Custom相关的变量
    command: [ "/bin/sh","-c","env | grep Custom" ]
    env:
      - name: Custom_Key1
        valueFrom:
          configMapKeyRef:
            name: cm-test
            key: cm-key1

      - name: Custom_key2
        valueFrom:
          configMapKeyRef:
            name: cm-test
            key: cm-key2

查看日志

kubectl logs cm-test-pod

---
Custom_Key1=cm-value1
Custom_key2=cm-value2

1.3将 ConfigMap 中的所有键值对配置为容器环境变量

从 Kubernetes v1.6版本开始,引入一个新的字段 envFrom , 实现在Pod环境内将ConfigMap(也可用于Secret资源对象)中所定义的 key=value 自动生成环境变量

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    command: [ "/bin/sh","-c","env" ]
    envFrom:
    - configMapRef:
        name: cm-test
  restartPolicy: Never

查看日志

kubectl logs cm-test-pod|grep cm

---
HOSTNAME=cm-test-pod
cm-key1=cm-value1
cm-key2=cm-value2

1.4 在 Pod 命令中使用 ConfigMap 定义的环境变量

可以使用 $(VAR_NAME)语法 替换在容器的 commandargs 属性中使用 ConfigMap 定义的环境变量。

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
    - name: cm-test
      image: busybox
      command: [ "/bin/echo", "$(Custom_Key1) $(Custom_Key2)" ]
      env:
        - name: Custom_Key1
          valueFrom:
            configMapKeyRef:
              name: cm-test
              key: cm-key1
        - name: Custom_Key2
          valueFrom:
            configMapKeyRef:
              name: cm-test
              key: cm-key2
  restartPolicy: Never

查看日志

kubectl logs cm-test-pod

---
cm-value1 cm-value2

2.存储卷(volume)中使用ConfigMap

在 Pod 的配置文件里的 volumes 段添加 ConfigMap 的名字。

这会将 ConfigMap 数据添加到 volumeMounts.mountPath 指定的目录里面(在这个例子里是 /etc/config)。

以configmap中定义的key作为文件名存到config下,value作为文件内容

2.1 使用存储在 ConfigMap 中的数据填充卷

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
    - name: cm-test
      image: busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # 提供包含要添加到容器中的文件的 ConfigMap 的名称
        name: cm-test
  restartPolicy: Never

Pod 运行时,命令 ls /etc/config/ 产生下面的输出:为 key名字

kubectl logs cm-test-pod

---
cm-key1
cm-key2

Caution: 如果在 /etc/config/ 目录中有一些文件,这些文件将被删除。

2.2 将 ConfigMap 数据添加到卷中的特定路径

使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径。

在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /etc/config/keys 文件中

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
    - name: cm-test
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/keys" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: cm-test
        items:
        - key: cm-key1
          path: keys
  restartPolicy: Never

当 Pod 运行时,命令 cat /etc/config/keys 产生以下输出:

kubectl logs cm-test-pod

---
# cm-key1 对应的 valume值
cm-value1

2.3 映射键到指定路径并设置文件访问权限

可以将指定键名投射到特定目录,也可以逐个文件地设定访问权限。

Secret 用户指南 中为这一语法提供了解释

2.4 可选的引用

ConfigMap 引用可以被标记为 “optional(可选的)”。

如果所引用的 ConfigMap 不存在, 则所挂载的卷将会是空的。如果所引用的 ConfigMap 确实存在,但是所引用的主键不存在, 则在挂载点下对应的路径也会不存在。

2.5 挂载的 ConfigMap 将自动更新

当某个已被挂载的 ConfigMap 被更新,所投射的内容最终也会被更新。

对于 Pod 已经启动之后所引用的、可选的 ConfigMap 才出现的情形, 这一动态更新现象也是适用的。

kubelet 在每次周期性同步时都会检查已挂载的 ConfigMap 是否是最新的。

但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。

因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能与 kubelet 同步周期(默认 1 分钟) + ConfigMap 在 kubelet 中缓存的 TTL (默认 1 分钟)一样长。

你可以通过更新 Pod 的某个注解来触发立即更新。

Note: 使用 ConfigMap 作为 subPath 的数据卷将不会收到 ConfigMap 更新。

四.使用ConfigMap的限制

限制条件如下:

  • ConfigMap必须在Pod之前创建(除非把 ConfigMap 标志成”optional”)。如果引用了一个不存在的 ConfigMap, 那这个Pod是无法启动的。就像引用了不存在的 Key 会导致 Pod 无法启动一样。

  • 如果使用 envFrom 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 Pod 可以被启动,但无效名称将被记录在事件日志中(InvalidVariableNames)。 日志消息列出了每个被跳过的键。例如:

    kubectl get events
    
    ---
    LASTSEEN FIRSTSEEN COUNT NAME          KIND  SUBOBJECT  TYPE      REASON                            SOURCE                MESSAGE
    0s       0s        1     dapi-test-pod Pod              Warning   InvalidEnvironmentVariableNames   {
          
          kubelet, 127.0.0.1}  Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names.
    
  • ConfigMap受Namespace限制,只有处于相同的Namespace中的Pod可以引用它;

  • kubelet值支持可以被API Server管理的Pod使用ConfigMap。kubelet在当前Node上通过 --manifest-url--config 自动创建的静态Pod将无法引用ConfigMap;

  • 在Pod对ConfigMap进行挂载(volumeMount)操作是,容器内部只能挂载为目录,无法挂载为文件

  • 在挂载到容器内部后,目录中将包含ConfigMap定义的每个item,如果该目录下原理还有其他文件,则容器内的该目录会被挂载的ConfigMap覆盖

猜你喜欢

转载自blog.csdn.net/wq1205750492/article/details/125008082