配置 ConfigMap

ConfigMap 允许您将配置工件与镜像内容解耦,以保持容器化应用的可移植性。以下部分定义了 ConfigMap 以及如何创建和使用它们。

目录

理解 ConfigMap

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

ConfigMap 对象提供了向容器注入配置信息的机制,同时使容器对 OpenShift Container Platform 保持无感知。ConfigMap 可以用于存储细粒度的信息,如单个属性,也可以存储粗粒度的信息,如整个配置文件或 JSON 块。

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

# my-app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
  namespace: default
data:
  app_mode: "development"
  feature_flags: "true"
  database.properties: |-
    jdbc.url=jdbc:mysql://localhost:3306/mydb
    jdbc.username=user
    jdbc.password=password
  log_settings.json: |-
    {
      "level": "INFO",
      "format": "json"
    }

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

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

  • 填充容器中的环境变量值
  • 设置容器的命令行参数
  • 在卷中填充配置文件

用户和系统组件都可以将配置信息存储在 ConfigMap 中。ConfigMap 类似于 Secret,但设计上更方便处理不包含敏感信息的字符串。

ConfigMap 限制

  • 必须先创建 ConfigMap,才能在 Pod 中消费其内容。
  • 控制器可以编写为容忍缺失的配置信息。请根据具体使用 ConfigMap 配置的组件逐一确认。
  • ConfigMap 对象存在于项目中。
  • 只能被同一项目中的 Pod 引用。
  • Kubectl 仅支持对从 API 服务器获取的 Pod 使用 ConfigMap,包括通过 CLI 创建的 Pod,或通过复制控制器间接创建的 Pod。不包括通过 OpenShift Container Platform 节点的 --manifest-url 标志、--config 标志或其 REST API 创建的 Pod,因为这些不是常见的创建 Pod 方式。

ConfigMap 与 Secret 对比

功能ConfigMapSecret
数据类型非敏感敏感(如密码)
编码明文Base64 编码
使用场景配置、标志密码、令牌

通过 Web 控制台创建 ConfigMap

  1. 进入 Container Platform

  2. 在左侧边栏点击 Configuration > ConfigMap

  3. 点击 Create ConfigMap

  4. 参考以下说明配置相关参数。

    参数说明
    Entrieskey:value 键值对,支持 添加导入 两种方式。
    • 添加:可以逐条添加配置项,也可以在 Key 输入框粘贴一行或多行 key=value 格式的内容批量添加配置项。
    • 导入:导入不超过 1M 的文本文件,文件名作为 key,文件内容作为 value,填充为一个配置项。
    Binary Entries指不超过 1M 的二进制文件,文件名作为 key,文件内容作为 value,填充为一个配置项。
    注意:创建 ConfigMap 后,导入的文件不可修改。

    批量添加格式示例

    # 每行一个 key=value,多个键值对必须分行,否则粘贴后无法正确识别。
    key1=value1
    key2=value2
    key3=value3
  5. 点击 Create

通过 CLI 创建 ConfigMap

kubectl create configmap app-config \
  --from-literal=APP_ENV=production \
  --from-literal=LOG_LEVEL=debug

或者从文件创建:

kubectl apply -f app-config.yaml -n k-1

操作

您可以点击列表页右侧的 (⋮) 或详情页右上角的 Actions,根据需要更新或删除 ConfigMap。

ConfigMap 的变更会影响引用该配置的工作负载,请提前阅读操作说明。

操作说明
更新
  • 添加或更新 ConfigMap 后,任何通过环境变量引用该 ConfigMap(或其配置项)的工作负载需要重建 Pod,才能使新配置生效。
  • 对于导入的二进制配置项,仅支持键的更新,不支持值的更新。
删除删除 ConfigMap 后,任何通过环境变量引用该 ConfigMap(或其配置项)的工作负载在重建 Pod 时,若找不到引用源,可能会受到不利影响。

通过 CLI 查看、编辑和删除

kubectl get configmap app-config -n k-1 -o yaml
kubectl edit configmap app-config -n k-1
kubectl delete configmap app-config -n k-1

在 Pod 中使用 ConfigMap 的方式

作为环境变量

envFrom:
  - configMapRef:
      name: app-config

每个键都会成为容器中的一个环境变量。

作为卷中的文件

volumes:
  - name: config-volume
    configMap:
      name: app-config

volumeMounts:
  - name: config-volume
    mountPath: /etc/config

每个键对应 /etc/config 下的一个文件,文件内容为对应的值。

作为单个环境变量

env:
  - name: APP_ENV
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: APP_ENV