对象定位
Secret 按用途区分类型,类型决定了必须提供哪些键、API 会做何种校验、消费方如何使用。适用平台是 Kubernetes。常见类型有 Opaque(通用键值)、kubernetes.io/tls(证书与私钥)、kubernetes.io/dockerconfigjson(镜像仓库凭据)、kubernetes.io/basic-auth(用户名密码)、kubernetes.io/ssh-auth(SSH 私钥)以及 ServiceAccount Token 相关类型。选错类型会导致创建被拒或消费方读不到预期字段。
基本信息
| 适用平台 | Kubernetes,命名空间级资源 |
|---|---|
| 存储形式 | data 为 base64 编码,stringData 为写入时的明文便利字段 |
| 默认类型 | 不写 type 时等价于 Opaque |
| 加密状态 | 是否落盘加密取决于集群是否配置了 EncryptionConfiguration |
典型使用场景
- 存数据库口令:用 Opaque 或 basic-auth 存用户名密码,通过 env 或卷注入
- 存镜像仓库凭据:dockerconfigjson 类型供 kubelet 拉取私有镜像
- 存 TLS 证书:tls 类型交给 Ingress 或网关引用
- 存 SSH 私钥:ssh-auth 类型供构建、同步类任务使用
- 按类型巡检:用 field-selector 找出集群里所有 tls 类型 Secret 做证书盘点
查看与创建
查看与创建
kubectl get secret app-tls -o jsonpath='{.type}' # 看类型
kubectl get secrets -A --field-selector type=kubernetes.io/tls # 按类型筛选
kubectl create secret generic app-secret --from-literal=APP_MODE=prod # Opaque
kubectl create secret docker-registry regcred --docker-server=registry.example.com --docker-username=robot --docker-password=xxx
kubectl get secret app-secret -o jsonpath='{.data}' | head -c 200 # base64 内容,仅排障用常用类型
| 类型 | 用途 | 关键字段 |
|---|---|---|
| Opaque | 通用键值凭据 | data/stringData 自定义键 |
| kubernetes.io/tls | TLS 证书与私钥 | tls.crt / tls.key |
| kubernetes.io/dockerconfigjson | 镜像仓库认证 | .dockerconfigjson |
| kubernetes.io/basic-auth | 用户名密码 | username / password |
| kubernetes.io/ssh-auth | SSH 私钥 | ssh-privatekey |
| kubernetes.io/service-account-token | SA 令牌(较新版本不再自动生成) | token / ca.crt |
Secret 的 data 是 base64 编码而非加密:只要有权读对象就能还原明文,权限控制要按最小授权设计。
不同版本的 ServiceAccount Token 行为有差异(长期令牌与 TokenRequest 投影卷并存),依赖自动生成 token 的旧系统升级前先确认版本行为。
选型与加固要点
- 按消费方倒推类型:给 Ingress 用必须选 tls,给 kubelet 拉镜像必须选 dockerconfigjson,否则对方读不到字段
- 优先用专用类型而不是 Opaque:专用类型会做键校验,能在创建阶段就暴露拼写错误
- 结合 RBAC 收窄读权限:Secret 明文可达,能读的人越少越好,尽量避免用通配规则授权
- 落盘加密单独确认:默认只做 base64 编码,静态加密需要在集群层面配置,不要假设已开启
- 凭据轮换要有流程:Secret 更新后依赖它的工作负载通常需要重建 Pod 才能拿到新值