私有镜像拉取凭据怎么配
私有镜像拉取凭据的标准做法:把 docker-registry 类型 Secret 挂到工作负载或 ServiceAccount 上。Secret 不跨命名空间共享,多命名空间要么逐一复制,要么用平台级分发方案。优先考虑用平台身份或短期令牌换取拉取凭据,减少长期账号暴露面,也更便于审计。
基本信息
| 创建 | kubectl create secret docker-registry regcred --docker-server=... --docker-username=... --docker-password=... |
|---|---|
| 挂载 | Pod spec 的 imagePullSecrets 或 ServiceAccount 默认拉取凭据 |
| 跨命名空间 | Secret 不跨命名空间共享,按命名空间分发或使用平台方案 |
| 类型 | kubernetes.io/dockerconfigjson |
| 优先 | 能免长期凭据就免:平台身份或短期令牌方案 |
典型使用场景
- 单命名空间:直接挂到 Pod 或 ServiceAccount
- 多命名空间:脚本化复制或平台分发
- 统一入口:挂到 ServiceAccount 让同 SA 的 Pod 默认可用
- 凭据轮换:更新 Secret 后滚动重启工作负载
- 拉取失败排查:结合 Pod 事件定位是凭据还是网络问题,不同错误码指向不同方向
- 平台化:用云厂商工作负载身份替代 Secret,凭据生命周期交给平台
创建与挂载
创建与挂载
# 创建拉取凭据(注意命名空间归属)
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username="$REGISTRY_USER" \
--docker-password="$REGISTRY_PASSWORD" -n prod
# 挂到 ServiceAccount,该 SA 下的 Pod 默认可用拉取凭据常见失败信号
| 现象 | 原因 | 处理 |
|---|---|---|
| ImagePullBackOff | 凭据缺失或过期 | 查 Secret 与 Pod 事件 |
| 401 unauthorized | 用户名密码错误或令牌过期 | 更新 Secret 并滚动重启 |
| 跨命名空间拉不到 | Secret 没复制过去 | 按命名空间分发 |
优先使用云侧工作负载身份或短期令牌换取拉取凭据:减少长期账号。
排查先看事件:kubectl describe pod 里 Failed to pull 的错误码比猜更可靠。
更新 Secret 后已运行的 Pod 不会自动换凭据:需要滚动重启让新凭据生效。
把 Secret 分发脚本化:新命名空间创建即自动带上拉取凭据,减少手工遗漏。
已有 docker login 登录态的机器可直接整体导入:kubectl create secret generic regcred --from-file=.dockerconfigjson=$HOME/.docker/config.json --type=kubernetes.io/dockerconfigjson;CI 场景则用变量拼装,避免把带登录态的机器文件带进流水线。