1. 程式人生 > 其它 >Pod生命週期及重啟策略

Pod生命週期及重啟策略

前言:

  • 本頁面講述 Pod 的生命週期。 Pod 遵循一個預定義的生命週期,起始於 Pending 階段,如果至少 其中有一個主要容器正常啟動,則進入 Running,之後取決於 Pod 中是否有容器以 失敗狀態結束而進入 Succeeded 或者 Failed 階段。
  • Pod 在其生命週期中只會被排程一次。 一旦 Pod 被排程(分派)到某個節點,Pod 會一直在該節點執行,直到 Pod 停止或者 被終止。
  • restartPolicy 適用於 Pod 中的所有容器。restartPolicy 僅針對同一節點上 kubelet 的容器重啟動作。

Pod生命週期:

第一階段:

Pending:
正在建立Pod但是Pod中的容器還沒有全部被建立完成,處於此狀態的Pod應該檢查Pod依賴的儲存是否有許可權掛載、映象是否可以下載、排程是否正常等。

Failed
Pod中有容器啟動失敗而導致pod工作異常。

Unknown
由於某種原因無法獲得pod的當前狀態,通常是由於與pod所在的node節點通訊錯誤。

Succeeded
Pod中的所有容器都被成功終止即pod裡所有的containers均已terminated。

第二階段:

Unschedulable:
Pod不能被排程,kube-scheduler沒有匹配到合適的node節點

PodScheduled
pod正處於排程中,在kube-scheduler剛開始排程的時候,還沒有將pod分配到指定的pid,在篩選出合適的節點後就會更新etcd資料,將pod分配到指定的pod

Initialized
所有pod中的初始化容器已經完成了

ImagePullBackOff:
Pod所在的node節點下載映象失敗

Running
Pod內部的容器已經被建立並且啟動。

Ready
表示pod中的容器已經可以提供訪問服務

Pod重啟策略:

Pod 的 spec 中包含一個 restartPolicy 欄位,其可能取值包括 Always、OnFailure 和 Never。預設值是 Always。

  • Always:在任何情況下,只要容器不在執行狀態,就自動重啟容器。
  • OnFailure:當容器失敗時(容器停止執行且退出碼不為0),k8s自動重啟該容器。
  • Never:不論容器執行狀態如何都不會重啟該容器,Job或CronJob。
    在實際使用時,我們需要根據應用執行的特性,合理設定這三種恢復策略。

對於包含多個容器的 Pod,只有它裡面所有的容器都進入異常狀態後,Pod 才會進入 Failed 狀態。在此之前,Pod 都是 Running 狀態。此時,Pod 的 READY 欄位會顯示正常容器的個數,比如:

點選檢視程式碼
$ kubectl get pod test-liveness-exec
NAME           READY     STATUS    RESTARTS   AGE
liveness-exec   0/1       Running   1          1m

如果一個 Pod 裡只有一個容器,然後這個容器異常退出了。那麼,只有當 restartPolicy=Never 時,這個 Pod 才會進入 Failed 狀態。而其他情況下,由於 Kubernetes 都可以重啟這個容器,所以 Pod 的狀態保持Running 不變,RESTARTS資訊統計了Pod的重啟次數。需要注意的是:雖然是重啟,但背後其實是Kubernetes用重新建立的容器替換了舊容器。