使用oc debug调试Pod时拉取latest镜像而非原Pod镜像的问题
解决oc debug拉取最新镜像而非终止Pod原镜像的问题
你遇到的这个情况太懂了——明明是想调试已经挂掉的Pod,结果oc debug直接拉了latest标签的新镜像,完全达不到复现场景的目的,确实反直觉,说它是个“坑”都不为过。除了在DeploymentConfig里硬写镜像ID之外,还有这几个办法能强制拉取原Pod用的镜像:
直接从终止Pod的状态里提取镜像ID
终止的Pod其实在status里保留了当时运行的镜像完整ID(带digest),你可以用这个命令直接获取:oc get pod <terminated-pod-name> -o jsonpath='{.status.containerStatuses[0].imageID}'拿到之后,在
oc debug里指定这个镜像:oc debug pod/<terminated-pod-name> --image=<获取到的完整镜像ID>这个方法本质还是用镜像ID,但获取方式更直接,不用去翻DeploymentConfig的历史。
借助OpenShift镜像流的历史记录
如果你的镜像通过ImageStream管理,镜像流会保留每个标签的历史镜像版本。你可以查看latest标签的历史:oc get istag <appname>:latest -o yaml在输出的
history字段里找到对应旧版本的镜像digest,然后用digest指定镜像:oc debug pod/<terminated-pod-name> --image=<registry-url>/<appname>@sha256:<旧版本digest>或者用更简洁的命令直接提取当前
istag对应的旧镜像(如果还在历史里的话):oc get imagestreamtag <appname>:latest -o jsonpath='{.image}'给旧镜像打临时专属标签
如果你能找到旧镜像的digest,可以给它打一个临时的调试标签,避免和latest混淆:oc tag <registry-url>/<appname>@sha256:<旧版本digest> <appname>:debug-old-pod之后用这个临时标签来调试:
oc debug pod/<terminated-pod-name> --image=<appname>:debug-old-pod调试完成后,记得删掉这个临时标签:
oc tag -d <appname>:debug-old-pod
另外补充一句:oc debug默认会解析镜像标签到最新版本,这个行为确实没在官方文档里明确说明,大概率是因为工具默认优先使用最新镜像,但对于调试终止Pod的场景来说,确实不够友好,算是个容易踩的逻辑坑。
内容的提问来源于stack exchange,提问作者ptrk
相关产品推荐
相关产品推荐

