×

理解 ConfigMap

许多应用程序需要使用配置文件、命令行参数和环境变量的某种组合进行配置。在 OpenShift Dedicated 中,这些配置工件与镜像内容分离,以保持容器化应用程序的可移植性。

ConfigMap 对象提供了一种机制,可以在容器中注入配置数据,同时保持容器与 OpenShift Dedicated 的无关性。ConfigMap 可用于存储细粒度信息(如单个属性)或粗粒度信息(如整个配置文件或 JSON 块)。

ConfigMap 对象保存可以被 Pod 使用的配置数据的键值对,或者用于存储系统组件(如控制器)的配置数据。例如:

ConfigMap 对象定义
kind: ConfigMap
apiVersion: v1
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: example-config
  namespace: my-namespace
data: (1)
  example.property.1: hello
  example.property.2: world
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3
binaryData:
  bar: L3Jvb3QvMTAw (2)
1 包含配置数据。
2 指向包含非 UTF-8 数据的文件,例如二进制 Java 密钥库文件。以 Base64 形式输入文件数据。

当您从二进制文件(例如图像)创建 ConfigMap 时,可以使用 `binaryData` 字段。

可以在 Pod 中通过多种方式使用配置数据。ConfigMap 可用于:

  • 填充容器中的环境变量值

  • 在容器中设置命令行参数

  • 填充卷中的配置文件

用户和系统组件可以在 ConfigMap 中存储配置数据。

配置映射类似于密钥,但设计上更方便地支持处理不包含敏感信息 的字符串。

配置映射限制

必须先创建配置映射,然后才能在其 Pod 中使用其内容。

可以编写控制器来容忍缺少配置数据。请逐个案例咨询使用配置映射配置的各个组件。

ConfigMap 对象位于项目中。

它们只能被同一项目中的 Pod 引用。

Kubelet 仅支持对其从 API 服务器获取的 Pod 使用配置映射。

这包括使用 CLI 创建的任何 Pod,或间接由复制控制器创建的任何 Pod。这并不包括使用 OpenShift Dedicated 节点的 --manifest-url 标志、其 --config 标志或其 REST API 创建的 Pod,因为这些不是创建 Pod 的常用方法。

在 OpenShift Dedicated Web 控制台中创建配置映射

您可以在 OpenShift Dedicated Web 控制台中创建配置映射。

步骤
  • 要作为集群管理员创建配置映射

    1. 在管理员视角中,选择 工作负载配置映射

    2. 在页面右上角,选择创建配置映射

    3. 输入配置映射的内容。

    4. 选择创建

  • 要作为开发者创建配置映射

    1. 在开发者视角中,选择 配置映射

    2. 在页面右上角,选择创建配置映射

    3. 输入配置映射的内容。

    4. 选择创建

使用 CLI 创建配置映射

您可以使用以下命令从目录、特定文件或字面值创建配置映射。

步骤
  • 创建配置映射

    $ oc create configmap <configmap_name> [options]

从目录创建配置映射

您可以使用 --from-file 标志从目录创建配置映射。此方法允许您使用目录中的多个文件来创建配置映射。

目录中的每个文件都用于填充配置映射中的一个键,其中键的名称是文件名,键的值是文件的内容。

例如,以下命令使用 example-files 目录的内容创建一个配置映射

$ oc create configmap game-config --from-file=example-files/

查看配置映射中的键

$ oc describe configmaps game-config
示例输出
Name:           game-config
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data

game.properties:        158 bytes
ui.properties:          83 bytes

您可以看到映射中的两个键是从命令中指定的目录中的文件名创建的。这些键的内容可能很大,因此 oc describe 的输出仅显示键的名称及其大小。

先决条件
  • 您必须有一个包含要用于填充配置映射的数据的文件的目录。

    以下步骤使用这些示例文件:game.propertiesui.properties

    $ cat example-files/game.properties
    示例输出
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
    $ cat example-files/ui.properties
    示例输出
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
步骤
  • 通过输入以下命令来创建一个包含此目录中每个文件内容的配置映射

    $ oc create configmap game-config \
        --from-file=example-files/
验证
  • 使用 -o 选项输入对象的 oc get 命令以查看键的值

    $ oc get configmaps game-config -o yaml
    示例输出
    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:34:05Z
      name: game-config
      namespace: default
      resourceVersion: "407"
      selflink: /api/v1/namespaces/default/configmaps/game-config
      uid: 30944725-d66e-11e5-8cd0-68f728db1985

从文件创建配置映射

您可以使用 --from-file 标志从文件创建配置映射。您可以多次将 --from-file 选项传递给 CLI。

您还可以通过将 key=value 表达式传递给 --from-file 选项来指定要在从文件导入内容的配置映射中设置的键。例如

$ oc create configmap game-config-3 --from-file=game-special-key=example-files/game.properties

如果从文件创建配置映射,则可以包含包含非 UTF8 数据的文件,这些文件放置在此字段中而不会损坏非 UTF8 数据。OpenShift Dedicated 会检测二进制文件并将其透明地编码为 MIME。在服务器上,MIME 负载将被解码并存储,而不会损坏数据。

先决条件
  • 您必须有一个包含要用于填充配置映射的数据的文件的目录。

    以下步骤使用这些示例文件:game.propertiesui.properties

    $ cat example-files/game.properties
    示例输出
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
    $ cat example-files/ui.properties
    示例输出
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
步骤
  • 通过指定特定文件来创建配置映射

    $ oc create configmap game-config-2 \
        --from-file=example-files/game.properties \
        --from-file=example-files/ui.properties
  • 通过指定键值对创建配置映射

    $ oc create configmap game-config-3 \
        --from-file=game-special-key=example-files/game.properties
