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
-
进入 Container Platform。
-
在左侧边栏点击 Configuration > ConfigMap。
-
点击 Create ConfigMap。
-
参考以下说明配置相关参数。
参数 | 说明 |
---|
Entries | 指 key:value 键值对,支持 添加 和 导入 两种方式。
- 添加:可以逐条添加配置项,也可以在 Key 输入框中粘贴一行或多行 key=value 格式的内容批量添加配置项。
- 导入:导入不超过 1M 的文本文件,文件名作为 key,文件内容作为 value,填充为一个配置项。
|
Binary Entries | 指不超过 1M 的二进制文件,文件名作为 key,文件内容作为 value,填充为一个配置项。 注意:创建 ConfigMap 后,导入的文件无法修改。 |
批量添加格式示例:
# 每行一个 key=value,多个键值对必须分行,否则粘贴后无法正确识别。
key1=value1
key2=value2
key3=value3
-
点击 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 的对比
特性 | ConfigMap | Secret |
---|
数据类型 | 非敏感 | 敏感(如密码) |
编码方式 | 明文 | Base64 编码 |
使用场景 | 配置、标志 | 密码、令牌 |