Module 03 · Managing Applications with Kubernetes
ConfigMaps and SecretsConfigMaps 与 Secrets
为什么需要配置分离?
作为软件开发人员,最佳实践是避免将配置变量硬编码在应用程序代码中。
- 目的: 将配置变量保持分离,这样配置设置的任何更改都不需要修改代码。
ConfigMap
ConfigMap 是一个 API 对象,用于存储非机密数据。
核心特性
| 特性 | 描述 |
|---|---|
| 用途 | 存储非机密配置数据,以键-值对(key-value pairs)的形式。 |
| 安全性 | 不提供机密性或加密(encryption),适用于非敏感信息。 |
| 功能 | 向 Pods 和 Deployments 提供配置数据,从而避免将配置硬编码到应用程序代码中。 |
| 大小限制 | 存储的数据不能超过 1 兆字节 (1MB)。 |
| 替代方案 | 对于更大的数据量,应考虑挂载卷(mounting a volume)或使用单独的数据库/文件服务。 |
| 结构 | 具有可选的 data 和 binaryData 字段,没有 spec 字段。 |
| 命名 | ConfigMap 名称必须是有效的 DNS 子域名。 |
| 可重用性 | 可供多个 Deployment 重用,从而实现环境与部署解耦。 |
ConfigMap 的创建方式 (3 种)
您可以通过以下方式创建 ConfigMap:
- 使用 字符串字面量(String Literals):通过命令行直接提供键值对。
- 使用现有属性文件:使用现有的
properties文件或key=value格式的文件。 - 使用 YAML 描述文件:提供 ConfigMap 的 YAML 描述文件。
📝 提示:前两种方式可用于辅助创建 YAML 文件。

ConfigMap 的消费方式
Deployment 或 Pods 通过以下方式使用 ConfigMap:
- 环境变量(Environment Variables):使用
configMapKeyRef属性。 - 文件挂载(File Mounting):使用
volumes插件将 ConfigMap 挂载为一个文件。
- Kubernetes 会在运行 Pod 或 Deployment 之前,将 ConfigMap 应用到它们上。
示例:使用环境变量

- 创建 ConfigMap:
- 使用命令行创建 ConfigMap,直接提供键值对(例如:
message* 键和对应的值*)。
- 更新 Deployment 描述文件:
- 在 Deployment 描述文件中添加
env部分。 - 使用
valueFrom属性,指向第一步创建的 ConfigMap 名称(例如:myconfig)。 - Deployment 将在名为
myconfig的 ConfigMap 中查找名为message的键。 - 应用程序代码(例如:JavaScript 文件)中通过
process.env.MESSAGE使用此变量。
示例:使用属性文件

- 准备文件:创建一个包含所有环境变量的
key=value格式文件(例如:my.properties,其中包含message=hello from the my.properties file)。
- 这种文件适用于添加许多变量,比在命令行逐个列出更高效。
- 创建 ConfigMap:
- 使用
--from-file标志创建 ConfigMap。
- 使用:
- 在 Deployment 描述文件中,引用的键将是文件名(例如:
my.properties)。 - 如果为
--from-file标志指定一个目录,则整个目录的内容都会加载到 ConfigMap 中。 - 您也可以使用
from-file=key=file name格式来加载具有特定键的特定文件。
示例:使用 YAML 文件

- 将
kubectl get configmap的输出保存为 YAML 文件(例如:my-config.yaml)。 - 应用该 YAML 文件到集群,创建 ConfigMap。
- 使用 YAML 文件将获得与前述方法相同的结果。
Secrets
操作 Secret 与操作 ConfigMap 类似,但 Secret 用于存储敏感信息。
Secret 的特性
- 用途: 为应用程序提供敏感信息(如 API 凭证、密码)。
- 安全性: Secret 的值会被 Base64 编码(Encoded)存储,但并未加密,因此在集群内部仍需谨慎处理。
Secret 的创建方式 (3 种)
- 使用 字符串字面量(String Literals):通过命令行直接提供键值对。
- 使用 现有文件:使用包含机密信息的现有文件。
- 使用 YAML 描述文件。
示例:使用字符串字面量
- 使用
create secret命令创建 Secret(例如:包含 API 凭证)。 - 使用
get命令验证 Secret 已创建。 - 使用
describe命令验证:在显示文本中看不到任何机密内容。 - 如果以 YAML 格式打印 Secret,您会看到值是完全编码的。

Secret 的消费方式 (2 种)
- 环境变量:类似于 ConfigMap,在 Deployment 描述文件中添加
env部分,引用 Secret 中的键(例如:process.env.API_CREDS)。

- 卷挂载(Volume Mounts):

示例:使用卷挂载
- 创建 Secret。
- 在 Deployment YAML 文件中,为 Secret 使用一个
volume。 - 在容器中设置相应的
volumeMount。
- 描述文件中的每个容器都有自己的
volumeMount,但共享同一个volume。 - Secret(例如:
api-creds)被挂载为文件,应用程序将读取和处理该文件以提取 Secret。
总结
- ConfigMap:提供应用程序的非敏感配置变量。
- 创建方式:字符串字面量、属性文件、YAML 文件。
- Secret:提供应用程序的敏感信息。
- 创建方式:字符串字面量、现有文件、YAML 文件。
- 消费方式:ConfigMap 和 Secret 都可以通过环境变量或卷挂载提供给 Pod。