kubernetes secret 用于安全存储敏感信息,以 base64 编码存于 etcd(未默认加密),需配合 rbac、静态加密、挂载替代环境变量、不可变设置及外部工具(如 sealed secrets)等措施强化防护。

在 Linux 环境中使用 Kubernetes Secret 管理敏感环境变量,核心是避免明文暴露密码、API 密钥等信息,同时确保容器启动时能安全获取这些值。Secret 本身不加密存储,但配合 RBAC、挂载方式和最小权限原则,可显著降低泄露风险。
创建 Secret 的两种推荐方式
优先使用文件方式创建,避免命令行历史或 shell 日志残留敏感内容:
-
从文件生成(更安全):先将值写入无换行的临时文件,再创建 Secret
echo -n 'admin' > ./username.txt<br>echo -n 'P@ssw0rd!2026' > ./password.txt<br>kubectl create secret generic app-creds --from-file=username.txt --from-file=password.txt
-
字面量创建(适合简单场景):必须用单引号包裹含特殊字符的值,防止 shell 解析错误
kubectl create secret generic db-secret --from-literal=username='prod-user' --from-literal=password='s3cr3t!'
在 Pod 中安全注入环境变量
不建议直接将整个 Secret 全量注入为环境变量,尤其当 Secret 包含多组凭据时。应按需引用指定 key:
- 在容器 spec 中用
env.valueFrom.secretKeyRef显式绑定某一个 keyenv:<br>- name: DB_USER<br> valueFrom:<br> secretKeyRef:<br> name: app-creds<br> key: username.txt
- 注意:Secret 中的 key 名默认是文件名(如
username.txt),不是文件内容;若用--from-literal创建,则 key 就是 literal 名(如username) - 环境变量方式无法自动热更新——修改 Secret 后必须重启 Pod 才能生效
比环境变量更安全的替代方案:挂载为文件
敏感数据以 tmpfs 内存卷形式挂载,不落盘、不进进程环境变量,应用通过读取文件获取值:
- 在 Pod 中定义 volume 和 volumeMount:
volumes:<br>- name: creds-volume<br> secret:<br> secretName: app-creds<br>volumeMounts:<br>- name: creds-volume<br> mountPath: /etc/app/secret<br> readOnly: true
- 挂载后,容器内会生成
/etc/app/secret/username.txt和/etc/app/secret/password.txt,应用用标准文件 I/O 读取 - 该方式支持自动更新(约10秒内同步),且避免了环境变量被 ps 或 /proc/$PID/environ 泄露的风险
必须配套的安全加固措施
仅靠 Secret 资源本身不足以保障安全,需叠加以下控制:
-
启用 etcd 静态加密:在 API Server 启动参数中配置
--encryption-provider-config,确保 Secret 数据在磁盘上加密存储 -
限制 RBAC 权限:禁止普通开发者对 Secret 执行
list或watch,只授予其 Pod 所在命名空间的get权限(且仅限所需 Secret) -
设置 Secret 为不可变(immutable):添加
immutable: true字段后,Secret 无法被修改,防止误操作或恶意覆盖 -
避免提交 Secret 到 Git:YAML 中的
data字段虽是 Base64,但仍属敏感信息;应通过 CI/CD 流水线动态生成,或使用 SealedSecrets 等工具加密后提交











