1. 程式人生 > 其它 >k8s pod的生命週期和poststart、prestop

k8s pod的生命週期和poststart、prestop

k8s生命週期

Kubernetes 是什麼

 


Kubernetes 是開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。

k8s可以為我們做服務發現和負載均衡(ingress)、儲存編排(掛載儲存)、自動部署和回滾(deployment)、自動裝箱隔離(cpu、記憶體等)、自我修復(健康檢查、重啟失敗的容器)、金鑰與配置管理

k8s整體圖

 

 

 

POD是什麼

Pod 是 Kubernetes 中建立和管理的、最小的可部署的計算單元。
Pod 包含一個或多個容器---》最常見的是docker容器。pod裡的這些容器共享IP和儲存

流程圖


 

 

 

POD的啟動 

  1. api server收到建立pod的請求後,建立pod物件,寫入預設值,儲存到etcd
  2. scheduler 通過api server 監聽到etcd有 尚未繫結node節點的pod,開始為新pod排程node節點,假如找到合適的node,則將資訊寫入etcd
  3. node節點的kubelet watch到api server->etcd,有新的pod繫結到當前node節點,則建立pod
  4. 依次啟動init container,用來初始化環節,init container必須依次執行完成
  5. 依次啟動container
  6. container啟動前可以執行poststart

 

PostStart :這個鉤子在容器建立後立即執行。

但是,並不能保證鉤子在容器ENTRYPOINT之前執行。

PostStart主要用於資源部署、環境準備等。

PostStart的執行相對於容器的程式碼執行是非同步的。

只有 postStart 處理函式執行完畢,容器的狀態才會變成 RUNNING。

需要注意的是如果鉤子花費時間過長以及於不能執行或者掛起,容器就不能達到Running狀態。


POD的階段

取值 描述
Pending(懸決) Pod 已被 Kubernetes 系統接受,但有一個或者多個容器尚未建立亦未執行。此階段包括等待 Pod 被排程的時間和通過網路下載映象的時間。
Running(執行中) Pod 已經繫結到了某個節點,Pod 中所有的容器都已被建立。至少有一個容器仍在執行,或者正處於啟動或重啟狀態。
Succeeded(成功) Pod 中的所有容器都已成功終止,並且不會再重啟。
Failed(失敗) Pod 中的所有容器都已終止,並且至少有一個容器是因為失敗終止。也就是說,容器以非 0 狀態退出或者被系統終止。
Unknown(未知) 因為某些原因無法取得 Pod 的狀態。這種情況通常是因為與 Pod 所在主機通訊失敗。

 

 

POD的終止

  1. api server收到刪除pod的請求,將 pod 標記為“Terminating”狀態

  2. kubelet開始關閉pod
  3. 容器執行時給所有容器的1號程序傳送TERM
  4. 如果定義了preStop,則會執行preStop
  5. 容器開始graceful關閉
  6. 如果超過grace-period,pod還沒有被關閉,則會執行強制關閉pod流程,容器執行時向所有的container傳送 SIGKILL;之後kubelet強制刪除pod



PreStop

鉤子在容器終止前立即被呼叫。它是阻塞的,意味著它是同步的,所以它必須在刪除容器的呼叫觸發之前完成。主要用於優雅關閉應用程式、通知其他系統等。如果鉤子在執行期間掛起,Pod階段將停留在Running狀態並且不會達到failed狀態。另外,PreStop的執行現對於SIGTERM資訊,也是非同步的,k8s也不會等待PreStop執行完成。如果容器crash,崩潰了,prestop是不會執行的。

poststart 和prestop支援3種方式

Exec  返回0則認為成功

TCPSocket  埠可以建立連線則認為成功

HttpGet 返回200-400則認為成功

 

 

示例

有以下yaml

 

apiVersion: v1
kind: Pod
metadata:
  name: test-life
spec:
  initContainers:
  - name: init-c1
    image: busybox:latest
    command: ["/bin/sh", "-c", "echo $(date) 'written by init-c1 entrypoint'  && sleep 6"]
  - name: init-c2
    image: busybox:latest
    imagePullPolicy: Never
    command: ["/bin/sh", "-c", "echo $(date) 'written by init-c2 entrypoint'  && sleep 6"]
  containers:
  - name: hook-c1
    image: busybox:latest
    imagePullPolicy: Never
    command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 entrypoint'  && sleep 600"]
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 postStart'>>tmp/log.log  && sleep 1"]

      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 prestop'>>tmp/log.log  && sleep 100"]

 

 

 

1:kubectl apply -f hook.yaml
pod/test-life created
2 : kubectl describe pod test-life

 

 3:docker ps  

4: docker exec -it fc73fcdbc22b /bin/sh
5:tail -f /tmp/log.log

6:另外的命令列

kubectl delete po test-life

7:

 

POD生命週期相關的官方文件

english:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
中文:https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/