Configuring ConfigMap

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

目录

Understanding Config Maps

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

ConfigMap 对象提供了向容器注入配置信息的机制,同时保持容器对 OpenShift Container Platform 的无感知。config map 可用于存储细粒度的信息,如单个属性,也可存储粗粒度的信息,如整个配置文件或 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"
    }

注意:当您从二进制文件(如镜像)创建 config map 时,可以使用 binaryData 字段。

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

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

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

Config Map 限制

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

Pod 只能使用同一命名空间内的 ConfigMaps。

ConfigMap 示例

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

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

通过 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

ConfigMap 与 Secret 的对比

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