Kubernetes1.3:POD生命周期管理


轉:http://blog.csdn.net/horsefoot/article/details/52324830

(一)  核心概念

Pod是kubernetes中的核心概念,kubernetes對於Pod的管理也就是對Pod生命周期的管理,對Pod生命周期的管理也就是對Pod狀態的管理,我們通過下面Pod相關的各個實體信息關系圖可以分析出來kubernetes是如何管理Pod狀態的。

 

(二)  結構體介紹

Pod這個結構體中有個變量Status,通過這個變量可以得到每個Pod的狀態信息,這個Status變量對應的結構體是PodStatus,從圖中可以看出來Pod狀態信息同四個變量相關,分別是Phase、Conditions、InitContainerStatuses和ContainerStatuses,這四個變量分別表示Pod所在生命周期階段、Pod生命周期需要滿足的條件、Pod中所有初始化容器狀態、Pod中所有應用容器狀態。

變量Phase有五個可選的值,分別是Pending、Running、Succeeded、Failed和Unknown。

 

這個五個值的含義分別是:

1)       Pending:kubernetes已經開始創建Pod,但是Pod中的一個或多個容器還沒有被啟動。比如Pod正處在應該被分配到哪個節點上這個調度過程中,或者kubernetes還在從鏡像倉庫中下載Pod中容器鏡像這個下載過程中。

2)       Running:kubernetes已經將Pod分配到節點上,並且Pod中的所有容器都啟動了。還包括Pod中至少有一個容器仍然在運行狀態,或者正在重新啟動狀態。

3)       Succeeded:Pod中的所有容器都處在終止狀態,並且這些容器是自主正常退出到終止狀態的,也就是退出代碼為0,而且kubernetes也沒有重啟任何容器。

4)       Failed:Pod中的所有容器都處在終止狀態,並且至少有一個容器不是正常終止的,也就是退出代碼不為0,或者是由於系統強行終止的。

5)       Unknown:由於一些特殊情況無法獲取Pod狀態,比如由於網絡原因無法同Pod所在的主機通訊。

變量Phase的取值還取決於結構體PodSpec中的RestartPolicy變量,這個RestartPolicy變量是用來設置Pod中容器重啟策略的,包括三個可選值,分別是Always、OnFailure和Never。

 

這三個值得含義分別是:

1)       Always:表示對容器一直執行重啟策略。如果不設置RestartPolicy,那么Always是默認值。

2)       OnFailure:表示在容器失敗的時候重啟容器。

3)       Never:表示在對容器不執行重啟策略。

變量Conditions對應結構體PodCondition,在這個結構體中有兩個變量Type和Status。變量Type表示有效的條件類型,變量Status表示每種類型對應的狀態。

變量Type有三個可選的值,分別是PodScheduled、Ready和Initialized。

 

這三個值的含義分別是:

1)       PodScheduled:表示Pod處在調度過程中。

2)       Ready:表示Pod已經能夠提供服務了。

3)       Initialized:表示Pod中所有初始化容器都已經成功啟動了。

變量Status表示每種Type對應的狀態,有三個可選的值,分別是True、False和Unknown。

 

這三個值的含義分別是:

1)       True:表示Pod處於某種類型的有效條件中。

2)       False:表示Pod不在某種類型的有效條件中。

3)       Unknown:表示kubernetes無法判斷Pod是否在某種類型的有效條件中。

變量InitContainerStatuses和ContainerStatuses對應結構體ContainerStatus,記錄Pod中所有初始化容器狀態和所有應用容器狀態,結構體ContainerStatus表示一個容器的狀態,在這個結構體中變量State表示容器當前狀態,變量State對應結構體ContainerState。結構體ContainerState中包括三個變量Waiting、Running和Terminated,分別表示等待狀態、運行狀態和結束狀態,結構體ContainerState中三個變量只能有一個處在生效狀態,如果無法確定哪個剩下,那么會選擇等待狀態。

 

變量Terminated對應結構體ContainerStateTerminated,結構體ContainerStateTerminated中有一個變量ExitCode,通過這個變量來記錄上面提到的容器退出代碼,如果容器正常退出那么退出代碼為0,否則為其他值。

(三)  設置Pod生命周期

設置Pod生命周期,也就是設置結構體PodStatus中變量Phase的值,下面的流程圖展示了如何設置變量Phase的值。

 

在kubernetes1.3的POD中,有兩類容器,一類是系統容器(POD Container),一類是用戶容器(User Container),在用戶容器中,現在又分成兩類容器,一類是初始化容器(Init Container),一類是應用容器(App Container),設置Pod生命周期需要使用到用戶容器。

首先檢查Pod中所有初始化容器狀態,接着檢查Pod中所有應用容器狀態,接着根據這兩類容器狀態和RestartPolicy來設置Pod生命周期。

如下為根據具體不同的條件設置Pod生命周期的例子:

1.        如果Pod中存在任何一個初始化容器,當這個初始化狀態是Terminated,並且這個初始化容器非正常退出,也就是退出代碼不為0,並且RestartPolicy是Never,那么Pod生命周期為Failed。

2.        如果Pod中存在任何一個初始化容器,當這個初始化容器狀態是Waiting,並且這個初始化容器上一次終止狀態不為空,也就是LastTerminationState不為空,並且這個初始化容器上一次是非正常退出,也就是退出代碼不為0,並且RestartPolicy是Never,那么Pod生命周期為Failed。

3.        如果Pod中存在任何一個應用容器,當這個應用容器狀態是Waiting,並且這個應用容器上一次終止狀態為空,也就是LastTerminationState為空,那么Pod生命周期為Pending。也就是說當Pod中有應用容器沒有開始運行的時候,Pod生命周期為Pending。

4.        如果Pod中所有應用容器都不存在Waiting狀態,或者Pod中存在Waiting狀態的應用容器,但是這些應用容器上一次終止狀態不為空,如果滿足上面兩種情況之一,並且Pod中存在一個Running狀態的應用容器,那么Pod生命周期為Running。也就是說當Pod中所有應用容器都出於正常啟動狀態,並且存在一個狀態是Running的應用容器時,那么Pod生命周期為Running。

5.        如果Pod中不存在Running狀態的應用容器,當滿足這個條件時,如果Pod中存在Terminated狀態的應用容器,或者Pod中存在Waiting狀態的應用容器,並且這些應用容器的上一次終止狀態不為空,這時候如果RestartPolicy是Always,那么Pod生命周期為Running,也就是說Pod中所有應用容器都存在重啟狀態,這時候如果RestartPolicy不是Always,那么如果所有應用容器都正常終止,那么Pod生命周期為Succeeded,這時候如果RestartPolicy為Never,那么如果有一個容器處在失敗狀態,Pod生命周期就是Failed,這時候如果RestartPolicy是OnFailure,那么如果有一個容器處在重啟失敗狀態,Pod生命周期就是Running。

6.        如果都不滿足上面條件,那么Pod生命周期默認處在Pending狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM