Pod的生命周期
- 容器初始化環境
- 運行容器的pause基礎容器
- init c容器(init c可以有多個,串行運行)
- main c啟動主容器(啟動之初允許執行一個執行命令或一個腳本,在結束的時候允許執行一個命令)
- readless
- liveness
Init C
Init容器與普通容器非常像,處理如下兩點:
- Init容器總是運行到成功為止
- 每個Init容器都必須在在一個Init容器啟動之前完成
如果Pod的Init容器失敗,Kubernetes會不斷重啟該Pod,知道Init容器成功為止。如果Pod對應的restartPolicy為Nerver,它不會重新啟動
例:
apiVersion: v1 kind: Pod metadata: name: myapp-pod lables: app: myapp spec: containers: - name: myapp-container images: busybox command: ["sh","-c","echo this app is running! && sleep 3600"] initContainers: - name: init-myservice images: busybox command: ['sh','-c','until nslookup myservice;do echo waiting for myservice;sleep 2;done;'] //until循環nslookup檢測myservice是否存在,存在才啟動主容器myapp-container,否則一直重啟 //init C可以有多個
容器探針
探針是由kubelet對容器執行的定期診斷。kubelet調用由容器實現的Handler,有下面三種類型的處理程序:
- ExecAction: 在容器內執行指定命令,如果命令退出返回碼為0則認為成功
- TCPSocketAction:對指定端口上的容器的IP地址做TCP檢查,如果端口打開則被認為成功
- HTTPGetAction: 對指定端口和路徑上的容器IP指定HTTP Get請求,如狀態碼大於等於200且小於400則被認為成功
探針探測方式
- livenessProbe: 容器是否正在運行。如果存活探測失敗,則kubelet會殺死容器並根據RestarPolicy策略執行相應操作。如果容器不提供存活探針,默認狀態為success
- readnessProbe: 容器是否准備好服務請求,如果失敗,端點控制器從與Pod匹配的所有Service的端點中刪除該Pod的ip地址,初始延遲之前就緒狀態為Failure。如果容器不提供就緒探針,默認狀態為success‘
//readnessProbe就緒檢測(http方式檢測) apiVersion: v1 kind: Pod metadata: name: readness-http-pod spec: containers: - name: readness-http-pod iamges: myapp:v1 readnessProbe: httpGet: port: 80 path: /index.html initalDelaySeconds: 1 periodSeconds: 3 //livenessProbe存活檢測(http方式檢測) apiVersion: v1 kind: Pod metadata: name: liveness-http-pod spec: containers: - name: liveness-http-pod iamges: myapp:v1 livenessProbe: httpGet: port: 80 path: /index.html initalDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 10
Pod在k8s中的狀態
- 掛起(pending): Pod已被kubernetes系統接受,但有一個或多個容器鏡像未創建,等待時間包括調度Pod的時間和通過網絡下載鏡像的時間,可能需要花點時間
- 運行中(Running): 該Pod已經綁定到一個節點,Pod中所有的容器都已經被創建。至少有個一容器正在運行或者處於啟動或重啟狀態
- 成功(Successed): Pod中所有容器都被成功終止,並且不會再重啟
- 失敗(Failed): Pod中所有容器都已經被終止,並且至少有一個容器是因為失敗終止。也就是說容器以非0狀態退出或被系統終止
- 未知(Unknown): 因為某些原因無法取得Pod的狀態,通常是因為與Pod主機通信失敗
