##k8s pod 狀态分析
pod從建立到最後的建立成功會分别處于不同的階段,在源碼中用PodPhase來表示不同的階段:
PodPending PodPhase = "Pending"
PodRunning PodPhase = "Running"
PodSucceeded PodPhase = "Succeeded"
PodFailed PodPhase = "Failed"
PodUnknown PodPhase = "Unknown"
一個pod的完整建立,通常會伴随着各種事件的産生,k8s種事件的種類總共隻有4種:
Added EventType = "ADDED"
Modified EventType = "MODIFIED"
Deleted EventType = "DELETED"
Error EventType = "ERROR"
- Pending 建立pod的請求已經被k8s接受,但是容器并沒有啟動成功,可能處在:寫資料到etcd,排程,pull鏡像,啟動容器這四個階段中的任何一個階段,pending伴随的事件通常會有:ADDED, Modified這兩個事件的産生。
- Running pod已經綁定到node節點,并且所有的容器已經啟動成功,或者至少有一個容器在運作,或者在重新開機中。
- Succeeded pod中的所有的容器已經正常的自行退出,并且k8s永遠不會自動重新開機這些容器,一般會是在部署job的時候會出現。
- Failed pod中的所有容器已經終止,并且至少有一個容器已經終止于失敗(退出非零退出代碼或被系統停止)。
- Unknown 由于某種原因,無法獲得pod的狀态,通常是由于與pod的主機通信錯誤。
以上說到的pod的狀态是粗略的狀态,還有更佳詳細的狀态資訊,在源碼中表示如下:
PodScheduled PodConditionType = "PodScheduled"
PodReady PodConditionType = "Ready"
PodInitialized PodConditionType = "Initialized"
PodReasonUnschedulable = "Unschedulable"
type PodCondition struct {
Type PodConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=PodConditionType"`
Status ConditionStatus `json:"status" protobuf:"bytes,2,opt,name=status,casttype=ConditionStatus"`
LastProbeTime metav1.Time `json:"lastProbeTime,omitempty" protobuf:"bytes,3,opt,name=lastProbeTime"`
LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastTransitionTime"`
Reason string `json:"reason,omitempty" protobuf:"bytes,5,opt,name=reason"`
Message string `json:"message,omitempty" protobuf:"bytes,6,opt,name=message"`
}
- PodScheduled pod正處于排程中,剛開始排程的時候,hostip還沒綁定上,持續排程之後,有合适的節點就會綁定hostip,然後更新etcd資料
- Initialized pod中的所有初始化容器已經初啟動完畢
- Ready pod中的容器可以提供服務了
- Unschedulable 不能排程,沒有合适的節點
PodCondition中的ConditionStatus,它代表了目前pod是否處于某一個階段(PodScheduled,Ready,Initialized,Unschedulable),“true” 表示處于,“false”表示不處于
以下通過建立一個pod來具體的看看從pod建立到成功所觸發的事件,以及pod相關狀态的改變
kubectl apply -f busybox.yaml
第一步:寫入資料到etcd
event type: ADDED
event object:
{
"phase": "Pending",
"qosClass": "BestEffort"
}
第二步:開始被排程,但是還未排程到具體node上,請注意:PodScheduled的status=“true”
event type: MODIFIED
{
"phase": "Pending",
"conditions": [
{
"type": "PodScheduled",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z"
}
],
"qosClass": "BestEffort"
}
第三步:被排程到了具體的node上hostip綁定了,并且被所有初始化容器已經啟動完畢(注意我的busybox.yaml中pod沒有指定init container,是以這裡很快就被設定成true),被排程到的節點watch到并開始建立容器(此階段是在拉去鏡像)然後建立容器 ,而此時Ready的status是false,仔細看會發現,containerStatus的狀态未waiting
event type: MODIFIED
{
"phase": "Pending",
"conditions": [
{
"type": "Initialized",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z"
},
{
"type": "Ready",
"status": "False",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z",
"reason": "ContainersNotReady",
"message": "containers with unready status: [busybox]"
},
{
"type": "PodScheduled",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z"
}
],
"hostIP": "10.39.1.35",
"startTime": "2017-06-06T07:57:06Z",
"containerStatuses": [
{
"name": "busybox",
"state": {
"waiting": {
"reason": "ContainerCreating"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "busybox",
"imageID": ""
}
],
"qosClass": "BestEffort"
}
第四步:容器建立成功,Ready的status=“true”,此時容器的status也為running,這個時候,對應的pod的PodPhase也應該為running
event type: MODIFIED
{
"phase": "Running",
"conditions": [
{
"type": "Initialized",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z"
},
{
"type": "Ready",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:08Z"
},
{
"type": "PodScheduled",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-06-06T07:57:06Z"
}
],
"hostIP": "10.39.1.35",
"podIP": "192.168.107.204",
"startTime": "2017-06-06T07:57:06Z",
"containerStatuses": [
{
"name": "busybox",
"state": {
"running": {
"startedAt": "2017-06-06T07:57:08Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "busybox:latest",
"imageID": "docker-pullable://[email protected]:c79345819a6882c31b41bc771d9a94fc52872fa651b36771fbe0c8461d7ee558",
"containerID": "docker://a6af9d58c7dabf55fdfe8d4222b2c16349e3b49b3d0eca4bc761fdb571f3cf44"
}
],
"qosClass": "BestEffort"
}