轉: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狀態。