kubernetes爲容器提供了生命週期,稱爲Pod Hook,Pod Hook 是由kubelet 發起的, 能夠發生在容器啓動和中止以前運行,包含在容器的生命週期中。咱們能夠爲全部的Pod同時配置Hook。node
kubernetes爲咱們提供了兩種鉤子:nginx
若是鉤子函數執行失敗,它會殺死容器,因此儘量的使鉤子輕量。運行時間的長短根據應用程序的業務需求來決定。docker
實現鉤子函數的方式有兩種:api
""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提供兩種信息通知:服務器
docker stop
命令,docker 會先向容器中PID
爲1的進程發送系統信號SIGTERM
,而後等待容器中的應用程序終止執行,若是等待時間達到設定的超時時間,或者默認超時時間(30s),會繼續發送SIGKILL
的系統信號強行 kill 掉進程。PreStop
回調函數),它執行在發送終止信號以前。默認全部的優雅退出時間都在30秒內。kubectl delete 命令支持 --grace-period=<seconds>
選項,這個選項容許用戶用他們本身指定的值覆蓋默認值。值'0'表明 強制刪除 pod. 在 kubectl 1.5 及以上的版本里,執行強制刪除時必須同時指定 --force --grace-period=0
。app
強制刪除一個 pod 是從集羣狀態還有 etcd 裏馬上刪除這個 pod。 當 Pod 被強制刪除時, api 服務器不會等待來自 Pod 所在節點上的 kubelet 的確認信息:pod 已經被終止。在 API 裏 pod 會被馬上刪除,在節點上, pods 被設置成馬上終止後,在強行殺掉前還會有一個很小的寬限期。函數
另外Hook調用的日誌沒有暴露event給Pod,只能經過調用describe 命令來獲取event,若是執行錯誤,將看到FailedPostStartHook 或 FailedPreStopHook這樣的event。post
如下示例中,定義了一個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"]