第四部分:ConfigMap/Secret 资源介绍

📝 前言

在 Kubernetes 中,应用配置与敏感信息的管理是非常核心的能力。

ConfigMap 用于存储非敏感的配置信息,而 Secret 则专门存储敏感信息(如密码、证书、API Token)。

它们都能以挂载文件或环境变量的方式注入到 Pod 中,从而实现应用与配置的解耦,提升可维护性与安全性。

🧭 背景介绍

在真实的生产环境中,应用往往需要依赖外部服务和环境配置。例如:

  • 一个电商系统可能需要 数据库连接信息、Redis 缓存配置;
  • 一个微服务架构下的支付服务需要 第三方支付网关的 API Key;
  • 一个多环境部署的应用(开发/测试/生产)需要 不同的配置文件;
  • 企业内部的 CI/CD 流程需要在 Pod 启动时动态注入配置。

如果将这些配置硬编码在容器镜像中,不仅不灵活,还会带来安全隐患。
ConfigMapSecret 的出现,正是为了解决这一痛点:

  • ConfigMap → 提供统一的非敏感配置存储,支持多环境快速切换;
  • Secret → 提供敏感信息的安全管理,避免将密码、证书硬编码在代码中。

🧠 本章知识卡片

🚀 本章小节

1️⃣ 什么是 ConfigMap?

  • ConfigMap 是一种 Key-Value 形式的配置存储对象。
  • 适用于存储配置信息,例如应用的配置文件、环境变量、命令行参数等。
  • 数据 不加密,仅做明文存储,适合非敏感信息。

简单示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_NAME: "nCalendar"
APP_MODE: "production"
config.json: |
{
"theme": "dark",
"timezone": "Asia/Shanghai"
}

2️⃣ 什么是 Secret?

  • Secret 专门用于存储敏感信息(密码、Token、证书等)。
  • Kubernetes 默认会对 Secret 进行 Base64 编码 存储,并可结合 KMS 插件进行更安全的加密。
  • Secret 默认挂载到 Pod 的 /etc/ 路径下,或通过环境变量注入。

简单示例如下:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64("admin")
password: cGFzc3dvcmQ= # base64("password")

3️⃣ 实战示例:在 Pod 中使用

作为环境变量注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: app
image: nginx
env:
- name: APP_MODE
valueFrom:
configMapKeyRef:
name: app-config
key: APP_MODE
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

以 Volume 挂载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-vol
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: config-vol
mountPath: /etc/config
- name: secret-vol
mountPath: /etc/secret
volumes:
- name: config-vol
configMap:
name: app-config
- name: secret-vol
secret:
secretName: db-secret

4️⃣ 热加载场景

在一些需要频繁调整配置的场景中(如 Nginx、Prometheus、业务应用配置文件),我们往往希望 不必重启 Pod 就能让应用加载最新配置。

这时,Kubernetes 提供的 ConfigMap / Secret Volume 挂载 就能发挥作用:

  • 挂载方式:
    将 ConfigMap 或 Secret 以文件形式挂载到容器的指定目录(如 /etc/config/)。
  • 更新机制:
    当 ConfigMap/Secret 被更新后,Kubernetes 会在后台将挂载的文件同步更新(一般有 秒级延迟)。
  • 热加载实现:
    如果应用本身支持 reload 信号 或 配置自动检测,即可在无需重启 Pod 的情况下,加载新的配置。

