Pod Hook

Pod Hook

kubernetes爲容器提供了生命週期,稱爲Pod Hook,Pod Hook 是由kubelet 發起的, 能夠發生在容器啓動和中止以前運行,包含在容器的生命週期中。咱們能夠爲全部的Pod同時配置Hook。node

kubernetes爲咱們提供了兩種鉤子:nginx

  • PostStart: 這個鉤子在建立容器後當即執行。可是,不能肯定運行的順序必定是在容器的ENTRYPOINT以前,由於沒有參數傳遞個處理程序(Pod 中,容器中只指定command參數,則容器用entrypoint程序啓動,將command做爲參數傳遞給ENTRYPOINT啓動命令;同時指定args參數,則啓動容器是使用comand命令和args參數運行。)。主要用於容器的環境、資源燈的準備工做,但應該儘量的保證運行時間短,不然容器將長時間沒法達到Running狀態。
  • PreStop:容器終止前執行的鉤子。它是阻塞的,意味着它是同步的,因此必須在容器刪除的調用發出以前執行。主要用於優雅的關閉程序、通知其餘系統等。若是鉤子長時間的運行,就不能使容器刪除,一直保持在Running狀態永遠不會達到failed狀態。

若是鉤子函數執行失敗,它會殺死容器,因此儘量的使鉤子輕量。運行時間的長短根據應用程序的業務需求來決定。docker

PostStart Hook

實現鉤子函數的方式有兩種:api

  • exec:用於執行一段特定的命令,該命令消耗的資源會被記錄容器
  • http:對容器容器上特定端口進行HTTP請求。

模板

​ ""bash

apiVersion: v1
kind: Pod
metadata:
  name: hook
  labels:
    app: hook
spec:
  containers:
  - name: hook
    image: busybox
    lifecycle:
      postStart:
        exec:
          command: ["/bin/bash","-c","echo PostStart Hook > /home/message"]

優雅刪除資源對象

當用戶請求刪除含有 pod 的資源對象時(如Deployment等),K8S 爲了讓應用程序優雅關閉(即讓應用程序完成正在處理的請求後,再關閉軟件),K8S提供兩種信息通知:服務器

  • 默認:K8S 通知 node 執行docker stop命令,docker 會先向容器中PID爲1的進程發送系統信號SIGTERM,而後等待容器中的應用程序終止執行,若是等待時間達到設定的超時時間,或者默認超時時間(30s),會繼續發送SIGKILL的系統信號強行 kill 掉進程。
  • 使用 pod 生命週期(利用PreStop回調函數),它執行在發送終止信號以前。

默認全部的優雅退出時間都在30秒內。kubectl delete 命令支持 --grace-period=<seconds>選項,這個選項容許用戶用他們本身指定的值覆蓋默認值。值'0'表明 強制刪除 pod. 在 kubectl 1.5 及以上的版本里,執行強制刪除時必須同時指定 --force --grace-period=0app

強制刪除一個 pod 是從集羣狀態還有 etcd 裏馬上刪除這個 pod。 當 Pod 被強制刪除時, api 服務器不會等待來自 Pod 所在節點上的 kubelet 的確認信息:pod 已經被終止。在 API 裏 pod 會被馬上刪除,在節點上, pods 被設置成馬上終止後,在強行殺掉前還會有一個很小的寬限期。函數

另外Hook調用的日誌沒有暴露event給Pod,只能經過調用describe 命令來獲取event,若是執行錯誤,將看到FailedPostStartHook 或 FailedPreStopHook這樣的event。post

PreStop Hook

如下示例中,定義了一個Nginx Pod,其中設置了PreStop鉤子函數,即在容器退出以前,優雅的關閉 Nginx:ui

apiVersion: v1
kind: Pod
metadata:
  name: prestop-hook
spec:
  containers:
  - name: nginx-hook
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/usr/sbin/nginx","-s","quit"]
相關文章
相關標籤/搜索