Pod Hook

Pod Hook

kubernetes为容器提供了生命周期,称为Pod Hook,Pod Hook 是由kubelet 发起的, 可以发生在容器启动和停止之前运行,包含在容器的生命周期中。我们可以为所有的Pod同时配置Hook。

kubernetes为我们提供了两种钩子:

  • PostStart: 这个钩子在创建容器后立即执行。但是,不能确定运行的顺序一定是在容器的ENTRYPOINT之前,因为没有参数传递个处理程序(Pod 中,容器中只指定command参数,则容器用entrypoint程序启动,将command作为参数传递给ENTRYPOINT启动命令;同时指定args参数,则启动容器是使用comand命令和args参数运行。)。主要用于容器的环境、资源灯的准备工作,但应该尽可能的保证运行时间短,否则容器将长时间无法达到Running状态。
  • PreStop:容器终止前执行的钩子。它是阻塞的,意味着它是同步的,所以必须在容器删除的调用发出之前执行。主要用于优雅的关闭程序、通知其他系统等。如果钩子长时间的运行,就不能使容器删除,一直保持在Running状态永远不会达到failed状态。

如果钩子函数执行失败,它会杀死容器,所以尽可能的使钩子轻量。运行时间的长短根据应用程序的业务需求来决定。

实现钩子函数的方式有两种:

  • exec:用于执行一段特定的命令,该命令消耗的资源会被记录容器
  • http:对容器容器上特定端口进行HTTP请求。

模板

​ ""

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=0

强制删除一个 pod 是从集群状态还有 etcd 里立刻删除这个 pod。 当 Pod 被强制删除时, api 服务器不会等待来自 Pod 所在节点上的 kubelet 的确认信息:pod 已经被终止。在 API 里 pod 会被立刻删除,在节点上, pods 被设置成立刻终止后,在强行杀掉前还会有一个很小的宽限期。

另外Hook调用的日志没有暴露event给Pod,只能通过调用describe 命令来获取event,如果执行错误,将看到FailedPostStartHook 或 FailedPreStopHook这样的event。

猜你喜欢

转载自www.cnblogs.com/h-gallop/p/11780335.html
pod