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。