這次建立獨立的 broken-web Deployment,刻意使用不存在的映像標籤,模擬常見部署錯誤。建立指令可能回報成功,因為它只代表資源已被接受,不代表容器已經啟動。稍候查看 Pod,通常會看到下載錯誤或等待重試的狀態。
從查詢結果複製 Pod 名稱,再使用 describe 查看事件。請閱讀實際錯誤內容,判斷是標籤不存在、驗證失敗,還是網路無法連線。雖然本例預先安排了錯誤原因,但真實環境不能只憑狀態名稱就做出相同結論。
確認問題後,先查詢 Deployment 裡的容器名稱,再將映像改為有效標籤。本例明確把容器命名為 nginx,因此更新時可以直接指定。修改 Pod 範本會觸發新的部署流程,應等待完成,再確認新 Pod 已經就緒,形成完整的修復驗證。
修好後可建立臨時連接埠轉送,從本機確認網站能回應。這比只看映像名稱變更更接近使用者實際感受。最後停止轉送並刪除練習 Deployment,留下錯誤症狀、判斷依據與修正方法的筆記,作為日後排障時可重複使用的流程。
broken-web.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: broken-web
spec:
replicas: 1
selector:
matchLabels:
app: broken-web
template:
metadata:
labels:
app: broken-web
spec:
containers:
- name: nginx
image: nginx:tag-does-not-exist-k8s-demo
kubectl apply -f broken-web.yaml
kubectl get pods -l app=broken-web
將 POD_NAME 換成實際名稱:
kubectl describe pod POD_NAME
kubectl get deployment broken-web -o yaml
kubectl set image deployment/broken-web nginx=nginx:1.28
kubectl rollout status deployment/broken-web --timeout=120s
kubectl get pods -l app=broken-web
kubectl port-forward deployment/broken-web 8081:80
瀏覽 修正後的網站,按 Ctrl+C 停止轉送後清理:
kubectl delete deployment broken-web
參考:診斷 Pod 啟動問題