前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「走进k8s」Kubernetes1.15.1必备知识 Pod 的钩子(18)

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

作者头像
IT架构圈
发布2019-08-19 15:26:23
1.6K0
发布2019-08-19 15:26:23
举报
文章被收录于专栏:IT架构圈IT架构圈

上次说了静态的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。如果容器因为失败而退出这是非常有用的。

代码语言:javascript
复制
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
代码语言:javascript
复制
kubectl apply -f post.yaml
  • ③ 查看pod
代码语言:javascript
复制
kubectl get pods
  • ④ 进入容器查看postStart的信息

进入容器的命令 exec

代码语言:javascript
复制
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

代码语言:javascript
复制
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节点

代码语言:javascript
复制
kubectl delete -f abc.yaml

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

代码语言:javascript
复制
#在node节点查看
 cat /tmp/message

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)Pod Hook
  • (二)代码演示
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档