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/