1. 程式人生 > >kubernetes--pod的生命週期管理(PostStart,PreStop)

kubernetes--pod的生命週期管理(PostStart,PreStop)

lifecycle

建立資源物件時,可以使用lifecycle來管理容器在執行前和關閉前的一些動作。

lifecycle有兩種回撥函式:

  • PostStart:容器建立成功後,執行前的任務,用於資源部署、環境準備等。
  • PreStop:在容器被終止前的任務,用於優雅關閉應用程式、通知其他系統等等。

例1、部署程式碼

以下示例中,定義了一個Pod,包含一個JAVA的web應用容器,其中設定了PostStart和PreStop回撥函式。即在容器建立成功後,複製/sample.war到/app資料夾中。而在容器終止之前,傳送HTTP請求到http://monitor.com:8080/waring,即向監控系統傳送警告。

具體示例如下:

......
containers:
- image: sample:v2  
     name: war
     lifecycle:
      postStart:
       exec:
         command:
          - “cp”
          - “/sample.war”
          - “/app”
      prestop:
       httpGet:
        host: monitor.com
        psth: /waring
        port: 8080
        scheme: HTTP
......

例2、優雅刪除資源物件

當用戶請求刪除含有pod的資源物件時(如RC、deployment等),K8S為了讓應用程式優雅關閉(即讓應用程式完成正在處理的請求後,再關閉軟體),K8S提供兩種資訊通知:

1)、預設:K8S通知node執行docker stop命令,docker會先向容器中PID為1的程序傳送系統訊號SIGTERM,然後等待容器中的應用程式終止執行,如果等待時間達到設定的超時時間,或者預設超時時間(30s),會繼續傳送SIGKILL的系統訊號強行kill掉程序。

2)、使用pod生命週期(利用PreStop回撥函式),它執行在傳送終止訊號之前。
預設情況下,所有的刪除操作的優雅退出時間都在30秒以內。kubectl delete命令支援--grace-period=

的選項,以執行使用者來修改預設值。0表示刪除立即執行,並且立即從API中刪除pod這樣一個新的pod會在同時被建立。在節點上,被設定了立即結束的的pod,仍然會給一個很短的優雅退出時間段,才會開始被強制殺死。

具體示例如下:

kind: Deployment
metadata:
  name: nginx-demo
  labels:
    app: nginx-demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx-demo
        image: centos:nginx
        lifecycle:
          preStop:
            exec:
              # nginx -s quit gracefully terminate while SIGTERM triggers a quick exit
              command: ["/usr/local/nginx/sbin/nginx","-s","quit"]
        ports:
          - name: http
            containerPort: 80

參考:https://my.oschina.net/lykops/blog/1616577