配置 Pod 使用 ConfigMap

ConfigMap 允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。 本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

创建 ConfigMap

你可以使用 kubectl create configmap 或者在 kustomization.yaml 中的 ConfigMap 生成器 来创建 ConfigMap。注意,kubectl 从 1.14 版本开始支持 kustomization.yaml

使用 kubectl create configmap 创建 ConfigMap

你可以使用 kubectl create configmap 命令基于 目录文件 或者字面值来创建 ConfigMap:

  1. kubectl create configmap <map-name> <data-source>

其中, 是要设置的 ConfigMap 名称, 是要从中提取数据的目录、 文件或者字面值。 ConfigMap 对象的名称必须是合法的 DNS 子域名.

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

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

基于目录创建 ConfigMap

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

例如:

  1. # 创建本地目录
  2. mkdir -p configure-pod-container/configmap/
  3. # 将实例文件下载到 `configure-pod-container/configmap/` 目录
  4. wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
  5. wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties
  6. # 创建 configmap
  7. 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: 2016-02-18T18:52:05Z
  5. name: game-config
  6. namespace: default
  7. resourceVersion: "516"
  8. selfLink: /api/v1/namespaces/default/configmaps/game-config
  9. uid: b4952dc3-d670-11e5-8cd0-68f728db1985
  10. data:
  11. game.properties: |
  12. enemies=aliens
  13. lives=3
  14. enemies.cheat=true
  15. enemies.cheat.level=noGoodRotten
  16. secret.code.passphrase=UUDDLRLRBABAS
  17. secret.code.allowed=true
  18. secret.code.lives=30
  19. ui.properties: |
  20. color.good=purple
  21. color.bad=yellow
  22. allow.textmode=true
  23. 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 选项从环境文件创建 ConfigMap,例如:

Env 文件包含环境变量列表。 其中适用以下语法规则:

  • Env 文件中的每一行必须为 VAR=VAL 格式。
  • 以#开头的行(即注释)将被忽略。
  • 空行将被忽略。
  • 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。

将示例文件下载到 configure-pod-container/configmap/ 目录

  1. wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties

env 文件 game-env-file.properties 如下所示:

  1. cat configure-pod-container/configmap/game-env-file.properties
  1. enemies=aliens
  2. lives=3
  3. allowed="true"
  1. kubectl create configmap game-config-env-file \
  2. --from-env-file=configure-pod-container/configmap/game-env-file.properties

将产生以下 ConfigMap:

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

输出类似以下内容:

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

注意: 当多次使用 --from-env-file 来从多个数据源创建 ConfigMap 时,仅仅最后一个 env 文件有效。

下面是一个多次使用 --from-env-file 参数的示例:

  1. # 将样本文件下载到 `configure-pod-container/configmap/` 目录
  2. wget https://k8s.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties
  3. # 创建 configmap
  4. kubectl create configmap config-multi-env-files \
  5. --from-env-file=configure-pod-container/configmap/game-env-file.properties \
  6. --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. metadata:
  4. creationTimestamp: 2017-12-27T18:38:34Z
  5. name: config-multi-env-files
  6. namespace: default
  7. resourceVersion: "810136"
  8. selfLink: /api/v1/namespaces/default/configmaps/config-multi-env-files
  9. uid: 252c4572-eb35-11e7-887b-42010a8002b8
  10. data:
  11. color: purple
  12. how: fairlyNice
  13. textmode: "true"

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

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

  1. kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>

<my-key-name> 是你要在 ConfigMap 中使用的键名,<path-to-file> 是你想要键表示数据源文件的位置。

例如:

  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: 2016-02-18T18:54:22Z
  5. name: game-config-3
  6. namespace: default
  7. resourceVersion: "530"
  8. selfLink: /api/v1/namespaces/default/configmaps/game-config-3
  9. uid: 05f8da22-d671-11e5-8cd0-68f728db1985
  10. data:
  11. game-special-key: |
  12. enemies=aliens
  13. lives=3
  14. enemies.cheat=true
  15. enemies.cheat.level=noGoodRotten
  16. secret.code.passphrase=UUDDLRLRBABAS
  17. secret.code.allowed=true
  18. secret.code.lives=30

根据字面值创建 ConfigMap

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

  1. kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

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

  1. kubectl get configmaps special-config -o yaml

输出类似以下内容:

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

基于生成器创建 ConfigMap

自 1.14 开始,kubectl 开始支持 kustomization.yaml。 你还可以基于生成器创建 ConfigMap,然后将其应用于 API 服务器上创建对象。 生成器应在目录内的 kustomization.yaml 中指定。

基于文件生成 ConfigMap

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

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

