×

ConfigMap 允许您将配置工件与镜像内容解耦,以保持容器化应用程序的可移植性。

以下部分定义了 ConfigMap 以及如何创建和使用它们。

理解 ConfigMap

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

ConfigMap 对象提供了一种机制,可以在保持容器与 Red Hat OpenShift Service on AWS 无关的情况下,将配置数据注入容器。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 指向包含非 UTF8 数据的文件,例如二进制 Java 密钥库文件。输入 Base64 中的文件数据。

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

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

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

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

  • 填充卷中的配置文件

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

ConfigMap 类似于 Secret,但更方便地支持处理不包含敏感信息的字符串。

ConfigMap 限制

必须先创建 ConfigMap,然后才能在 Pod 中使用其内容。

控制器可以编写成容忍缺少配置数据。针对个别使用 ConfigMap 配置的组件,请逐个案例进行咨询。

ConfigMap 对象位于项目中。

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

Kubelet 仅支持对从 API 服务器获取的 Pod 使用 ConfigMap。

这包括使用 CLI 或间接地从复制控制器创建的任何 Pod。它不包括使用 Red Hat OpenShift Service on AWS 节点的 `--manifest-url` 标志、`--config` 标志或其 REST API 创建的 Pod,因为这些不是创建 Pod 的常用方法。

用例:在 Pod 中使用 ConfigMap

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

使用 ConfigMap 在容器中填充环境变量

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

例如,考虑以下 ConfigMap:

包含两个环境变量的 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config (1)
  namespace: default (2)
data:
  special.how: very (3)
  special.type: charm (3)
1 ConfigMap 的名称。
2 ConfigMap 所在的项目。ConfigMap 只能被同一项目中的 Pod 引用。
3 要注入的环境变量。
包含一个环境变量的 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config (1)
  namespace: default
data:
  log_level: INFO (2)
1 ConfigMap 的名称。
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

由于设置了 `optional: true`,因此示例输出中未列出 `SPECIAL_TYPE_KEY=charm`。

使用 ConfigMap 为容器命令设置命令行参数

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

例如,考虑以下 ConfigMap:

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