配置 ConfigMap

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

了解 ConfigMap

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

ConfigMap 对象提供了将配置数据注入容器的机制,同时使容器不依赖于 OpenShift Container Platform。ConfigMap 可用于存储细粒度信息,例如单个属性;也可用于存储粗粒度信息,例如整个配置文件或 JSON blob。

ConfigMap 对象保存键值对形式的配置数据,这些数据可在 Pod 中使用,也可用于存储控制器等系统组件的配置数据。例如:

# my-app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
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 仅支持将 ConfigMap 用于它从 API server 获取的 Pod。这包括使用 CLI 创建的任何 Pod,或由 replication controller 间接创建的 Pod。它不包括使用 OpenShift Container Platform 节点的 --manifest-url 标志、--config 标志或其 REST API 创建的 Pod,因为这些并不是创建 Pod 的常见方式。
NOTE

Pod 只能使用同一 namespace 中的 ConfigMap。

ConfigMap 示例

现在您可以在 Pod 中使用 app-config。

# app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "debug"

使用 web console 创建 ConfigMap

  1. 转到 Container Platform

  2. 在左侧边栏中,单击 Configuration > ConfigMap

  3. 单击 Create ConfigMap

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

    参数描述
    Entrieskey:value 键值对,支持 AddImport 两种方式。
    • Add:您可以逐个添加配置项,也可以在 Key 输入区域中粘贴一行或多行 key=value 对以批量添加配置项。
    • Import:导入一个不大于 1M 的文本文件。文件名将作为键,文件内容将作为值,填充到一个配置项中。
    Binary Entries指不大于 1M 的二进制文件。文件名将作为键,文件内容将作为值,填充到一个配置项中。
    注意:创建 ConfigMap 后,导入的文件无法修改。

    批量添加格式示例

    # One key=value pair per line, multiple pairs must be on separate lines, otherwise they will not be recognized correctly after pasting.
    key1=value1
    key2=value2
    key3=value3
  5. 单击 Create

使用新的 web console 创建 ConfigMap

本页面主要描述传统控制台的工作流,但在新的 web console 中,也可以从不同视图访问相同功能。

从 Applications 视图创建或更新

当 ConfigMap 作为当前项目范围的一部分进行管理时,请使用 Applications 视图。

在从此视图创建或更新 ConfigMap 之前,请确认:

  • 所选 cluster 已与当前项目关联
  • 目标 namespace 与使用该配置的工作负载所使用的 namespace 相同
  • 键、文件名和值格式与工作负载读取配置的方式匹配
  • 之后 ConfigMap 会出现在所选项目和 cluster 上下文中

从 Clusters 视图创建或更新

当您从具体 cluster 开始,并将 ConfigMap 作为该 cluster 中的 namespace 资源进行管理时,请使用 Clusters 视图。

在从此视图创建或更新 ConfigMap 之前,请确认:

  • 您已先打开目标 cluster
  • 您已在该 cluster 中选择或确认目标 namespace
  • 您关注的是 namespace 本地的工作负载影响,而不是项目成员关系
  • 之后 ConfigMap 会出现在预期的 namespace 中

使用 CLI 创建 ConfigMap

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

或者从文件创建:

kubectl apply -f app-config.yaml

操作

您可以单击列表页右侧的 (⋮),或在详情页右上角单击 Actions,按需更新或删除 ConfigMap。

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

操作描述
Update
  • 添加或更新 ConfigMap 后,任何通过环境变量引用了此 ConfigMap(或其配置项)的工作负载都需要重新构建其 Pod,新的配置才会生效。
  • 对于导入的二进制配置项,仅支持更新键,不支持更新值。
Delete删除 ConfigMap 后,如果引用了此 ConfigMap(或其配置项)的工作负载在重新构建 Pod 时无法找到引用源,则在 Pod 创建期间可能会受到不利影响。

使用 CLI 查看、编辑和删除

kubectl get configmap app-config -o yaml
kubectl edit configmap app-config
kubectl delete configmap app-config

在 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

ConfigMap 与 Secret 的对比

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