验证
  • 使用 -o 选项输入对象的 oc get 命令以查看来自文件的键的值

    $ oc get configmaps game-config-2 -o yaml
    示例输出
    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:52:05Z
      name: game-config-2
      namespace: default
      resourceVersion: "516"
      selflink: /api/v1/namespaces/default/configmaps/game-config-2
      uid: b4952dc3-d670-11e5-8cd0-68f728db1985
  • 使用 -o 选项输入对象的 oc get 命令以查看来自键值对的键的值

    $ oc get configmaps game-config-3 -o yaml
    示例输出
    apiVersion: v1
    data:
      game-special-key: |- (1)
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:54:22Z
      name: game-config-3
      namespace: default
      resourceVersion: "530"
      selflink: /api/v1/namespaces/default/configmaps/game-config-3
      uid: 05f8da22-d671-11e5-8cd0-68f728db1985
    1 这是您在上一步中设置的键。

从字面值创建配置映射

您可以为配置映射提供字面值。

--from-literal 选项采用 key=value 语法,允许直接在命令行上提供字面值。

步骤
  • 通过指定字面值创建配置映射

    $ oc create configmap special-config \
        --from-literal=special.how=very \
        --from-literal=special.type=charm
验证
  • 使用 -o 选项输入对象的 oc get 命令以查看键的值

    $ oc get configmaps special-config -o yaml
    示例输出
    apiVersion: v1
    data:
      special.how: very
      special.type: charm
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T19:14:38Z
      name: special-config
      namespace: default
      resourceVersion: "651"
      selflink: /api/v1/namespaces/default/configmaps/special-config
      uid: dadce046-d673-11e5-8cd0-68f728db1985

用例:在 Pod 中使用配置映射

以下部分描述了在 Pod 中使用 ConfigMap 对象时的一些用例。

使用配置映射填充容器中的环境变量

您可以使用配置映射填充容器中的单个环境变量,或填充容器中构成有效环境变量名称的所有键的环境变量。

例如,考虑以下配置映射

包含两个环境变量的 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config (1)
  namespace: default (2)
data:
  special.how: very (3)
  special.type: charm (3)
1 配置映射的名称。
2 配置映射所在的项目。配置映射只能被同一项目中的 Pod 引用。
3 要注入的环境变量。
包含一个环境变量的 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config (1)
  namespace: default
data:
  log_level: INFO (2)
1 配置映射的名称。
2 要注入的环境变量。
步骤
  • 您可以使用 configMapKeyRef 部分在 Pod 中使用此 ConfigMap 的键。

    配置为注入特定环境变量的示例 Pod 规范
    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "env" ]
          env: (1)
            - name: SPECIAL_LEVEL_KEY (2)
              valueFrom:
                configMapKeyRef:
                  name: special-config (3)
                  key: special.how (4)
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config (3)
                  key: special.type (4)
                  optional: true (5)
          envFrom: (6)
            - configMapRef:
                name: env-config (7)
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      restartPolicy: Never
    1 ConfigMap 中提取指定环境变量的节。
    2 正在将键的值注入到其中的 Pod 环境变量的名称。
    3 要从中提取特定环境变量的 ConfigMap 的名称。
    4 要从 ConfigMap 中提取的环境变量。
    5 使环境变量可选。作为可选,即使指定的 ConfigMap 和键不存在,Pod 也会启动。
    6 ConfigMap 中提取所有环境变量的节。
    7 要从中提取所有环境变量的 ConfigMap 的名称。

    运行此 Pod 时,Pod 日志将包含以下输出

    SPECIAL_LEVEL_KEY=very
    log_level=INFO

SPECIAL_TYPE_KEY=charm 未列在示例输出中,因为设置了 optional: true

使用配置映射设置容器命令的命令行参数

您可以使用配置映射通过使用 Kubernetes 替换语法 $(VAR_NAME) 来设置容器中命令或参数的值。

例如,考虑以下配置映射

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
步骤
  • 要将值注入容器中的命令,必须将要使用的键用作环境变量。然后,您可以使用 $(VAR_NAME) 语法在容器的命令中引用它们。

    配置为注入特定环境变量的示例 Pod 规范
    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] (1)
          env:
            - name: SPECIAL_LEVEL_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.how
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.type
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      restartPolicy: Never
    1 使用要用作环境变量的键将值注入容器中的命令。

    运行此 Pod 时,在 test-container 容器中运行的 echo 命令的输出如下所示

    very charm

使用 ConfigMap 将内容注入卷

您可以使用 ConfigMap 将内容注入卷。

示例ConfigMap 自定义资源 (CR)
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
步骤

您可以通过几种不同的方式使用 ConfigMap 将内容注入卷。

  • 使用 ConfigMap 将内容注入卷最基本的方法是使用文件填充卷,其中键是文件名,文件的內容是键的值。

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      volumes:
        - name: config-volume
          configMap:
            name: special-config (1)
      restartPolicy: Never
    1 包含键的文件。

    运行此 Pod 时,cat 命令的输出将是

    very
  • 您还可以控制 ConfigMap 键投影到的卷内路径。

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      volumes:
        - name: config-volume
          configMap:
            name: special-config
            items:
            - key: special.how
              path: path/to/special-key (1)
      restartPolicy: Never
    1 ConfigMap 键的路径。

    运行此 Pod 时,cat 命令的输出将是

    very