1. Wrong Container Image / Invalid Registry Permissions
當pod狀態爲ErrImagePull
或ImagePullBackOff
時,通常是由於以下3個原因(在排查網絡故障的前提下):
- 鏡像tag寫錯
- 鏡像不存在,或拉取的鏡像倉庫地址寫錯
- 沒有拉取鏡像的權限(漏配了
imagePullSecrets
)
2. Application Crashing after Launch
當看到pod出現CrashLoopBackOff
狀態時,說明K8S試圖啓動這個pod,但是pod內有一個或多個的容器啓動失敗。可以通過過describe
來查看pod的Event信息,通常從這些信息中可以找到Reason
和Exit Code
等提示信息。
對於應用的失敗,當然少不了查看應用日誌。如果應用日誌是輸出到stdout
的話(建議這樣),就可以使用kubectl logs
命令來查看日誌。
小技巧:
對於pod被重啓的情況,通常有用的日誌信息在之前的容器,這時,可以加上--previous
參數來查看容器前一個實例的日誌
3. Missing ConfigMap or Secret
ConfigMap和Secret是在應用運行時將配置等信息注入最佳實踐方式。但是,如果在應用啓動前忘了創建ConfigMap或Secret,將會導致pod啓動失敗。
Missing ConfigMap
當pod要用到一個還沒創建的ConfigMap時,狀態會顯示爲RunContainerError
。此時用kubectl describe
可以查看事件信息,會有類似於:configmaps xxxxxxx not found
的事件提示信息。
Missing Secret
假設pod將把名爲myothersecret
的Secret掛載作爲數據卷,當myothersecret
還並沒有生成:
# missing-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
volumeMounts:
- mountPath: /etc/secret/
name: myothersecret
restartPolicy: Never
volumes:
- name: myothersecret
secret:
secretName: myothersecret
執行kubectl create -f missing-secret.yaml
後,會發現pod狀態一直爲ContainerCreating
。同樣,通過kubectl describe
查看事件信息,會有類似於:secrets "myothersecret" not found
的提示。
…未完待續