「走进k8s」Kubernetes1.15.1必备知识 Pod 的钩子(18)

上次说了静态的pod,静态pod也可以说在kubernetes中一种特殊的pod,它的特殊主要是它是由特定的节点的kubelet来进行管理的。不会通过master节点的apiserver来进行管理,yaml/json到mainfest路径下面就会自动创建pod,如果需要删除的话只能把yaml/json文件移除。pod也是有生命周期,我们都知道pod是kubernetes的最小调度单元,而pod是由容器组成。pod钩子(生命周期时间附加操作器)是什么概念。

(一)Pod Hook

由 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。

  • ①PostStart

容器创建成功后,运行前的任务,用于资源部署、环境准备等。异步非堵塞。不过需要注意的是如果钩子花费太长时间以至于不能运行或者挂起, 容器将不能达到running状态。

  • ②PreStop

在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。同步阻塞。如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态。

当用户请求删除含有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,仍然会给一个很短的优雅退出时间段,才会开始被强制杀死。

(二)代码演示

  • ① 编写yaml

postStart命令写了一个message文件在容器的/usr/share目录里面。preStop命令优雅的退出nginx。如果容器因为失败而退出这是非常有用的。

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-post
spec:
  containers:
  - name: lifecycle-post-container-pod
    image: nginx

    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx","-s","quit"]

  • ② 创建pod
kubectl apply -f post.yaml

  • ③ 查看pod
kubectl get pods

  • ④ 进入容器查看postStart的信息

进入容器的命令 exec

kubectl exec -it lifecycle-post -- /bin/bash
cat  /usr/share/message

  • ⑤ 删除容器查看PreStop
    > kubectl delete 命令支持 –grace-period=选项,这个选项允许用户用他们自己指定的值覆盖默认值。值’0’代表 强制删除 pod. 在 kubectl 1.5 及以上的版本里,执行强制删除时必须同时指定 –force –grace-period=0。

新建立abc.yaml

apiVersion: v1
kind: Pod
metadata:
  name: stop-demo2
  labels:
    app: hook
spec:
  containers:
  - name: stop-demo2
    image: nginx
    ports:
    - name: webport
      containerPort: 80
    volumeMounts:
    - name: message
      mountPath: /usr/share/
    lifecycle:
      preStop:
        exec:
          command: ['/bin/sh', '-c', 'echo Hello from the preStop Handler > /usr/share/message']
  volumes:
  - name: message
    hostPath:
      path: /tmp

删除pod,master节点本身是不做pod处理的都分到了node节点

kubectl delete -f abc.yaml 

删除pod,然后在node1节点上查看是否输出

#在node节点查看
 cat /tmp/message 

PS:为了掩饰所以提供了挂载方便查看删除后的优雅处理输出了一段话,但是实际的生产中最好的方式就是关闭容器的服务。PostStart 和 PreStop的使用方法其实不难。k8s都是命令的集合用多了自然熟悉。

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:「走进k8s」Kubernetes1.15.1必备知识 Pod 的钩子(18)
上一篇: 下一篇:

发表评论

电子邮件地址不会被公开。 必填项已用*标注