记一次应用优雅下线排查经历

简介: 本文记录了一次线上应用发版时出现500错误的排查过程。问题出现在滚动更新过程中,部分请求调度到了正在下线的Pod,导致500错误。通过增加PreStop Hook、调整TerminationGracePeriodSeconds以及配置Java应用的优雅下线,最终解决了问题。此外,还发现SLB的长连接问题,并通过配置SLB优雅下线彻底解决了请求失败的情况。

1. 背景

最近和同事一起排查了下发版时应用会出现500错误的异常,感觉还是挺有意思的,这里做下记录,以便后续遇到问题时进行翻阅。

2. 问题状况

我们线上环境是使用的ack集群,发版时应用service对应的deployment下的pod会进行滚动更新,这种情况下会出现部分接口报500错误,初步判断是有请求调度到了正在下线中的pod,即Terminating状态,这样导致这部分请求出现报错。

3. 排查经过

出现这种问题时,已经考虑到是没做好优雅下线的问题,于是去网上搜了一下解决方式,做好java程序的优化下线,主要要做以下两件事情:

  1. 容器关闭时增加前置处理,让容器先不进行关闭操作,这样给k8s留出时间去修改服务的路由分发规则,同时增加容器优雅关闭时间 terminationGracePeriodSeconds,留出更多的时间供容器关闭。
  2. 应用内做好优雅下线设置。

3.1 容器配置修改

3.1.1 pod被删除原理

deployment下pod被删除时,会触发两条路径进行操作:
Pod层面

  1. Pod被删除会被置为Terminating状态
  2. Kubelet捕捉到Pod的变化,执行syncPod动作
  3. 如果Pod设置了PreStop Hook,会先执行PreStop Hook
  4. kubelet 对 Pod 中各个 container 发送调用 cri 接口中 StopContainer 方法,向 dockerd 发送 stop -t 指令,用 SIGTERM 信号以通知容器内应用进程开始优雅停止。
  5. 等待容器内应用进程完全停止,如果容器在 gracePeriod 执行时间内还未完全停止,就发送 SIGKILL 信号强制杀死应用进程(容器运行时处理)。
  6. 所有容器进程终止,清理 Pod 资源。

网络层面

  1. Pod 被删除,状态置为 Terminating。
  2. Endpoint Controller 将该 Pod 的 ip 从 Endpoint 对象中删除。
  3. Kube-proxy 根据 Endpoint 对象的改变更新 iptables/ipvs 规则,不再将流量路由到被删除的 Pod。
  4. 如果还有其他 Gateway 依赖 Endpoint 资源变化的,也会改变自己的配置(比如 Nginx Ingress Controller)。

具体关闭过程如下图所示:
image.png
通过上图可以得知,我们可以通过设置PreStop来sleep一定的时间,让网络层面有时间去修改路由规则,这样在pod关闭的时候,不会有请求进入,以避免出现问题,这也是优雅下线的主要设置。
因为TerminationGracePeriodSeconds是整个Pod的优雅下线等待时间,默认为30s,现在增加了PreStop执行时间后,TerminationGracePeriodSeconds时间也要进行相应的增加。

3.1.2 容器配置修改

修改deployment配置,进行以下操作:

  1. 增加PreStop Hook,在pod停止前sleep 30s,给k8s预留pod删除后修改endpoint中端点和iptables时间,使请求不会路由到正在关闭中的Pod上。
    image.png

  2. 增加TerminationGracePeriodSeconds到60s,因为有30s分给了PreStop Hook,所以将TerminationGracePeriodSeconds从30s改到60s。
    image.png

3.2 java应用内配置优雅下线

Spring Boot中启用优雅下线可以在配置中配置以下内容:

server:
    shutdown: graceful

spring:
    lifecycle:
         timeout-per-shutdown-phase: 30s

通过使用上述配置,Spring Boot 保证在收到 SIGTERM 后不再接受新请求,并在超时内完成所有正在进行的请求的处理。即使无法及时完成,也会记录相关信息,然后强制退出。对于 timeout 的值,应参考处理请求的最大允许持续时间。
这里可以看到,主要还是说正在进行的请求要预留时间进行处理,对于不接受新请求,如果前面路由没有正确修改,还是会有请求进来,只是被拒绝连接,这个请求一样没得到正确处理。

3.3 SLB长连接问题

经过前两项修改以后,进行了尝试,本来以为会没有500错误了,结果还是有错误出现,这里我以为是PreStop里sleep时间不够,于是就改大该时间到150s,发现还是不行,排查到这里有点没思路了,因为按前面的原理分析,这个优雅下线应该是没问题的了。这时候突然想到之前看过k8s的书,里面有关于Pod优雅关闭的描述,里面有提到Pod下线后,网络路由的修改并不会影响已有连接,也就是说虽然上面的设置会让新的连接指向新的Pod,但已有连接并不会改变,于是猜测是这个原因导致的,但怎么解决呢,当时并没有太多的思路。
后面同事查到SLB也可以进行优雅下线设置,进行设置后解决了问题,这里也印证了之前的想法是对的,就是已有连接导致的请求失败,只是当时不知道已有连接怎么设置断开,SLB设置优雅下线的方式为增加如下注解。
image.png
这个配置代表开启slb优雅下线,并且排空超时时间为30s,连接排空超时指定了在负载均衡器停止接收新连接之前,它将保持现有连接的时间。这个时间段内,负载均衡器会依旧允许现有的会话继续活动,从而为正在处理的请求争取时间,使其能够完成。
可以理解为负载均衡上已有连接在Pod已经是Terminating状态的情况下,会允许长连接再保持一段时间,用来处理已有请求,和应用内优雅下线处理类似。

4 总结

应用未优雅下线这个问题,前期根据网上信息进行设置,还是比较容易理解和配置的,但配置完了之后发现并不生效,这个时候由于缺少中间链路的日志信息,并不太清楚请求是落到哪个Pod导致的超时,所以导致排查一度比较困难和没有思路。当时虽然猜到了已有长连接可能存在影响,但不是特别确定,并且对怎么停掉之前的长连接不是特别有思路,要不然可以更快的解决问题,后续遇到这种还是应该沿着自己认为的方向接着去探索。

相关文章
|
3天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
5天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
5859 18
|
17天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
9天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
5天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
|
1月前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
9天前
|
Cloud Native Apache 流计算
PPT合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
3506 10
PPT合集|Flink Forward Asia 2024 上海站
|
2天前
|
弹性计算 运维 监控
阿里云云服务诊断工具:合作伙伴架构师的深度洞察与优化建议
作为阿里云的合作伙伴架构师,我深入体验了其云服务诊断工具,该工具通过实时监控与历史趋势分析,自动化检查并提供详细的诊断报告,极大提升了运维效率和系统稳定性,特别在处理ECS实例资源不可用等问题时表现突出。此外,它支持预防性维护,帮助识别潜在问题,减少业务中断。尽管如此,仍建议增强诊断效能、扩大云产品覆盖范围、提供自定义诊断选项、加强教育与培训资源、集成第三方工具,以进一步提升用户体验。
607 242
|
22天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
5944 16
|
4天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
488 37