kubectl get secret regcred -o yaml | grep dockerconfigjson
kubectl create secret docker-registry regcred --docker-server=registry.example.com --docker-username=ci --docker-password=***
kubectl patch sa default -p '{"imagePullSecrets":[{"name":"regcred"}]}'
Pod 报 ImagePullBackOff,describe 里写 Failed to pull image: 401 Unauthorized,secret 是三个月前建的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,docker-registry 类型的 secret 里存的是当时登录拿到的 token,仓库开启短期凭证后 token 到期,kubelet 每次拉取都返回 401。secret 对象还在,事件里不会提示过期。
这次卡住的地方就在「镜像拉取密钥过期」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:把 secret 里的 dockerconfigjson 解出来看 auth 对应账号;重新 docker login 生成配置 用 docker-server 指定仓库地址;删除旧 secret 重建 再 patch 到 ServiceAccount 的 imagePullSecrets;新建一个 Pod 验证能拉取 别只重启旧 Pod。
改完只确认一件事:新建 Pod 的 events 里出现 Successfully pulled image ImagePullBackOff 消失。
