kubernetes中安全存储数据库密码与密钥须避免明文暴露,应使用secret资源:支持从字面值或文件创建opaque类型secret(base64编码),推荐以volume方式挂载至/tmpfs内存路径并设defaultmode: 0400权限,或通过envfrom/env+secretkeyref注入环境变量,最后用kubectl get secret、exec进入pod验证内容与权限。

在Kubernetes中安全存储数据库密码与密钥,必须避免将明文凭据写入Deployment YAML、环境变量字段或容器镜像——这些做法会导致敏感信息在Git仓库、日志、进程列表(ps aux)或/proc/[pid]/environ中直接暴露。
创建Secret存储数据库凭据
方法一:从字面值快速创建(适合开发/测试环境)
执行命令:kubectl create secret generic db-credentials --from-literal=username=appuser --from-literal=password='P@ssw0rd!2026'。
这一步会自动生成Opaque类型的Secret,所有value均被base64编码后存入etcd。注意:【password字段值必须用单引号包裹,否则Shell可能解析特殊字符如!导致实际存入错误密码】。
方法二:从文件创建(推荐用于生产,避免Shell转义风险)
先准备两个纯文本文件:username.txt(内容为appuser,末尾无换行)、password.txt(内容为P@ssw0rd!2026,同样无换行)。
运行:kubectl create secret generic db-credentials --from-file=username=username.txt --from-file=password=password.txt。
该方式由kubectl自动base64编码,不经过Shell解释器,彻底规避引号、空格、$、!等字符引发的凭据截断或注入问题。
将Secret以Volume方式挂载到Pod
这是最安全的消费方式:Secret内容以tmpfs内存文件形式挂载,节点重启即销毁,永不落盘。
在Pod spec中添加volume和volumeMounts:
spec:
volumes:
- name: db-creds
secret:
secretName: db-credentials
containers:
- name: app-container
volumeMounts:
- name: db-creds
mountPath: /etc/secrets/db
readOnly: true
挂载后,容器内可读取/etc/secrets/db/username和/etc/secrets/db/password两个文件,内容为原始明文。
⚠️重要:默认文件权限为644(所有用户可读)。若应用允许,务必追加defaultMode: 0400到volume定义中,强制文件仅owner可读,防止同Pod内其他容器越权读取。
通过环境变量注入Secret值
仅适用于少量键值且应用不支持文件读取的场景;必须接受Pod重启才能生效的限制。
在container spec中添加envFrom或单个env:
方式1(批量注入):
envFrom:
- secretRef:
name: db-credentials
此时username和password会作为USERNAME、PASSWORD环境变量注入(key名自动转为大写+下划线)。
方式2(精确控制变量名):
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASS
valueFrom:
secretKeyRef:
name: db-credentials
key: password
这种方式可自定义环境变量名,避免大写转换带来的兼容性问题。
验证Secret是否正确加载
第一步:确认Secret已存在于目标命名空间
运行kubectl get secret db-credentials -n default,输出应包含AGE列且无报错。
第二步:进入Pod调试容器
执行kubectl exec -it <pod-name> -- sh</pod-name>,然后检查挂载点:ls -l /etc/secrets/db/应显示两个文件,cat /etc/secrets/db/username应输出appuser。
第三步:检查环境变量(如使用env方式)
在shell中运行printenv | grep DB_,应看到DB_USER=appuser和DB_PASS=P@ssw0rd!2026。
若任一环节失败,优先检查Pod事件:kubectl describe pod <pod-name></pod-name>,重点关注Events区域是否有FailedMount或InvalidValue报错。











