美文网首页k8s
k8s钩子及优雅下线

k8s钩子及优雅下线

作者: kencool | 来源:发表于2020-11-28 21:20 被阅读0次

使用场景

如果我们直接将Pod杀死,那这部分流量就无法得到正确处理,会影响部分用户,通常来说网关或者注册中心会将我们的服务保持一个心跳,过了心跳超时之后会自动摘除我们的服务,但是有一个问题就是超时时间可能是30秒也可能是60秒,虽然不会影响我们的系统,但是会产生用户轻微抖动。
如果我们在停止前执行一条命令,通知网关或者注册中心这台主机进行下线,那么注册中心就会标记这台主机已经下线,不进行流量转发,用户就不会有任何影响,这就是优雅停止,将滚动更新影响最小化

Pod Hook

Pod Hook是由kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中
我们可以同时为Pod中的所有容器都配置hook
在k8s中,理想的状态是pod优雅释放,并产生新的Pod。但是并不是每一个Pod都会这么顺利
Pod卡死,处理不了优雅退出的命令或者操作
优雅退出的逻辑有BUG,陷入死循环
代码问题,导致执行的命令没有效果

对于以上问题,k8s的Pod终止流程中还有一个”最多可以容忍的时间”,即grace period (在pod的.spec.terminationGracePeriodSeconds字段定义),这个值默认是30秒,当我们执行kubectl delete的时候也可以通过--grace-period参数显示指定一个优雅退出时间来覆盖Pod中的配置,如果我们配置的grace period超过时间之后,k8s就只能选择强制kill Pod


1.  `Kubernetes等待指定的时间称为优雅终止宽限期。默认情况下,这是30秒。`
2.  `值得注意的是,这与preStop Hook和SIGTERM信号并行发生。Kubernetes不会等待preStop Hook完成。`
3.  `如果你的应用程序完成关闭并在terminationGracePeriod完成之前退出,Kubernetes会立即进入下一步。`

5.  `如果您的Pod通常需要超过30秒才能关闭,请确保增加优雅终止宽限期(通过terminationGracePeriodSeconds来实现)`

POD终止原理

  1. 用户发送命令删除Pod,Pod进入Terminating状态
  2. service摘除Pod节点
  3. 当kubelet看到Pod已被标记终止,开始执行preStop钩子,
  4. 假如preStop hook的运行时间超过了grace period,
  5. kubelet会发送SIGTERM并等2秒

示例


```yaml
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80

        env:
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: CONFIG_ENV
          value: "DEV"
        - name: ARGS
          value: "-Dapp.id=nginx -Dapollo.meta=http://apollo-config-svc:8060 -Denv=dev -Dapollo.bootstrap.namespaces=application,eureka-client-common,TEST1.redis,TEST1.swagger"

        lifecycle:
          preStop:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - " \
                  APPLICATION=SERVICE-NGINX; \
                  APPLICATION_PORT=80; \
                  curl -X PUT http://eureka01-svc:9000/eureka/apps/${APPLICATION}/${MY_POD_IP}:${APPLICATION_PORT}/status?value=OUT_OF_SERVICE; \

                  sleep 60;"
      terminationGracePeriodSeconds: 60

相关文章

  • k8s钩子及优雅下线

    使用场景 如果我们直接将Pod杀死,那这部分流量就无法得到正确处理,会影响部分用户,通常来说网关或者注册中心会将我...

  • 服务优雅下线

    前言 在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的时候...

  • Spring Cloud服务优雅下线

    写文章的当天; 生产中出现紧急的bug;需要紧急进行处理(他喵的今天是周末好不好), 当然主角不是bug,而是重启...

  • eureka优雅下线某个服务

    一、需求 在我们项目发布的时候,如果我们的注册中心使用的是eureka,当我们有多个服务实例,在发布某个服务的时候...

  • 【Go】优雅上下线(一)

    @[toc] 说明 当你有一个运行在服务器上的程序需要停止时,因为要保持数据的一致性,不能直接杀死程序(kill ...

  • 【Go】优雅上下线(二)

    @[toc] 关闭 上一篇已经讲了如何捕获Unix信号,这一篇我们来探究一下在多个协程工作的情况下如何正确关闭程序...

  • SpringCloud 优雅下线+灰度发布

    在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的时候,会造...

  • 利用钩子优雅关停kafka

    背景 利用kafka进行消息生产和消费,生产线程或消费线程在tomcat关闭的时候无法优雅的停止,一定要强制退出才...

  • Springcloud服务如何在Eureka安全优雅的下线

    Springcloud服务如何在Eureka安全优雅的下线 如果直接kill -9 Springcloud的服务,...

  • Android知识点-应用宝申请下架

    下架流程 选择想要下架的APP: 选择工单系统: 选择应用下线,及添加信息 应用下线原因 注意:1、应用下线后在腾...

网友评论

    本文标题:k8s钩子及优雅下线

    本文链接:https://www.haomeiwen.com/subject/dvcxwktx.html