题目
Kubernetes中ConfigMap与Secret的基础使用
信息
- 类型:问答
- 难度:⭐
考点
ConfigMap作用,Secret作用,配置注入方式
快速回答
ConfigMap和Secret是Kubernetes中管理配置数据的资源对象:
- ConfigMap:存储非敏感配置(如环境变量、配置文件)
- Secret:存储敏感数据(如密码、密钥),默认Base64编码
- 注入方式:
- 作为环境变量
- 挂载为卷(Volume)
1. 核心概念
ConfigMap:用于解耦容器镜像与配置,存储键值对或配置文件(如application.properties)。
Secret:专用于敏感数据(如API密钥、数据库密码),存储时自动Base64编码(非加密)。
2. 创建示例
ConfigMap创建(YAML)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
# 键值对
LOG_LEVEL: "INFO"
# 配置文件
application.properties: |
server.port=8080
db.host=mysql-serviceSecret创建(命令行)
# 创建通用Secret
kubectl create secret generic db-secret \
--from-literal=DB_USER=admin \
--from-literal=DB_PASSWORD='S3cr3t!'
# 查看Base64编码值(自动处理)
kubectl get secret db-secret -o jsonpath='{.data}'3. 注入到Pod的两种方式
方式一:环境变量注入
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: app-container
image: my-app:latest
env:
# 从ConfigMap注入
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
# 从Secret注入
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD方式二:卷挂载(适合配置文件)
spec:
containers:
- name: app-container
volumeMounts:
# 挂载ConfigMap
- name: config-volume
mountPath: "/etc/app-config"
# 挂载Secret
- name: secret-volume
mountPath: "/etc/creds"
readOnly: true
volumes:
- name: config-volume
configMap:
name: app-config
- name: secret-volume
secret:
secretName: db-secret4. 最佳实践与常见错误
- 最佳实践:
- Secret需配合RBAC限制访问权限
- 配置文件变更后需重启Pod(除非使用Sidecar自动更新)
- 敏感数据优先用Secret(避免ConfigMap)
- 常见错误:
- 误将Secret当ConfigMap使用(导致敏感信息泄露)
- 忘记Base64解码(查看Secret时需
echo '编码值' | base64 -d) - 挂载路径冲突(多个卷避免重复路径)
5. 扩展知识
- 不可变Secret:设置
immutable: true提升安全性 - 加密方案:结合KMS或External Secrets实现加密存储
- 与Deployment集成:实际场景中通常将ConfigMap/Secret关联到Deployment而非直接定义在Pod