天天看點

kubernetes之pod狀态分析

##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"
}
           

繼續閱讀