码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • k8s如何优雅地关闭Pod


    文章目录

    • 一、k8s删除Pod的过程
      • `网络规则生效`
      • `删除 pod`
    • 二、可能遇到的问题
      • `502`
      • `504`
    • 三、如何避免上述问题
      • `为容器内的进程设置正常关闭`
      • `添加 preStopHook`
      • `修改终止 GracePeriodSeconds`
    • 四、制作一个可以优雅关闭的镜像
    • 五、参考文章

    一、k8s删除Pod的过程

    在删除pod 的过程中,有两条平行的时间线。一是改变网络规则的时间线,另一个是 pod 的删除。
    在这里插入图片描述

    网络规则生效

    • kube-apiserver 接收到 pod 删除请求,将 pod 在 Etcd 中的状态更新为 Terminating;
    • Endpoint Controller 从 Endpoint 对象中删除 pod 的 IP;
    • kuber-proxy 根据 Endpoint 对象的变化更新 iptables 的规则,不再将流量路由到被删除的 Pod。

    删除 pod

    • kube-apiserver 接收到 Pod 删除请求,将 Pod 的在 Etcd 中的状态更新为 Terminating
    • preStop 钩子被执行
    • Kubelet 向容器发送 SIGTERM
    • 继续等待,直到容器停止,或者超时 spec.terminationGracePeriodSeconds,这个值默认为 30s
    • 如果超过了 spec.terminationGracePeriodSeconds 容器仍然没有停止,k8s 将会发送 SIGKILL 信号给容器
    • 进程全部终止后,整个 Pod 完全被清理掉

    注意:这个优雅退出的等待计时spec.terminationGracePeriodSeconds是与 preStop 同步开始的,而且它也不会等待 preStop 结束

    二、可能遇到的问题

    502

    应用程序在收到 SIGTERM 信号后直接终止了运行,导致部分还没有被处理完的请求直接中断,代理层返回 502

    504

    Service Endpoints 移除不够及时,在 Pod 已经被终止后,仍然有个别请求被路由到了该 Pod,得不到响应导致 504

    三、如何避免上述问题

    为容器内的进程设置正常关闭

    以 SpringBoot 为例,启用优雅关闭可以 Spring Boot 配置文件中添加下面设置

    server:
        shutdown: graceful
    
    spring:
        lifecycle:
             timeout-per-shutdown-phase: 30s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以解决502的问题

    添加 preStopHook

    当kube-apiserver 接收到 pod 删除请求后,必须要预留一段时间,来等待网络规则的更新,避免新的流量路由到一个不可用的pod上 。

    因此,应该让 Kubelet 在收到删除 pod 事件时“sleep 一下”,并在给Pod发送SIGTERM之前留出足够的时间来更新网络规则。

    containers:
    - name: my-app
      # 添加下面这部分
      lifecycle:
        preStop:
          exec:
            command:
            - /bin/sh
            - -c
            - "sleep 10"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    可以解决504的问题

    修改终止 GracePeriodSeconds

    Kubernetes 为容器删除留下了 30 秒的最大时间尺度。如果 Spring 的优雅关闭超时时间和 Kubernetes 的 preStopHooks 之和超过 30 秒,可能会导致 Kubernetes 在 Spring Boot 处理完请求之前强行删除容器。因此,如果过程超过 30 秒,则应将 timerminationGracePeriodSeconds 调整为大于30秒

    下图显示了设置后的时间线:
    在这里插入图片描述

    四、制作一个可以优雅关闭的镜像

    参考文章:docker制作java镜像
    在这里插入图片描述

    五、参考文章

    K8s里Spring 微服务项目,Pod 关闭对用户的影响比较大!
    在 Kubernetes 容器集群,微服务项目最佳实践

  • 相关阅读:
    Mysql 45讲学习笔记(二十七)主库出问题了
    postgres配置参数生效方式和优先级
    【Linux】环境变量
    【面向校招】Golang面试题合集
    痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制
    ZZULIOJ 1105: 判断友好数对(函数专题) (C/C++)
    高可用(keepalived)部署方案
    软考 - 程序语言设计
    高级深入--day32
    大幅提升大模型的通用智能体能力!清华最新研究,让Llama2直逼GPT-4?
  • 原文地址:https://blog.csdn.net/anqixiang/article/details/125885880
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号