Coursera 笔记

Module 03 · Managing Applications with Kubernetes

ConfigMaps and SecretsConfigMaps 与 Secrets

Coursera ↗

为什么需要配置分离?

作为软件开发人员,最佳实践是避免将配置变量硬编码在应用程序代码中。

  • 目的: 将配置变量保持分离,这样配置设置的任何更改都不需要修改代码。

ConfigMap

ConfigMap 是一个 API 对象,用于存储非机密数据。

核心特性

特性 描述
用途 存储非机密配置数据,以键-值对(key-value pairs)的形式。
安全性 不提供机密性或加密(encryption),适用于非敏感信息。
功能 向 Pods 和 Deployments 提供配置数据,从而避免将配置硬编码到应用程序代码中。
大小限制 存储的数据不能超过 1 兆字节 (1MB)。
替代方案 对于更大的数据量,应考虑挂载卷(mounting a volume)或使用单独的数据库/文件服务。
结构 具有可选的 data 和 binaryData 字段,没有 spec 字段。
命名 ConfigMap 名称必须是有效的 DNS 子域名。
可重用性 可供多个 Deployment 重用,从而实现环境与部署解耦。

ConfigMap 的创建方式 (3 种)

您可以通过以下方式创建 ConfigMap:

  1. 使用 字符串字面量(String Literals):通过命令行直接提供键值对。
  2. 使用现有属性文件:使用现有的 properties 文件或 key=value 格式的文件。
  3. 使用 YAML 描述文件:提供 ConfigMap 的 YAML 描述文件。

📝 提示:前两种方式可用于辅助创建 YAML 文件。

ConfigMap 的消费方式

Deployment 或 Pods 通过以下方式使用 ConfigMap:

  1. 环境变量(Environment Variables):使用 configMapKeyRef 属性。
  2. 文件挂载(File Mounting):使用 volumes 插件将 ConfigMap 挂载为一个文件。
  • Kubernetes 会在运行 Pod 或 Deployment 之前,将 ConfigMap 应用到它们上。

示例:使用环境变量

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

示例:使用属性文件

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

示例:使用 YAML 文件

  1. 将 kubectl get configmap 的输出保存为 YAML 文件(例如:my-config.yaml)。
  2. 应用该 YAML 文件到集群,创建 ConfigMap。
  3. 使用 YAML 文件将获得与前述方法相同的结果。

Secrets

操作 Secret 与操作 ConfigMap 类似,但 Secret 用于存储敏感信息。

Secret 的特性

  • 用途: 为应用程序提供敏感信息(如 API 凭证、密码)。
  • 安全性: Secret 的值会被 Base64 编码(Encoded)存储,但并未加密,因此在集群内部仍需谨慎处理。

Secret 的创建方式 (3 种)

  1. 使用 字符串字面量(String Literals):通过命令行直接提供键值对。
  2. 使用 现有文件:使用包含机密信息的现有文件。
  3. 使用 YAML 描述文件。

示例:使用字符串字面量

  1. 使用 create secret 命令创建 Secret(例如:包含 API 凭证)。
  2. 使用 get 命令验证 Secret 已创建。
  3. 使用 describe 命令验证:在显示文本中看不到任何机密内容。
  4. 如果以 YAML 格式打印 Secret,您会看到值是完全编码的。

Secret 的消费方式 (2 种)

  1. 环境变量:类似于 ConfigMap,在 Deployment 描述文件中添加 env 部分,引用 Secret 中的键(例如:process.env.API_CREDS)。
  2. 卷挂载(Volume Mounts):

示例:使用卷挂载

  1. 创建 Secret。
  2. 在 Deployment YAML 文件中,为 Secret 使用一个 volume。
  3. 在容器中设置相应的 volumeMount。
  • 描述文件中的每个容器都有自己的 volumeMount,但共享同一个 volume。
  • Secret(例如:api-creds)被挂载为文件,应用程序将读取和处理该文件以提取 Secret。

总结

  • ConfigMap:提供应用程序的非敏感配置变量。
    • 创建方式:字符串字面量、属性文件、YAML 文件。
  • Secret:提供应用程序的敏感信息。
    • 创建方式:字符串字面量、现有文件、YAML 文件。
  • 消费方式:ConfigMap 和 Secret 都可以通过环境变量或卷挂载提供给 Pod。