目录
- [深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret](#深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret)
-
- 一、目录结构
- [二、ConfigMap 和 Secret 的创建](#二、ConfigMap 和 Secret 的创建)
-
- [1. 创建 ConfigMap](#1. 创建 ConfigMap)
- [2. 创建 Secret](#2. 创建 Secret)
- [三、在 Deployment 中使用 ConfigMap 和 Secret](#三、在 Deployment 中使用 ConfigMap 和 Secret)
- [四、只挂载 ConfigMap 或 Secret 中的某个变量](#四、只挂载 ConfigMap 或 Secret 中的某个变量)
-
- [1. 只挂载 ConfigMap 中的某个变量](#1. 只挂载 ConfigMap 中的某个变量)
-
- [示例:只将 `APP_ENV` 环境变量从 ConfigMap 中注入到容器:](#示例:只将
APP_ENV
环境变量从 ConfigMap 中注入到容器:)
- [示例:只将 `APP_ENV` 环境变量从 ConfigMap 中注入到容器:](#示例:只将
- [2. 只挂载 Secret 中的某个变量](#2. 只挂载 Secret 中的某个变量)
-
- [示例:只将 `DB_USER` 和 `DB_PASSWORD` 从 Secret 中注入到容器:](#示例:只将
DB_USER
和DB_PASSWORD
从 Secret 中注入到容器:)
- [示例:只将 `DB_USER` 和 `DB_PASSWORD` 从 Secret 中注入到容器:](#示例:只将
- 五、部署和管理
- 六、安全性和最佳实践
- 七、总结
深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
在企业级 Kubernetes 环境中,如何高效、安全地管理应用配置是运维和开发的核心任务之一。Kubernetes 提供了 ConfigMap 和 Secret 两种资源对象,分别用于存储非敏感和敏感的配置信息。本文将通过一套完整的 YAML 文件示例,展示如何在 Kubernetes 中使用 ConfigMap 和 Secret 管理应用配置,包括创建、部署、更新和安全控制等方面,并且我们会演示如何只挂载 ConfigMap 或 Secret 中的某个变量。
一、目录结构
以下是示例项目的目录结构:
plaintext
├── config/
│ ├── app-config.yaml # 存储应用配置的 ConfigMap
│ └── db-config.yaml # 存储数据库配置的 ConfigMap
├── secrets/
│ └── db-credentials.yaml # 存储数据库凭证的 Secret
├── deployments/
│ └── app-deployment.yaml # 应用的 Deployment 配置
└── README.md
二、ConfigMap 和 Secret 的创建
1. 创建 ConfigMap
ConfigMap 用于存储非敏感的配置信息,例如环境变量、应用配置等。
config/app-config.yaml
:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
# 应用环境设置
APP_ENV: production
LOG_LEVEL: info
FEATURE_FLAG: "true" # 特性标志,用于控制功能开关
config/db-config.yaml
:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: db-config
namespace: default
data:
# 数据库连接配置
DB_HOST: db.example.com
DB_PORT: "5432"
DB_NAME: myapp
2. 创建 Secret
Secret 用于存储敏感信息,例如数据库凭证、API 密钥等。数据以 base64 编码存储。
secrets/db-credentials.yaml
:
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
namespace: default
type: Opaque
data:
# 数据库用户名和密码,值经过 base64 编码
DB_USER: YWRtaW4= # base64 编码的 'admin'
DB_PASSWORD: cGFzc3dvcmQ= # base64 编码的 'password'
注意:Secret 中的值使用 base64 编码存储,实际使用时需要解码。
三、在 Deployment 中使用 ConfigMap 和 Secret
在 Deployment 中挂载 ConfigMap 和 Secret,可以通过环境变量或卷的方式将配置数据注入到容器中。
deployments/app-deployment.yaml
:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app-container
image: myapp:v1
ports:
- containerPort: 8080
envFrom:
# 使用 ConfigMap 注入环境变量
- configMapRef:
name: app-config
- configMapRef:
name: db-config
# 使用 Secret 注入环境变量
- secretRef:
name: db-credentials
volumeMounts:
# 将 ConfigMap 挂载为文件
- name: config-volume
mountPath: /etc/config
# 将 Secret 挂载为文件
- name: secret-volume
mountPath: /etc/secret
volumes:
# ConfigMap 挂载配置文件
- name: config-volume
configMap:
name: app-config
# Secret 挂载敏感信息文件
- name: secret-volume
secret:
secretName: db-credentials
四、只挂载 ConfigMap 或 Secret 中的某个变量
如果只需要挂载 ConfigMap 或 Secret 中的某个变量,可以使用 env
或 envFrom
来指定具体的键,而不是将整个 ConfigMap 或 Secret 注入容器。
1. 只挂载 ConfigMap 中的某个变量
示例:只将 APP_ENV
环境变量从 ConfigMap 中注入到容器:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app-container
image: myapp:v1
ports:
- containerPort: 8080
env:
# 从 ConfigMap 中注入单一环境变量
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV # 仅注入 APP_ENV 变量
2. 只挂载 Secret 中的某个变量
示例:只将 DB_USER
和 DB_PASSWORD
从 Secret 中注入到容器:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app-container
image: myapp:v1
ports:
- containerPort: 8080
env:
# 从 Secret 中注入数据库用户名和密码
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_USER # 仅注入 DB_USER
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_PASSWORD # 仅注入 DB_PASSWORD
五、部署和管理
-
应用资源 :
使用
kubectl
部署 ConfigMap、Secret 和 Deployment:bashkubectl apply -f config/ kubectl apply -f secrets/ kubectl apply -f deployments/
-
查看资源状态 :
检查部署状态:
bashkubectl get deployments kubectl get pods kubectl get configmaps kubectl get secrets
-
更新 ConfigMap 和 Secret:
-
编辑
config/app-config.yaml
或secrets/db-credentials.yaml
。 -
使用
kubectl apply -f
更新资源。 -
对于以环境变量形式注入的配置,更新后需要重启 Pod:
bashkubectl rollout restart deployment app-deployment
-
六、安全性和最佳实践
- 加密存储:启用 Kubernetes 的静态加密功能,确保 Secret 在 etcd 中以加密形式存储。
- 访问控制:使用 RBAC 控制对 ConfigMap 和 Secret 的访问权限,确保只有授权的用户和服务可以访问。
- 版本管理:为 ConfigMap 和 Secret 添加版本信息,便于追踪和回滚。
- 外部 Secret 管理:对于敏感信息,建议使用外部 Secret 管理工具(如 HashiCorp Vault)进行管理,并通过 Kubernetes 的 External Secrets Operator 实现同步。
七、总结
通过上述示例,我们展示了如何在 Kubernetes 中使用 YAML 文件创建和管理 ConfigMap 和 Secret,实现应用配置的集中管理和动态更新。在实际操作中,建议将非敏感的配置存储在 ConfigMap 中,将敏感信息存储在 Secret 中,并通过环境变量或卷的方式将其注入到 Pod 中。这样可以有效地解耦应用和配置,提高系统的灵活性和安全性。