k8s pod的生命週期和poststart、prestop
k8s生命週期
Kubernetes 是什麼
Kubernetes 是開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。
k8s可以為我們做服務發現和負載均衡(ingress)、儲存編排(掛載儲存)、自動部署和回滾(deployment)、自動裝箱隔離(cpu、記憶體等)、自我修復(健康檢查、重啟失敗的容器)、金鑰與配置管理
k8s整體圖
POD是什麼
Pod 是 Kubernetes 中建立和管理的、最小的可部署的計算單元。
Pod 包含一個或多個容器---》最常見的是docker容器。pod裡的這些容器共享IP和儲存
流程圖
POD的啟動
- api server收到建立pod的請求後,建立pod物件,寫入預設值,儲存到etcd
- scheduler 通過api server 監聽到etcd有 尚未繫結node節點的pod,開始為新pod排程node節點,假如找到合適的node,則將資訊寫入etcd
- node節點的kubelet watch到api server->etcd,有新的pod繫結到當前node節點,則建立pod
- 依次啟動init container,用來初始化環節,init container必須依次執行完成
- 依次啟動container
- 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的終止
-
api server收到刪除pod的請求,將 pod 標記為“Terminating”狀態
- kubelet開始關閉pod
- 容器執行時給所有容器的1號程序傳送TERM
- 如果定義了preStop,則會執行preStop
- 容器開始graceful關閉
-
如果超過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:另外的命令列
7:
POD生命週期相關的官方文件
english:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
中文:https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/