实战示例:Nginx 动态加载配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default.conf: |
server {
listen 80;
location / {
proxy_pass http://example.com;
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-conf
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-conf
configMap:
name: nginx-config

在更新 ConfigMap 后,只需执行:

1
kubectl exec -it <nginx-pod> -- nginx -s reload

即可让 Nginx 在不重启 Pod 的情况下应用新配置,实现 热加载。

5️⃣ 常用命令

ConfigMap 常用命令:

命令 用途
kubectl create configmap app-config --from-literal=APP_MODE=dev 从字面量创建 ConfigMap
kubectl create configmap app-config --from-file=config.json 从文件创建 ConfigMap
kubectl get configmap 查看所有 ConfigMap
kubectl describe configmap app-config 查看 ConfigMap 详情
kubectl edit configmap app-config 编辑 ConfigMap

Secret 常用命令:

命令 用途
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=123456 从字面量创建 Secret
kubectl create secret generic db-secret --from-file=ssh-privatekey=id_rsa 从文件创建 Secret
kubectl create secret docker-registry regcred --docker-username=user --docker-password=pwd --docker-server=registry.cn-hangzhou.aliyuncs.com 创建镜像仓库认证 Secret
kubectl get secret 查看所有 Secret
kubectl describe secret db-secret 查看 Secret 信息(不显示明文)

✅ 总结

ConfigMap 与 Secret 是 Kubernetes 中配置管理和安全存储的基石:

  • ConfigMap 管理非敏感的配置信息,实现应用与环境解耦;
  • Secret 管理敏感数据,需结合加密方案保障安全;
  • 两者都支持通过 环境变量 或 Volume 挂载 注入 Pod;
  • 配合应用的 reload 机制,可实现动态热加载;
  • 合理使用能提升系统的 灵活性、安全性与可维护性。

📝 前言

在 Kubernetes 中,应用配置与敏感信息的管理是非常核心的能力。

ConfigMap 用于存储非敏感的配置信息,而 Secret 则专门存储敏感信息(如密码、证书、API Token)。

它们都能以挂载文件或环境变量的方式注入到 Pod 中,从而实现应用与配置的解耦,提升可维护性与安全性。

🧭 背景介绍

在真实的生产环境中,应用往往需要依赖外部服务和环境配置。例如:

  • 一个电商系统可能需要 数据库连接信息、Redis 缓存配置;
  • 一个微服务架构下的支付服务需要 第三方支付网关的 API Key;
  • 一个多环境部署的应用(开发/测试/生产)需要 不同的配置文件;
  • 企业内部的 CI/CD 流程需要在 Pod 启动时动态注入配置。

如果将这些配置硬编码在容器镜像中,不仅不灵活,还会带来安全隐患。
ConfigMapSecret 的出现,正是为了解决这一痛点:

  • ConfigMap → 提供统一的非敏感配置存储,支持多环境快速切换;
  • Secret → 提供敏感信息的安全管理,避免将密码、证书硬编码在代码中。

🧠 本章知识卡片

🚀 本章小节

1️⃣ 什么是 ConfigMap?

  • ConfigMap 是一种 Key-Value 形式的配置存储对象。
  • 适用于存储配置信息,例如应用的配置文件、环境变量、命令行参数等。
  • 数据 不加密,仅做明文存储,适合非敏感信息。

简单示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_NAME: "nCalendar"
APP_MODE: "production"
config.json: |
{
"theme": "dark",
"timezone": "Asia/Shanghai"
}

2️⃣ 什么是 Secret?

  • Secret 专门用于存储敏感信息(密码、Token、证书等)。
  • Kubernetes 默认会对 Secret 进行 Base64 编码 存储,并可结合 KMS 插件进行更安全的加密。
  • Secret 默认挂载到 Pod 的 /etc/ 路径下,或通过环境变量注入。

简单示例如下:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64("admin")
password: cGFzc3dvcmQ= # base64("password")

3️⃣ 实战示例:在 Pod 中使用

作为环境变量注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: app
image: nginx
env:
- name: APP_MODE
valueFrom:
configMapKeyRef:
name: app-config
key: APP_MODE
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

以 Volume 挂载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
name: demo-pod-vol
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: config-vol
mountPath: /etc/config
- name: secret-vol
mountPath: /etc/secret
volumes:
- name: config-vol
configMap:
name: app-config
- name: secret-vol
secret:
secretName: db-secret

4️⃣ 热加载场景

在一些需要频繁调整配置的场景中(如 Nginx、Prometheus、业务应用配置文件),我们往往希望 不必重启 Pod 就能让应用加载最新配置。

这时,Kubernetes 提供的 ConfigMap / Secret Volume 挂载 就能发挥作用:

  • 挂载方式:
    将 ConfigMap 或 Secret 以文件形式挂载到容器的指定目录(如 /etc/config/)。
  • 更新机制:
    当 ConfigMap/Secret 被更新后,Kubernetes 会在后台将挂载的文件同步更新(一般有 秒级延迟)。
  • 热加载实现:
    如果应用本身支持 reload 信号 或 配置自动检测,即可在无需重启 Pod 的情况下,加载新的配置。

实战示例:Nginx 动态加载配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default.conf: |
server {
listen 80;
location / {
proxy_pass http://example.com;
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-conf
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-conf
configMap:
name: nginx-config

在更新 ConfigMap 后,只需执行:

1
kubectl exec -it <nginx-pod> -- nginx -s reload

即可让 Nginx 在不重启 Pod 的情况下应用新配置,实现 热加载。

5️⃣ 常用命令

ConfigMap 常用命令:

命令 用途
kubectl create configmap app-config --from-literal=APP_MODE=dev 从字面量创建 ConfigMap
kubectl create configmap app-config --from-file=config.json 从文件创建 ConfigMap
kubectl get configmap 查看所有 ConfigMap
kubectl describe configmap app-config 查看 ConfigMap 详情
kubectl edit configmap app-config 编辑 ConfigMap

Secret 常用命令:

命令 用途
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=123456 从字面量创建 Secret
kubectl create secret generic db-secret --from-file=ssh-privatekey=id_rsa 从文件创建 Secret
kubectl create secret docker-registry regcred --docker-username=user --docker-password=pwd --docker-server=registry.cn-hangzhou.aliyuncs.com 创建镜像仓库认证 Secret
kubectl get secret 查看所有 Secret
kubectl describe secret db-secret 查看 Secret 信息(不显示明文)

✅ 总结

ConfigMap 与 Secret 是 Kubernetes 中配置管理和安全存储的基石:

  • ConfigMap 管理非敏感的配置信息,实现应用与环境解耦;
  • Secret 管理敏感数据,需结合加密方案保障安全;
  • 两者都支持通过 环境变量 或 Volume 挂载 注入 Pod;
  • 配合应用的 reload 机制,可实现动态热加载;
  • 合理使用能提升系统的 灵活性、安全性与可维护性。