×

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

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

理解 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 密钥库文件。输入 Base 64 中的文件数据。

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

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

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

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

  • 填充卷中的配置文件

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

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

ConfigMap 限制

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

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

ConfigMap 对象驻留在项目中。

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

Kubelet 仅支持使用来自 API 服务器的 Pod 的 ConfigMap。

这包括使用 CLI 创建的任何 Pod,或间接从副本控制器创建的 Pod。它不包括使用 OpenShift Dedicated 节点的 `--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 配置映射所在的项目。配置映射只能被同一项目中的 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

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

您可以使用配置映射通过 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自定义资源 (CR)
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm
步骤

您可以使用几种不同的方法使用配置映射将内容注入卷。

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

    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
  • 您还可以控制配置映射键投影到卷中的路径。

    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 配置映射键的路径。

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

    very