Kubernetes StatefulSet(v1.8)镜像更新遇ImagePullBackOff故障的恢复咨询
解决StatefulSet镜像更新失败卡壳的恢复方案
这种镜像拉取失败导致StatefulSet滚动更新停在半路上的情况,我日常运维里碰到好多次了,给你两种靠谱的处理思路,按需选就行:
方案一:先回滚到正常版本,再重新发起正确更新
如果不想在错误状态下折腾,先把集群拉回稳定状态是最稳妥的:
- 先查看你的StatefulSet的修订历史,找到之前正常的版本号:
要是想看某个版本的具体配置(比如镜像信息),加kubectl rollout history statefulset <你的StatefulSet名称>--revision=<版本号>就行:kubectl rollout history statefulset <你的StatefulSet名称> --revision=2 - 回滚到上一个正常版本(如果知道具体版本号,也可以用
--to-revision=<版本号>指定):kubectl rollout undo statefulset <你的StatefulSet名称> - 等所有Pod都恢复到Running状态后,修正StatefulSet里的镜像名称(比如用
kubectl edit statefulset <你的StatefulSet名称>修改spec.template.spec.containers里的image字段),然后重新触发滚动更新:kubectl rollout restart statefulset <你的StatefulSet名称>
方案二:直接修正镜像后恢复更新
如果不想回滚,想直接在当前状态下修复继续:
- 先修正StatefulSet的镜像配置,把错误的镜像名改成正确的:
或者用命令行直接更新镜像:kubectl edit statefulset <你的StatefulSet名称>kubectl set image statefulset/<你的StatefulSet名称> <容器名>=<正确的镜像名:标签> - 接下来处理那个卡在
ImagePullBackOff的Pod:- 最简单的方式就是删除这个Pod,StatefulSet会按照顺序重新创建它,这时候就会拉取你刚修正的正确镜像:
kubectl delete pod <卡住的Pod名称> - 也可以直接触发整个StatefulSet的滚动更新,让它继续完成剩下的Pod更新,同时重新拉取第一个Pod的镜像:
kubectl rollout restart statefulset <你的StatefulSet名称>
- 最简单的方式就是删除这个Pod,StatefulSet会按照顺序重新创建它,这时候就会拉取你刚修正的正确镜像:
额外注意事项
- 要是镜像拉取失败是因为权限问题(比如私有仓库没配置密钥),记得先给StatefulSet配置好
imagePullSecrets,不然就算镜像名对了还是拉不下来 - StatefulSet默认的滚动更新策略是
RollingUpdate,maxUnavailable默认是1,所以只要第一个Pod恢复正常,它就会自动继续更新后面的Pod,不用额外操作
内容的提问来源于stack exchange,提问作者Chip Morningstar
相关产品推荐
相关产品推荐

