首页/云/云与容器速查/Secret 密钥管理
Kubernetes68 条

Secret 密钥管理

存放口令、证书、令牌等敏感数据:值默认 base64(编码≠加密),可配 etcd 静态加密与 KMS。类型含 Opaque、dockerconfigjson、tls 等,必须收紧 RBAC。

云与容器速查云更新于 2026-10-13

Secret 是什么

Secret 用来存放口令、令牌、证书等敏感数据,可以被 Pod 以环境变量或文件的方式读取。必须记住一点:Secret 默认只是 base64 编码,不是加密——任何能读取该对象的人都能立刻还原出明文。因此它真正的安全边界来自 RBAC 权限、etcd 静态加密与访问审计,而不是编码本身。

基本信息

创建方式kubectl create secret generic 名称 --from-literal 键值,或用 YAML
常用类型Opaque 通用、dockerconfigjson 镜像仓库凭证、tls 证书
使用方式env 或 envFrom 注入环境变量,或作为卷挂载成文件
安全要点RBAC 限制 get 与 list、开启 etcd 加密、审计读取行为
作用范围命名空间级对象,跨命名空间使用需要各建一份

典型使用场景

  • 数据库口令:以环境变量注入应用,避免写进镜像与代码
  • 镜像拉取凭证:为私有仓库创建 docker-registry 类型 Secret
  • 证书托管:tls 类型 Secret 直接被 Ingress 引用完成 HTTPS
  • 配置文件注入:把敏感配置文件以卷方式挂载到容器指定路径
  • 第三方令牌:API Key、回调签名密钥等统一由 Secret 承载

Secret 示例

Secret 示例
apiVersion: v1
kind: Secret
metadata:
  name: db-pass
type: Opaque
stringData:                  # stringData 直接写明文,提交时自动转 base64
  password: "S3cr3t-Example"
---
# 在容器中以环境变量方式引用
env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-pass
        key: password

类型与用途对照

类型内容典型消费方
Opaque任意键值对应用环境变量与配置文件
dockerconfigjson镜像仓库认证信息私有仓库镜像拉取
tls证书与私钥Ingress 终止 HTTPS
service-account-token服务账户令牌由平台按需签发与挂载
能读 Secret 就能拿到业务密码。默认服务账户不应该有列出 Secret 的权限,应按最小权限收紧 RBAC,并开启 etcd 静态加密以防底层数据被直接读取。
以环境变量注入的 Secret 不会自动更新:改完 Secret 后需要重建 Pod 才生效;以卷方式挂载的会在一段时间后自动同步,延迟通常在一分钟以内。
证书轮换时优先用卷挂载而不是环境变量:卷方式能在不重启的情况下完成更新,应用只要在读取时重新打开文件即可;环境变量注入则必须重建 Pod。

易错点

  • 把 base64 当加密,认为 Secret 文件落到哪里都安全
  • Secret 通过环境变量注入后直接改对象就想热更新,实际必须重启 Pod
  • 把 Secret 明文写进 Git 仓库的 YAML 里,凭证随代码一起泄露
  • 给默认服务账户开放了列出 Secret 的权限,任何 Pod 都能读到全命名空间的密码

数据来源与参考

  • Kubernetes Docs:Secrets
  • Kubernetes Docs:Encrypting Secret Data at Rest

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