×

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

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

理解ConfigMap

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

ConfigMap对象提供机制,用于将容器与配置数据注入,同时保持容器与OpenShift Container Platform无关。ConfigMap可用于存储细粒度信息(如单个属性)或粗粒度信息(如整个配置文件或JSON Blob)。

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

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

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

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

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

  • 在卷中填充配置文件

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

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

配置映射限制

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

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

ConfigMap 对象驻留在项目中。

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

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

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

用例:在 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

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

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

您可以使用配置映射通过使用 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自定义资源 (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