用前面學的 set image,把版本換成一個根本不存在的 tag
kubectl set image deployment/web nginx=nginx:not-a-real-tag -n ithome-lab
kubectl get pods -n ithome-lab

原本以為服務會掛掉結果沒有,舊的三個 Pod 好好地繼續跑,只有新開的那一個卡住
K8s 要先確認新的 Pod 起得來,才會去動舊的。新的起不來,它就停在那邊不會往下走,舊的一個都不會被砍。所以這種故障使用者其實無感,你只會發現部署一直沒完成
等一下再看一次
kubectl get pods -n ithome-lab

狀態變了。這兩個是同一件事的兩個階段,ErrImagePull 是這次拉失敗,ImagePullBackOff 是失敗太多次進入退避重試,等待時間會越拉越長。看到後面那個就代表它已經試過好幾輪了
照流程往下走
kubectl describe pod <POD_NAME> -n ithome-lab

Events 裡面會有 Failed to pull image 開頭的訊息,後面接的錯誤內容是關鍵。找不到 tag 的話會是 manifest unknown 之類的字眼,那就是 tag 打錯或那個版本根本不存在
kubectl logs <POD_NAME> -n ithome-lab

logs 這時候不會有程式輸出,而是直接回一個錯誤,告訴你 container is waiting to start 加上原因。這個結果本身就是資訊,代表程式還沒開始跑,問題發生在更前面的階段,就不再往程式邏輯的方向找了
順帶ImagePullBackOff 不是只有 tag 打錯這一種可能。私有 registry 沒有給 imagePullSecrets 會長得很像,訊息裡會出現 unauthorized;網路連不到 registry 也是,訊息會是連線逾時。三種的 STATUS 一模一樣,要靠 Events 裡面那一行錯誤字串分辨
退回上一版
kubectl rollout undo deployment/web -n ithome-lab
kubectl rollout status deployment/web -n ithome-lab
kubectl get pods -n ithome-lab

明天見 :D
