配置 Pod 使用 ConfigMap

    ConfigMap 概念允许你将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。 例如,你可以下载并运行相同的容器镜像来启动容器, 用于本地开发、系统测试或运行实时终端用户工作负载。

    本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    你需要安装 wget 工具。如果你有不同的工具,例如 curl,而没有 wget, 则需要调整下载示例数据的步骤。

    创建 ConfigMap

    你可以使用 kubectl create configmap 或者在 kustomization.yaml 中的 ConfigMap 生成器来创建 ConfigMap。

    你可以使用 kubectl create configmap 命令基于、 文件或者来创建 ConfigMap:

    其中,<映射名称> 是为 ConfigMap 指定的名称,<数据源> 是要从中提取数据的目录、 文件或者字面值。ConfigMap 对象的名称必须是合法的 DNS 子域名.

    在你基于文件来创建 ConfigMap 时,<数据源> 中的键名默认取自文件的基本名, 而对应的值则默认为文件的内容。

    你可以使用 或者 kubectl get 获取有关 ConfigMap 的信息。

    基于一个目录来创建 ConfigMap

    你可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目录来创建 ConfigMap 时,kubectl 识别目录下文件名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。

    说明:

    用于创建 ConfigMap 的每个文件名必须由可接受的字符组成,即:字母(AZaz)、数字(09)、’-‘、’_‘或’.’。 如果在一个目录中使用 kubectl create configmap,而其中任一文件名包含不可接受的字符, 则 kubectl 命令可能会失败。

    kubectl 命令在遇到不合法的文件名时不会打印错误。

    创建本地目录:

    1. mkdir -p configure-pod-container/configmap/

    现在,下载示例的配置并创建 ConfigMap:

    1. # 将示例文件下载到 `configure-pod-container/configmap/` 目录
    2. wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
    3. wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties
    4. # 创建 ConfigMap
    5. kubectl create configmap game-config --from-file=configure-pod-container/configmap/

    以上命令将 configure-pod-container/configmap 目录下的所有文件,也就是 game.propertiesui.properties 打包到 game-config ConfigMap 中。你可以使用下面的命令显示 ConfigMap 的详细信息:

    1. kubectl describe configmaps game-config

    输出类似以下内容:

    1. Name: game-config
    2. Namespace: default
    3. Labels: <none>
    4. Annotations: <none>
    5. Data
    6. ====
    7. game.properties:
    8. ----
    9. enemies=aliens
    10. lives=3
    11. enemies.cheat=true
    12. enemies.cheat.level=noGoodRotten
    13. secret.code.passphrase=UUDDLRLRBABAS
    14. secret.code.allowed=true
    15. secret.code.lives=30
    16. ui.properties:
    17. ----
    18. color.good=purple
    19. color.bad=yellow
    20. allow.textmode=true
    21. how.nice.to.look=fairlyNice

    configure-pod-container/configmap/ 目录中的 game.propertiesui.properties 文件出现在 ConfigMap 的 data 部分。

    1. kubectl get configmaps game-config -o yaml

    输出类似以下内容:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. creationTimestamp: 2022-02-18T18:52:05Z
    5. name: game-config
    6. namespace: default
    7. resourceVersion: "516"
    8. uid: b4952dc3-d670-11e5-8cd0-68f728db1985
    9. data:
    10. game.properties: |
    11. enemies=aliens
    12. lives=3
    13. enemies.cheat=true
    14. enemies.cheat.level=noGoodRotten
    15. secret.code.passphrase=UUDDLRLRBABAS
    16. secret.code.allowed=true
    17. secret.code.lives=30
    18. ui.properties: |
    19. color.good=purple
    20. color.bad=yellow
    21. allow.textmode=true
    22. how.nice.to.look=fairlyNice

    基于文件创建 ConfigMap

    你可以使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap。

    例如:

    1. kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties

    将产生以下 ConfigMap:

    1. kubectl describe configmaps game-config-2

    输出类似以下内容:

    1. Name: game-config-2
    2. Namespace: default
    3. Labels: <none>
    4. Annotations: <none>
    5. Data
    6. ====
    7. game.properties:
    8. ----
    9. enemies=aliens
    10. lives=3
    11. enemies.cheat=true
    12. enemies.cheat.level=noGoodRotten
    13. secret.code.passphrase=UUDDLRLRBABAS
    14. secret.code.allowed=true
    15. secret.code.lives=30

    你可以多次使用 --from-file 参数,从多个数据源创建 ConfigMap。

    1. kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties

    你可以使用以下命令显示 game-config-2 ConfigMap 的详细信息:

    1. kubectl describe configmaps game-config-2

    输出类似以下内容:

    1. Name: game-config-2
    2. Namespace: default
    3. Labels: <none>
    4. Annotations: <none>
    5. Data
    6. ====
    7. game.properties:
    8. ----
    9. enemies=aliens
    10. lives=3
    11. enemies.cheat=true
    12. enemies.cheat.level=noGoodRotten
    13. secret.code.passphrase=UUDDLRLRBABAS
    14. secret.code.allowed=true
    15. secret.code.lives=30
    16. ui.properties:
    17. ----
    18. color.good=purple
    19. color.bad=yellow
    20. allow.textmode=true
    21. how.nice.to.look=fairlyNice

    使用 --from-env-file 选项基于 env 文件创建 ConfigMap,例如:

    1. # Env 文件包含环境变量列表。其中适用以下语法规则:
    2. # 这些语法规则适用:
    3. # Env 文件中的每一行必须为 VAR=VAL 格式。
    4. # 以#开头的行(即注释)将被忽略。
    5. # 空行将被忽略。
    6. # 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。
    7. # 将示例文件下载到 `configure-pod-container/configmap/` 目录
    8. wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
    9. wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties
    10. # Env 文件 `game-env-file.properties` 如下所示
    11. cat configure-pod-container/configmap/game-env-file.properties
    12. enemies=aliens
    13. lives=3
    14. allowed="true"
    15. # This comment and the empty line above it are ignored
    1. kubectl create configmap game-config-env-file \
    2. --from-env-file=configure-pod-container/configmap/game-env-file.properties

    将产生以下 ConfigMap。查看 ConfigMap:

    1. kubectl get configmap game-config-env-file -o yaml

    输出类似以下内容:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. creationTimestamp: 2019-12-27T18:36:28Z
    5. name: game-config-env-file
    6. namespace: default
    7. resourceVersion: "809965"
    8. uid: d9d1ca5b-eb34-11e7-887b-42010a8002b8
    9. data:
    10. allowed: '"true"'
    11. enemies: aliens
    12. lives: "3"

    从 Kubernetes 1.23 版本开始,kubectl 支持多次指定 --from-env-file 参数来从多个数据源创建 ConfigMap。

    1. kubectl create configmap config-multi-env-files \
    2. --from-env-file=configure-pod-container/configmap/game-env-file.properties \
    3. --from-env-file=configure-pod-container/configmap/ui-env-file.properties

    将产生以下 ConfigMap:

    1. kubectl get configmap config-multi-env-files -o yaml

    输出类似以下内容:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. creationTimestamp: 2019-12-27T18:38:34Z
    4. name: config-multi-env-files
    5. namespace: default
    6. resourceVersion: "810136"
    7. uid: 252c4572-eb35-11e7-887b-42010a8002b8
    8. data:
    9. allowed: '"true"'
    10. color: purple
    11. enemies: aliens
    12. how: fairlyNice
    13. lives: "3"
    14. textmode: "true"

    定义从文件创建 ConfigMap 时要使用的键

    在使用 --from-file 参数时,你可以定义在 ConfigMap 的 data 部分出现键名, 而不是按默认行为使用文件名:

    1. kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径>

    <我的键名> 是你要在 ConfigMap 中使用的键名, 是你想要键所表示的数据源文件的位置。

    例如:

    1. kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties

    将产生以下 ConfigMap:

    1. kubectl get configmaps game-config-3 -o yaml

    输出类似以下内容:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. creationTimestamp: 2022-02-18T18:54:22Z
    5. name: game-config-3
    6. namespace: default
    7. resourceVersion: "530"
    8. uid: 05f8da22-d671-11e5-8cd0-68f728db1985
    9. data:
    10. game-special-key: |
    11. enemies=aliens
    12. lives=3
    13. enemies.cheat=true
    14. enemies.cheat.level=noGoodRotten
    15. secret.code.passphrase=UUDDLRLRBABAS
    16. secret.code.allowed=true
    17. secret.code.lives=30

    根据字面值创建 ConfigMap

    你可以将 kubectl create configmap--from-literal 参数一起使用, 通过命令行定义文字值:

    你可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。

    1. kubectl get configmaps special-config -o yaml

    输出类似以下内容:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. creationTimestamp: 2022-02-18T19:14:38Z
    5. name: special-config
    6. namespace: default
    7. resourceVersion: "651"
    8. uid: dadce046-d673-11e5-8cd0-68f728db1985
    9. data:
    10. special.how: very
    11. special.type: charm

    基于生成器创建 ConfigMap

    基于文件生成 ConfigMap

    例如,要基于 configure-pod-container/configmap/game.properties 文件生成一个 ConfigMap:

    1. # 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
    2. cat <<EOF >./kustomization.yaml
    3. configMapGenerator:
    4. - name: game-config-4
    5. labels:
    6. game-config: config-4
    7. files:
    8. - configure-pod-container/configmap/game.properties
    9. EOF

    应用(Apply)kustomization 目录创建 ConfigMap 对象:

    1. kubectl apply -k .
    1. configmap/game-config-4-m9dm2f92bt created

    你可以像这样检查 ConfigMap 已经被创建:

    1. kubectl get configmap
    1. NAME DATA AGE
    2. game-config-4-m9dm2f92bt 1 37s

    也可以这样:

    1. kubectl describe configmaps/game-config-4-m9dm2f92bt
    1. Name: game-config-4-m9dm2f92bt
    2. Namespace: default
    3. Labels: game-config=config-4
    4. Annotations: kubectl.kubernetes.io/last-applied-configuration:
    5. {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p...
    6. Data
    7. ====
    8. game.properties:
    9. ----
    10. enemies=aliens
    11. lives=3
    12. enemies.cheat=true
    13. enemies.cheat.level=noGoodRotten
    14. secret.code.passphrase=UUDDLRLRBABAS
    15. secret.code.allowed=true
    16. secret.code.lives=30
    17. Events: <none>

    请注意,生成的 ConfigMap 名称具有通过对内容进行散列而附加的后缀, 这样可以确保每次修改内容时都会生成新的 ConfigMap。

    定义从文件生成 ConfigMap 时要使用的键

    在 ConfigMap 生成器中,你可以定义一个非文件名的键名。 例如,从 configure-pod-container/configmap/game.properties 文件生成 ConfigMap, 但使用 game-special-key 作为键名:

    1. # 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
    2. cat <<EOF >./kustomization.yaml
    3. configMapGenerator:
    4. - name: game-config-5
    5. labels:
    6. game-config: config-5
    7. files:
    8. - game-special-key=configure-pod-container/configmap/game.properties
    9. EOF

    应用 Kustomization 目录创建 ConfigMap 对象。

    1. kubectl apply -k .
    1. configmap/game-config-5-m67dt67794 created

    基于字面值生成 ConfigMap

    此示例向你展示如何使用 Kustomize 和 kubectl,基于两个字面键/值对 special.type=charmspecial.how=very 创建一个 ConfigMap。 为了实现这一点,你可以配置 ConfigMap 生成器。 创建(或替换)kustomization.yaml,使其具有以下内容。

    1. ---
    2. # 基于字面创建 ConfigMap 的 kustomization.yaml 内容
    3. configMapGenerator:
    4. - name: special-config-2
    5. literals:
    6. - special.how=very
    7. - special.type=charm
    8. EOF

    应用 Kustomization 目录创建 ConfigMap 对象。

    1. kubectl apply -k .
    1. configmap/special-config-2-c92b5mmcf2 created

    临时清理

    在继续之前,清理你创建的一些 ConfigMap:

    1. kubectl delete configmap special-config
    2. kubectl delete configmap env-config
    3. kubectl delete configmap -l 'game-config in (config-4,config-5)’

    现在你已经学会了定义 ConfigMap,你可以继续下一节,学习如何将这些对象与 Pod 一起使用。


    使用单个 ConfigMap 中的数据定义容器环境变量

    1. 在 ConfigMap 中将环境变量定义为键值对:

      1. kubectl create configmap special-config --from-literal=special.how=very
    2. 将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。

      pods/pod-single-configmap-env-variable.yaml

      1. apiVersion: v1
      2. kind: Pod
      3. metadata:
      4. name: dapi-test-pod
      5. spec:
      6. containers:
      7. - name: test-container
      8. image: registry.k8s.io/busybox
      9. command: [ "/bin/sh", "-c", "env" ]
      10. env:
      11. # 定义环境变量
      12. - name: SPECIAL_LEVEL_KEY
      13. valueFrom:
      14. configMapKeyRef:
      15. # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值
      16. name: special-config
      17. # 指定与取值相关的键名
      18. key: special.how
      19. restartPolicy: Never

      创建 Pod:

      1. kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml

      现在,Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very

    与前面的示例一样,首先创建 ConfigMap。 这是你将使用的清单:

    configmap/configmaps.yaml 配置 Pod 使用 ConfigMap - 图2

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config
    5. namespace: default
    6. data:
    7. special.how: very
    8. ---
    9. apiVersion: v1
    10. kind: ConfigMap
    11. metadata:
    12. name: env-config
    13. namespace: default
    14. data:
    15. log_level: INFO
    • 创建 ConfigMap:

      1. kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml
    • 在 Pod 规约中定义环境变量。

      1. apiVersion: v1
      2. kind: Pod
      3. metadata:
      4. name: dapi-test-pod
      5. spec:
      6. containers:
      7. - name: test-container
      8. image: registry.k8s.io/busybox
      9. command: [ "/bin/sh", "-c", "env" ]
      10. env:
      11. - name: SPECIAL_LEVEL_KEY
      12. valueFrom:
      13. configMapKeyRef:
      14. name: special-config
      15. key: special.how
      16. - name: LOG_LEVEL
      17. valueFrom:
      18. configMapKeyRef:
      19. name: env-config
      20. key: log_level
      21. restartPolicy: Never

      创建 Pod:

      1. kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml

      现在,Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=veryLOG_LEVEL=INFO

      一旦你乐意继续前进,删除该 Pod:

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

    • 使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。

      配置 Pod 使用 ConfigMap - 图5

      1. apiVersion: v1
      2. kind: Pod
      3. metadata:
      4. name: dapi-test-pod
      5. spec:
      6. containers:
      7. - name: test-container
      8. image: registry.k8s.io/busybox
      9. command: [ "/bin/sh", "-c", "env" ]
      10. envFrom:
      11. name: special-config
      12. restartPolicy: Never

      创建 Pod:

      1. kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml

      现在,Pod 的输出包含环境变量 SPECIAL_LEVEL=verySPECIAL_TYPE=charm

      一旦你乐意继续前进,删除该 Pod:

      1. kubectl delete pod dapi-test-pod --now

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

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

    例如,以下 Pod 清单:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: registry.k8s.io/busybox
    9. command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
    10. env:
    11. - name: SPECIAL_LEVEL_KEY
    12. valueFrom:
    13. configMapKeyRef:
    14. name: special-config
    15. key: SPECIAL_LEVEL
    16. - name: SPECIAL_TYPE_KEY
    17. valueFrom:
    18. configMapKeyRef:
    19. name: special-config
    20. key: SPECIAL_TYPE
    21. restartPolicy: Never

    通过运行下面命令创建该 Pod:

    1. kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml

    此 Pod 在 test-container 容器中产生以下输出:

    1. very charm

    一旦你乐意继续前进,删除该 Pod:

    1. kubectl delete pod dapi-test-pod --now

    如基于文件创建 中所述,当你使用 --from-file 创建 ConfigMap 时,文件名成为存储在 ConfigMap 的 data 部分中的键, 文件内容成为键对应的值。

    本节中的示例引用了一个名为 special-config 的 ConfigMap:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: special-config
    5. namespace: default
    6. data:
    7. SPECIAL_LEVEL: very
    8. SPECIAL_TYPE: charm

    创建 ConfigMap:

    1. kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml

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

    在 Pod 规约的 volumes 部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到 volumeMounts.mountPath 所指定的目录 (在本例中为 /etc/config)。 command 部分列出了名称与 ConfigMap 中的键匹配的目录文件。

    配置 Pod 使用 ConfigMap - 图8

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: registry.k8s.io/busybox
    9. command: [ "/bin/sh", "-c", "ls /etc/config/" ]
    10. volumeMounts:
    11. - name: config-volume
    12. mountPath: /etc/config
    13. volumes:
    14. - name: config-volume
    15. configMap:
    16. # 提供包含要添加到容器中的文件的 ConfigMap 的名称
    17. name: special-config
    18. restartPolicy: Never

    创建 Pod:

    1. kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml

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

    1. SPECIAL_LEVEL
    2. SPECIAL_TYPE

    文本数据会展现为 UTF-8 字符编码的文件。如果使用其他字符编码, 可以使用 binaryData(详情参阅 ConfigMap 对象)。

    说明:

    如果该容器镜像的 /etc/config 目录中有一些文件,卷挂载将使该镜像中的这些文件无法访问。

    一旦你乐意继续前进,删除该 Pod:

    1. kubectl delete pod dapi-test-pod --now

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

    使用 path 字段为特定的 ConfigMap 项目指定预期的文件路径。 在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /etc/config/keys 文件中。

    pods/pod-configmap-volume-specific-key.yaml

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: registry.k8s.io/busybox
    9. command: [ "/bin/sh","-c","cat /etc/config/keys" ]
    10. volumeMounts:
    11. - name: config-volume
    12. mountPath: /etc/config
    13. volumes:
    14. - name: config-volume
    15. configMap:
    16. name: special-config
    17. items:
    18. - key: SPECIAL_LEVEL
    19. path: keys
    20. restartPolicy: Never

    创建 Pod:

    1. kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml

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

    1. very

    注意:

    如前,/etc/config/ 目录中所有先前的文件都将被删除。

    删除该 Pod:

    1. kubectl delete pod dapi-test-pod --now

    你可以将指定键名投射到特定目录,也可以逐个文件地设定访问权限。 Secret 指南中为这一语法提供了解释。

    可选引用

    ConfigMap 引用可以被标记为可选。 如果 ConfigMap 不存在,则挂载的卷将为空。 如果 ConfigMap 存在,但引用的键不存在,则挂载点下的路径将不存在。 有关更多信息,请参阅可选 ConfigMap 细节。

    挂载的 ConfigMap 会被自动更新

    当已挂载的 ConfigMap 被更新时,所投射的内容最终也会被更新。 这适用于 Pod 启动后可选引用的 ConfigMap 重新出现的情况。

    Kubelet 在每次定期同步时都会检查所挂载的 ConfigMap 是否是最新的。 然而,它使用其基于 TTL 机制的本地缓存来获取 ConfigMap 的当前值。 因此,从 ConfigMap 更新到新键映射到 Pod 的总延迟可能与 kubelet 同步周期(默认为1分钟)+ kubelet 中 ConfigMap 缓存的 TTL(默认为1分钟)一样长。 你可以通过更新 Pod 的一个注解来触发立即刷新。

    说明:

    使用 ConfigMap 作为 subPath 卷的容器将不会收到 ConfigMap 更新。

    了解 ConfigMap 和 Pod

    ConfigMap API 资源将配置数据存储为键值对。 数据可以在 Pod 中使用,也可以用来提供系统组件(如控制器)的配置。 ConfigMap 与 Secret 类似, 但是提供的是一种处理不含敏感信息的字符串的方法。 用户和系统组件都可以在 ConfigMap 中存储配置数据。

    说明:

    ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap 理解为类似于 Linux /etc 目录及其内容的东西。例如,如果你基于 ConfigMap 创建 ,则 ConfigMap 中的每个数据项都由该数据卷中的某个独立的文件表示。

    ConfigMap 的 data 字段包含配置数据。如下例所示,它可以简单 (如用 --from-literal 的单个属性定义)或复杂 (如用 --from-file 的配置文件或 JSON blob 定义)。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. creationTimestamp: 2016-02-18T19:14:38Z
    5. name: example-config
    6. namespace: default
    7. data:
    8. # 使用 --from-literal 定义的简单属性
    9. example.property.1: hello
    10. example.property.2: world
    11. # 使用 --from-file 定义复杂属性的例子
    12. example.property.file: |-
    13. property.1=value-1
    14. property.2=value-2
    15. property.3=value-3

    kubectl 从非 ASCII 或 UTF-8 编码的输入创建 ConfigMap 时, 该工具将这些输入放入 ConfigMap 的 binaryData 字段,而不是 data 字段。 文本和二进制数据源都可以组合在一个 ConfigMap 中。

    如果你想查看 ConfigMap 中的 binaryData 键(及其值), 可以运行 kubectl get configmap -o jsonpath='{.binaryData}' <name>

    Pod 可以从使用 databinaryData 的 ConfigMap 中加载数据。

    你可以在 Pod 规约中将对 ConfigMap 的引用标记为 可选(optional)。 如果 ConfigMap 不存在,那么它在 Pod 中为其提供数据的配置(例如:环境变量、挂载的卷)将为空。 如果 ConfigMap 存在,但引用的键不存在,那么数据也是空的。

    例如,以下 Pod 规约将 ConfigMap 中的环境变量标记为可选:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: gcr.io/google_containers/busybox
    9. command: ["/bin/sh", "-c", "env"]
    10. env:
    11. - name: SPECIAL_LEVEL_KEY
    12. valueFrom:
    13. configMapKeyRef:
    14. name: a-config
    15. key: akey
    16. optional: true # 将环境变量标记为可选
    17. restartPolicy: Never

    当你运行这个 Pod 并且名称为 a-config 的 ConfigMap 不存在时,输出空值。 当你运行这个 Pod 并且名称为 a-config 的 ConfigMap 存在, 但是在 ConfigMap 中没有名称为 akey 的键时,控制台输出也会为空。 如果你确实在名为 a-config 的 ConfigMap 中为 akey 设置了键值, 那么这个 Pod 会打印该值,然后终止。

    你也可以在 Pod 规约中将 ConfigMap 提供的卷和文件标记为可选。 此时 Kubernetes 将总是为卷创建挂载路径,即使引用的 ConfigMap 或键不存在。 例如,以下 Pod 规约将所引用得 ConfigMap 的卷标记为可选:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: gcr.io/google_containers/busybox
    9. command: ["/bin/sh", "-c", "ls /etc/config"]
    10. volumeMounts:
    11. - name: config-volume
    12. mountPath: /etc/config
    13. volumes:
    14. - name: config-volume
    15. configMap:
    16. name: no-config
    17. optional: true # 将引用的 ConfigMap 的卷标记为可选
    18. restartPolicy: Never

    限制

    • 在 Pod 规约中引用某个 ConfigMap 之前,必须先创建这个对象, 或者在 Pod 规约中将 ConfigMap 标记为 optional(请参阅可选的 ConfigMaps)。 如果所引用的 ConfigMap 不存在,并且没有将应用标记为 optional 则 Pod 将无法启动。 同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 optional

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

      1. kubectl get events

      输出与此类似:

    • ConfigMap 位于确定的中。 每个 ConfigMap 只能被同一名字空间中的 Pod 引用.

    • 你不能将 ConfigMap 用于静态 Pod, 因为 Kubernetes 不支持这种用法。

    清理现场

    删除你创建那些的 ConfigMap 和 Pod:

    1. kubectl delete configmaps/game-config configmaps/game-config-2 configmaps/game-config-3 \
    2. configmaps/game-config-env-file
    3. kubectl delete pod dapi-test-pod --now
    4. # 你可能已经删除了下一组内容
    5. kubectl delete configmaps/special-config configmaps/env-config

    如果你创建了一个目录 并且不再需要它,你也应该删除这个目录, 或者将该目录移动到回收站/删除文件的位置。

    • 浏览 真实示例。