解释 ConfigMap 与 Secret

学习目标

  • 解释如何存储与应用程序解耦的配置和密钥

  • 配置你的应用程序以使用 ConfigMap 和 Secret

  • 识别挂载与注入 ConfigMap 和 Secret 之间的差异

ConfigMap 与 Secret 的使用场景

视频:本节含 SAP 官方视频(视频 ID 1_62yspoiq),需在 learning.sap.com 在线观看。

假设你已经部署了应用程序,你可能会考虑保护它们。有些应用程序需要使用密码或 API 密钥等敏感数据进行配置。那么,如何安全地存储这些数据并将其注入到你的应用程序中呢?

为什么要使用 ConfigMap 和 Secret?

应用程序通常需要一些配置。对于分布式应用程序而言,每个应用程序很可能都需要访问数据库、消息队列或用于发送电子邮件的 SMTP 服务。此外,应用程序通常还必须使用密码或 API 密钥等敏感数据进行配置。

这些支撑服务应被视为附加资源。不建议在应用程序中使用硬编码配置。相反,应将应用程序配置为使用这些附加资源。这样可以在无需更新应用程序的情况下轻松更换支撑服务。通常,应用程序使用环境变量进行配置,环境变量是在启动时传递给应用程序的简单键值对。例如,环境变量可能存储数据库连接字符串、SMTP 服务器地址和凭据等。密码或 API 密钥等敏感数据同样如此。

在将工作负载部署到 Kubernetes 时,你可以直接在 Deployment 清单中定义环境变量。然而,这并不是一种好的做法,因为这些清单通常存储在 Git 等版本控制系统中。这意味着版本控制系统以明文形式存储敏感数据。这样一来,数据未加密,任何有权访问版本控制系统的人都可以读取它。

Kubernetes 中的 ConfigMap 和 Secret 是什么?

Kubernetes 有两种原生资源可用于存储与应用程序解耦的配置数据:ConfigMap 和 Secret。

ConfigMap 必须用于非敏感数据。Secret 应用于密码或 API 密钥等敏感数据。请注意,ConfigMap 和 Secret 中存储的数据大小也有限制。ConfigMap 和 Secret 最多都可存储 1 MB 的数据。超出此限制的所有内容都应作为存储挂载到应用程序中。

使用 ConfigMap

请看一个 ConfigMap 示例:

apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
my-key: "my-value"
my-other-key: "my-other-value"

# You can also use file-like key-value pairs
my-file-like-key: |
# This "file" contains a bash script
/bin/bash
echo "Hello World"
my-other-file-like-key: |
# This "file" contains a JSON object
{
"key": "value"
}

ConfigMap 是一种简单但强大的配置数据存储方式。但你要如何在应用程序中使用它们呢?

为此,你可以在 Deployment 清单中将 ConfigMap 分配给容器,如下例所示:

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kyma-config
spec:
replicas: 1
selector:
matchLabels:
app: hello-kyma-config
template:
metadata:
labels:
app: hello-kyma-config
spec:
containers:
- name: my-container
image: bash
envFrom: # 1. Use all keys as environment variables
- configMapRef:
name: my-config
env: # 2. Use only specific keys as environment variables
- name: MY_KEY
valueFrom:
configMapKeyRef:
name: my-config
key: my-key

在应用程序中使用 ConfigMap 的方式远不止这些。有关更多信息,请参阅配置 Pod 以使用 ConfigMap

使用 Secret

请看一个 Secret 示例:

apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque # default type
data:
username: "YWRtaW4=" # This is the base64 encoded string "admin"
password: "dG9wc2VjcmV0" # This is the base64 encoded string "topsecret"

上述清单创建了一个包含两个键的 Secret:usernamepassword。Kubernetes 还提供了不同的 Secret 类型,你可以使用它们存储不同类型的敏感数据。例如,类型 kubernetes.io/dockerconfigjson 存储 Docker 配置文件。如果你想从私有 Docker 镜像仓库拉取镜像,这会很有用。

在应用程序中使用 Secret 与使用 ConfigMap 非常相似。你可以在 Deployment 清单中将 Secret 分配给容器,如下例所示:

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kyma-secret
spec:
selector:
matchLabels:
app: hello-kyma-secret
template:
metadata:
labels:
app: hello-kyma-secret
spec:
containers:
- name: my-container
image: ghcr.io/sap-samples/kyma-runtime-learning-journey/hello-kyma:1.0.0
envFrom: # 1. Use all keys as environment variables
- secretRef:
name: my-secret
env: # 2. Use only specific keys as environment variables
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password

挂载与注入 ConfigMap 和 Secret 的区别

Kubernetes 中的 ConfigMap 和 Secret 允许你在运行时向 Pod 提供配置数据。有两种方式可以实现:挂载注入

挂载涉及在 Pod 中创建卷,并将 ConfigMap 或 Secret 作为卷添加到该 Pod。这使你能够以卷中文件的形式访问 ConfigMap 或 Secret 中的数据。

例如,如果你有一个名为 my-config 且包含键 config.txt 的 ConfigMap,你可以像这样将其挂载到你的 Pod 中:

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: bash
volumeMounts:
- name: my-config-volume
mountPath: /etc/config
volumes:
- name: my-config-volume
configMap:
name: my-config

然后,你可以在容器中通过 /etc/config/config.txt 访问 config.txt 文件中的数据。

另一方面,注入涉及将数据作为环境变量或命令行参数直接注入到 Pod 中。

例如,如果你有一个名为 my-secret 且包含键 password.txt 的 Secret,你可以像这样将其注入到你的 Pod 中:

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: bash
env:
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password.txt

然后,你可以在容器中通过环境变量 MY_PASSWORD 访问 password.txt 的值。

一般而言,当你需要以容器中文件的形式访问数据时,挂载很有用。当你需要将数据作为环境变量或命令行参数传递给应用程序时,注入很有用。

Kyma Dashboard 中的 ConfigMap 和 Secret

在 Kyma dashboard 中,你可以创建、查看、编辑和删除 ConfigMap 和 Secret。你还可以使用该 dashboard 创建新的 Deployment 并为其分配 ConfigMap 或 Secret。

对于 ConfigMap 和 Secret,你可以通过单击导航中相应的菜单项,查看当前命名空间中已创建的所有资源的概览。

ConfigMap 概览

单击某个 ConfigMap 或 Secret 后,你可以看到该资源的详细信息。你还可以通过单击 Edit 按钮来编辑该资源。

ConfigMap 详细信息

对于 Secret,其值默认采用 base64 编码。你可以选择 Decode 将值解码为纯文本。

Secret 详细信息

小结

本课解释了 ConfigMap 和 Secret 的概念。你已了解何时以及如何使用它们,以及如何在 Kyma dashboard 中创建和管理它们。

延伸阅读

  • Secrets

  • ConfigMaps