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"]