挂到 SA 上就自动继承
把镜像仓库凭据(docker-registry 类型的 Secret)写进 ServiceAccount 的 imagePullSecrets 后,该账号下的 Pod 都会自动带上这份凭据,kubelet 拉取私有镜像时用它认证。相比在每份工作负载里重复声明,这种方式一次修改即可覆盖该账号下所有新建 Pod;如果 Pod 自己也声明了 imagePullSecrets,两处凭据会合并使用,任一条能通过认证即可拉取成功。
基本信息
| 适用平台 | Kubernetes 各版本,ServiceAccount 字段 |
|---|---|
| 关键字段 | ServiceAccount 的 imagePullSecrets |
| 生效范围 | 该账号下新建或重建的 Pod |
| 合并规则 | Pod 级声明与 SA 级声明合并,依次尝试认证 |
| 前置条件 | Secret 必须与 ServiceAccount 位于同一命名空间 |
典型使用场景
- 统一私有仓库认证:一个账号下所有工作负载共享同一份凭据
- 批量接入新仓库:改一次 SA 就让后续新建 Pod 都能拉取
- 多环境隔离:不同命名空间各用各自的机器人账号凭据
- 迁移收敛:把散落在各工作负载里的重复声明收敛到 ServiceAccount
- 故障定位:确认真实生效的是哪一份凭据,再判断认证为何失败
绑定与核对
绑定与核对
kubectl patch serviceaccount app-sa -n prod --type merge \
-p '{"imagePullSecrets":[{"name":"regcred"}]}'
kubectl get sa app-sa -n prod -o yaml | grep -A3 imagePullSecrets
kubectl get pod web-x -n prod -o jsonpath='{.spec.imagePullSecrets}' # 核对实际注入结果
kubectl describe pod web-x -n prod | grep -i -A3 events # 拉取失败时看事件配置位置与生效范围
| 配置位置 | 写法 | 生效范围 |
|---|---|---|
| ServiceAccount | imagePullSecrets 声明 Secret 名称 | 该账号下新建或重建的 Pod |
| Pod | spec.imagePullSecrets | 仅该 Pod,与 SA 级凭据合并 |
| 命名空间的 default 账号 | 修改后覆盖面很广 | 该命名空间内未显式指定账号的 Pod |
| 跨命名空间引用 | 不生效 | 凭据 Secret 必须与账号同命名空间 |
更新 ServiceAccount 不会影响已经运行的 Pod:它们只在创建时读取该字段,需要重建 Pod 才会带上新凭据,因此「改完还是拉不动」往往只是没有触发重建。
覆盖面大小取决于账号的使用情况:动 default 账号等于影响该命名空间下所有未显式指定账号的工作负载,改动前先列出引用方。