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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM