Pod常見的狀態和重啟策略
- 常見的pod狀態
- 第一階段:
- 第二階段:
- 擴展:
- pod重啟策略
- 測試Always重啟策略
- 正常停止容器內的tomcat服務
- 非正常停止容器里的tomcat服務
- 測試never重啟策略
- 正常停止容器里的tomcat服務
- 非正常停止容器里的tomcat服務
- 測試OnFailure重啟策略
- 正常停止容器里的tomcat服務
- 非正常停止容器里的tomcat服務
常見的pod狀態
第一階段:
-
掛起(Pending):
1、正在創建Pod但是Pod中的容器還沒有全部被創建完成,處于此狀態的Pod應該檢查Pod依賴的存儲是否有權限掛載、鏡像是否可以下載、調度是否正常等
2、我們在請求創建pod時,條件不滿足,調度沒有完成,沒有任何一個節點能滿足調度條件,已經創建了pod但是沒有適合它運行的節點叫做掛起,調度沒有完成。 -
失敗(Failed):
Pod 中的所有容器都已終止了,并且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態退出或者被系統終止。 -
未知(Unknown):
未知狀態,所謂pod是什么狀態是apiserver和運行在pod節點的kubelet進行通信獲取狀態信息的,如果節點之上的kubelet本身出故障,那么apiserver就連不上kubelet,得不到信息了,就會看Unknown,通常是由于與pod所在的node節點通信錯誤。 -
Error 狀態:
Pod 啟動過程中發生了錯誤 -
成功(Succeeded):
Pod中的所有容器都被成功終止,即pod里所有的containers均已terminated。
第二階段:
- Unschedulable:Pod不能被調度, scheduler沒有匹配到合適的node節點
- PodScheduled:pod正處于調度中,在scheduler剛開始調度的時候,還沒有將pod分配到指定的node,在篩選出合適的節點后就會更新etcd數據,將pod分配到指定的node
- Initialized:所有pod中的初始化容器已經完成了
- ImagePullBackOff:Pod所在的node節點下載鏡像失敗
- Running:Pod內部的容器已經被創建并且啟動。
擴展:
- Evicted狀態:出現這種情況,多見于系統內存或硬盤資源不足,可df-h查看docker存儲所在目錄的資源使用情況,如果百分比大于85%,就要及時清理下資源,尤其是一些大文件、docker鏡像。
- CrashLoopBackOff:容器曾經啟動了,但可能又異常退出了
pod重啟策略
- Pod的重啟策略(RestartPolicy)應用于Pod內的所有容器,當某個容器異常退出或者健康檢查失敗時,kubelet將根據 重啟策略來進行相應的操作。
- Pod 的 spec 中包含一個 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默認值是 Always。
- Always:只要容器異常退出,kubelet就會自動重啟該容器。(這個是默認的重啟策略)
- OnFailure:當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器。
- Never:不論容器運行狀態如何,kubelet都不會重啟該容器。
測試Always重啟策略
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:name: demo-podnamespace: defaultlabels:app: myapp
spec:restartPolicy: Alwayscontainers:- name: tomcat-pod-javaports:- containerPort: 8080image: xianchao/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresent
kubectl apply -f pod.yaml
正常停止容器內的tomcat服務
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
查看pod狀態:發現正常停止容器里的tomcat服務,容器重啟了一次,pod又恢復正常了
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 1/1 Running 1 (5s ago) 3m24s
非正常停止容器里的tomcat服務
kubectl exec -it demo-pod -- /bin/bash
kill 1
可以看到容器終止了,并且又重啟一次,重啟次數增加了一次
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 1/1 Running 2 (5s ago) 3m24s
測試never重啟策略
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:name: demo-podnamespace: defaultlabels:app: myapp
spec:restartPolicy: Nevercontainers:- name: tomcat-pod-javaports:- containerPort: 8080image: xianchao/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresent
kubectl apply -f pod.yaml
正常停止容器里的tomcat服務
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
查看pod狀態:發現正常停止容器里的tomcat服務,pod正常運行,容器沒有重啟
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 1/1 Completed 0 3m24s
非正常停止容器里的tomcat服務
kubectl exec -it tomcat-pod -- /bin/bash
kill 1
可以看到容器狀態是error,并且沒有重啟,這說明重啟策略是never,那么pod里容器服務無論如何終止,都不會重啟
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 1/1 error 0 3m24s
測試OnFailure重啟策略
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:name: demo-podnamespace: defaultlabels:app: myapp
spec:restartPolicy: OnFailurecontainers:- name: tomcat-pod-javaports:- containerPort: 8080image: xianchao/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresent
kubectl apply -f pod.yaml
正常停止容器里的tomcat服務
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
查看pod狀態:發現正常停止容器里的tomcat服務,退出碼是0,pod里的容器不會重啟
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 0/1 complete 0 3m24s
非正常停止容器里的tomcat服務
kubectl exec -it tomcat-pod -- /bin/bash
kill 1
上面可以看到非正常停止pod里的容器,容器退出碼不是0,那就會重啟容器
kubectl get podNAME READY STATUS RESTARTS AGE
demo-pod 1/1 running 1 3m24s