##Life cycle features
Podも人間のようにLife Cycleがある。
Life Cycleは各ステップで行える行動が違う特徴がある。
Podも、そのステップに基づいて主要行動があり、ReadinessProbeやLivenessProbe、Qos、Policyなどいくつかの機能がPodの特定のステップと密接な関係があるのでLife cycleについてよく知っておく必要がある。
##Status Struct
Podを作成した後、作成内容を見るとStatusがある。
Statusは以下の情報(属性)がある。
・Phase:Podの全体の状態を表す
・Conditions:Podが生成され、実行されるステップがあるが、そのステップと状態を表す
・State(Container Statuses):Podの中にはContainerがあり、ContainerごとStateがあって、Containerの状態を表す
Phase
まず、Podを代表するPhaseは「Pending、Running、Succeeded、Failed、Unknown」5つの状態がある。
上の図はPending状態である(phase:Pending)
Conditions
Conditionsは4つの種類があり(上の図のconditionsのtype)、ReasonというConditionsの詳細を示す項目もある。
statusはTrue/Falseがあり、Falseの場合はreasonに原因が記載される。
上の図の「reason:ContainersNotReady」はContainer作業がまだ進行中であることがわかる。
Containers
Containerの状態を見ると、Stateとして「Wating、Running、Terminated」3つの状態がある。
Conditionsのようにreasonもある。
上の図のstate:watingは、Containerを作成しているからwatingになっている。
原因はImageIDの値がないことを見ればまだImageがDownloadされてないからwatingになっていると考えられる。
##Pod Lifecycle Overview
Podのメイン状態を表すのはPhaseだが、この状態がどのように変化し、その変化に応じてPodのContainer動作がどうなるのか見てみよう。
【initialized】
上の図のinitContainerというのは本Containerが起動される前に初期値を設定するContainerである。
VolumeやSecurity設定のために事前に設定が必要な場合はPodの作成内容の中にinitContainersという項目で初期化Scriptを設定することができる。
このScriptは本Containerよりも先に実行されて、作業が正常に完了した場合とそもそもScriptを設定しなかった場合は「initialized:True」になるが、失敗すると「initialized:False」になる。
【PodScheduled】
PodがNodeに設定されると「PodScheduled:True」になる。
【Image Download】
ContainerにImageをDownloadする。
上記で説明した2つ(initialized, PodScheduled)のProcessが動いている間にはContainerの状態はwatingになり、
reasonはContainerCreatingになる。
【Restart】
そして本格的にContainerが起動されると、PodとContainerの状態はRunningになる。
通常は正常に起動するが、1つでもContainerが起動中に問題が発生すると全てがRestartになることもある。
その場合のContainerの状態はWatingになり、reasonはCrashLoopBackOffになる。
このようなMessageはKubernetes作業をやっているうちによく目にするMessageである。
PodはContainerのこのような状態をRunningとみなすが、内部のConditionsは[ContainerReady:False]、[Ready:False]になる。
【正常起動】
全てのContainerが正常に起動されると、Conditionsは全てTrueになる。
【注意事項】
サービスを維持する場合の注意すべきことは、Podの状態がRunningでも、内部のContainerがRunningではない場合があるので
Podだけでなく、Containerの状態もモニタリングする必要がある。
【Job/CronJob】
PodがJobやCronJobで作成された場合はJobを実行する時はRunningの状態になるが、Jobが完了したらPodの状態はFailedやSucceededになる。
もしJobを実行しているContainerが1つでも問題が発生した場合はPodの状態がFailedになる。
または全てのContainerがCompletedになるとSucceededになる。
この時、PodのConditionsの値が変更されるが、成功または失敗であっても「ContainerReady:False」、「Ready:False」になる。
【Irregular Case】
Pendingt状態からFailedになるケースもある。PendingやRunning状態でネットワーク障害が発生した場合はPodはUnknown状態になるが問題が早く解決されると既存の状態に戻れるが長い時間問題が解決できなかったらFailedになる。