使用 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
  3. kubectl describe configmaps/game-config-4-m9dm2f92bt
  4. Name: game-config-4-m9dm2f92bt
  5. Namespace: default
  6. Labels: <none>
  7. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  8. {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p...
  9. Data
  10. ====
  11. game.properties:
  12. ----
  13. enemies=aliens
  14. lives=3
  15. enemies.cheat=true
  16. enemies.cheat.level=noGoodRotten
  17. secret.code.passphrase=UUDDLRLRBABAS
  18. secret.code.allowed=true
  19. secret.code.lives=30
  20. 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. files:
  6. - game-special-key=configure-pod-container/configmap/kubectl/game.properties
  7. EOF

使用 Kustomization 目录创建 ConfigMap 对象。

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

从字面值生成 ConfigMap

要基于字符串 special.type=charmspecial.how=very 生成 ConfigMap, 可以在 kusotmization.yaml 中配置 ConfigMap 生成器:

  1. # 创建带有 ConfigMapGenerator 的 kustomization.yaml 文件
  2. cat <<EOF >./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 数据定义容器环境变量

使用单个 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 配置 Pod 使用 ConfigMap - 图1

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: k8s.gcr.io/busybox
    9. command: [ "/bin/sh", "-c", "env" ]
    10. env:
    11. # Define the environment variable
    12. - name: SPECIAL_LEVEL_KEY
    13. valueFrom:
    14. configMapKeyRef:
    15. # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
    16. name: special-config
    17. # Specify the key associated with the value
    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。

    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 规范中定义环境变量。

    pods/pod-multiple-configmap-env-variable.yaml 配置 Pod 使用 ConfigMap - 图3

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: dapi-test-pod
    5. spec:
    6. containers:
    7. - name: test-container
    8. image: k8s.gcr.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

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

说明: Kubernetes v1.6 和更高版本支持此功能。

  • 创建一个包含多个键值对的 ConfigMap。

    configmap/configmap-multikeys.yaml 配置 Pod 使用 ConfigMap - 图4

    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
  • 使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。

    pods/pod-configmap-envFrom.yaml 配置 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: k8s.gcr.io/busybox
    9. command: [ "/bin/sh", "-c", "env" ]
    10. envFrom:
    11. - configMapRef:
    12. name: special-config
    13. restartPolicy: Never

    创建 Pod:

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

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

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

你可以使用 $(VAR_NAME) Kubernetes 替换语法在 Pod 规约的 command 部分中使用 ConfigMap 定义的环境变量。

例如,以下 Pod 规范

pods/pod-configmap-env-var-valueFrom.yaml 配置 Pod 使用 ConfigMap - 图6

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: dapi-test-pod
  5. spec:
  6. containers:
  7. - name: test-container
  8. image: k8s.gcr.io/busybox
  9. command: [ "/bin/sh", "-c", "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

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

  1. very charm

将 ConfigMap 数据添加到一个卷中

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

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

configmap/configmap-multikeys.yaml 配置 Pod 使用 ConfigMap - 图7

  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 中的 special.level

pods/pod-configmap-volume.yaml 配置 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: k8s.gcr.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. # Provide the name of the ConfigMap containing the files you want
  17. # to add to the container
  18. name: special-config
  19. 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

注意: 如果在 /etc/config/ 目录中有一些文件,它们将被删除。

说明: 文本数据会使用 UTF-8 字符编码的形式展现为文件。如果使用其他字符编码, 可以使用 binaryData

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

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

pods/pod-configmap-volume-specific-key.yaml 配置 Pod 使用 ConfigMap - 图9

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: dapi-test-pod
  5. spec:
  6. containers:
  7. - name: test-container
  8. image: k8s.gcr.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/ 目录中所有先前的文件都将被删除。

映射键以指定路径和文件权限

你可以通过指定键名到特定目录的投射关系,也可以逐个文件地设定访问权限。 Secret 用户指南 中对这一语法提供了解释。

挂载的 ConfigMap 将自动更新

更新已经在数据卷中使用的 ConfigMap 时,已映射的键最终也会被更新。 kubelet 在每次定期同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能与 kubelet 同步周期 + ConfigMap 在 kubelet 中缓存的 TTL 一样长。

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

了解 ConfigMap 和 Pod

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

说明: ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap 理解为类似于 Linux /etc 目录及其内容的东西。例如,如果你从 ConfigMap 创建 Kubernetes 卷,则 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

限制

  • 在 Pod 规范中引用之前,必须先创建一个 ConfigMap(除非将 ConfigMap 标记为”可选”)。 如果引用的 ConfigMap 不存在,则 Pod 将不会启动。同样,引用 ConfigMap 中不存在的键也会阻止 Pod 启动。

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

    1. kubectl get events

    输出与此类似:

    1. LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE
    2. 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 位于特定的名字空间 中。每个 ConfigMap 只能被同一名字空间中的 Pod 引用.

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

接下来