首页 > 其他分享 >k8s中配置Spring Cloud服务(Eureka客户端)优雅上下线

k8s中配置Spring Cloud服务(Eureka客户端)优雅上下线

时间:2024-08-14 16:06:59浏览次数:12  
标签:容器 请求 Spring Eureka 优雅 Pod k8s pod

目录

背景

在Kubernetes部署应用时,尽管Kubernetes使用滚动升级的方式,先启动一个新Pod,等新Pod成功运行后再删除旧Pod,但在此过程中,Pod仍然会接收请求。如果在Pod被删除的瞬间正好有请求到达,Pod被杀死后将无法处理这些请求,导致客户端出现500错误,这样就无法实现平滑升级。
我们使用Java作为编程语言,注册中心采用Eureka。应用启动时会注册到Eureka,然后通过内部调用进行服务间通信。服务会定期向Eureka发送心跳信号,并在每个Pod服务中维护一份本地缓存映射表,缓存的更新窗口时间为30秒。当服务停止时,它会在Eureka中进行下线操作。然而,如果在服务下线的窗口期内有请求发起,可能会出现以下问题:

  1. K8s Pod服务已下线,但Eureka在窗口期内未更新注册列表,导致请求被路由到已不存在的旧服务,返回404错误。
  2. 请求已到达旧服务,但在高峰期时,由于处理速度较慢,服务还未能返回响应体,便已被关闭,导致返回500错误。如下所示

image.png

解决办法

使用的解决方案是,在应用下线的第一时间(Pod被删除)先进行在Eureka的下线操作不让其接受新的请求,然后等待Pod已接收的请求处理完成后 再进行删除Pod;
这里会使用到的知识以及需要自身考虑的点有:

  • Pod容器终止流程
  • k8s的prestop钩子(容器关闭前执行操作)
  • 需要判断自己应用处理的请求的时间(基本上30s内都能处理完成 如果不放心的话调整成50s 但是这样的话也会相应的增加上线时长,需要注意)

Pod容器终止流程

1)新Pod启动,通过Readiness就绪性探测,加入service的endpoint服务列表。
2)老pod进入Termination状态,从service的endpoint服务列表摘除,此时不会有新请求打到即将终止的老pod上。
3)如果设置了Prestop钩子,则优先执行Prestop里的优雅动作。如果在规定的terminationGracePeriodSeconds优雅时间内(默认30s)完成不了,则kubelet会发送SIGTERM终止信号,并等待2秒,如果2秒后还未终止pod容器,则发送SIGKILL信号强制终止。
4)如果没有设置Prestop钩子,则发送SIGTERM终止信号优雅关闭容器进程,如果在规定的terminationGracePeriodSeconds优雅时间内(默认30s)未能终止pod容器,则发送SIGKILL信号强制终止。
需要注意:
1)SIGTERM终止信号只能被那些pid为1的父进程捕捉到,并优雅关闭容器进程。对于那些pid不为1的子进程是捕捉不到SIGTERM终止信号的。
所以对于单个容器只有一个pid为1的进程来说,使用K8S默认的优雅机制就可以,只需要拉长terminationGracePeriodSeconds优雅时间,确保在规定时间内完成容器优雅终止。
2)对于那些单个容器里有多个进程,即除了pid为1的进程外,还有子进程。这种情况下就需要设置Prestop钩子函数,在prestop里提前优雅处理掉那些子进程,然后再通过SIGTERM正常终止掉pod容器。
注意设置好terminationGracePeriodSeconds优雅时间。

模拟请求报错

模拟请求报错就是不加任何配置直接使用测试脚本(这里用的是jmeter)不间断的去调用我们的应用,然后发布我们的新应用会有失败的请求

发布服务

此时我们修改镜像apply可以模拟下我们的服务发布,当新Pod启动后 删除旧Pod时注意观察请求是否有报错!

[root@master01 mdl]# kubectl apply -f mdl-deployment.yaml

image.png

请求接口

设置50个线程开始去请求我们服务的接口
可以发现在删除pod时的这个动作会出现错误请求,随后就会正常

以上就是发版(新Pod替换旧Pod)的过程中会出现的问题

基于Eureka优雅上下线

正确的做法

1)拉长terminationGracePeriodSeconds的优雅时间。
2)设置Prestop钩子,在Pod容器终止之前,在Prestop里通过eureka提供的API接口,主动摘除eureka注册。接着sleep 30秒时间,用于刷新eureka网关缓存,摘除下线的pod地址。
3)最后再执行pod容器的优雅终止。

修改deployment配置

需要添加k8s的prestop钩子,以及设置强制关闭pod的时间要比sleep的时间长

terminationGracePeriodSeconds: 45
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", 'curl -X PUT "http://eureka-service:8761/eureka/apps/mdl-web/${POD_IP}:mdl-web:8080/status?value=DOWN" -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8" && sleep 30']

发布服务

此时我们再次修改镜像apply可以模拟下我们的服务发布

[root@master01 mdl]# kubectl apply -f mdl-deployment.yaml

如上当开始停止旧pod时, 会先调用我们配置的prestop钩子 如下 先把eureka中旧pod下线 不让其接受请求,然后再处理已接受的请求最后彻底关闭pod
image.png
在此过程中,如果我们使用JMeter进行持续循环访问接口,所有请求都会正常响应啦。
image.png

标签:容器,请求,Spring,Eureka,优雅,Pod,k8s,pod
From: https://www.cnblogs.com/Unstoppable9527/p/18359164

相关文章

  • k8s日常巡检命令
    Kubernetes(K8S)是目前流行的容器编排系统,它能够帮助我们快速、高效地管理容器化应用程序。在K8S环境中,进行日常巡检是非常重要的一项工作,可以帮助我们及时发现和解决潜在问题,确保集群的稳定性和健康运行。本文将介绍K8S日常巡检的相关命令和步骤,帮助刚入行的小白快速上手。K8S日常......
  • springboot+vue《区块链技术与应用》课程案例信息资源系统【程序+论文+开题】-计算机
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,教育领域正经历着前所未有的变革。区块链技术,作为新兴的去中心化、透明度高、安全性强的分布式账本技术,正逐渐渗透到各行各业,其在教育领域的应用潜力尤为巨大。当前,高校教学中案例资源的共享与管理面临着信息孤......
  • springboot+vue《计算机网络》课程学习网【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,网络教育已成为现代教育体系不可或缺的一部分。特别是在全球疫情的影响下,线上学习模式更是得到了前所未有的普及与重视。《计算机网络》作为计算机科学与技术专业的核心课程,其内容的广泛性和复杂性要求学生不仅......
  • springboot+vue《花间故里》【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,人们越来越追求心灵的宁静与自然的美好,花卉作为大自然的馈赠,不仅美化环境,更承载着丰富的情感与文化内涵。《花间故里》项目应运而生,旨在打造一个集花卉知识普及、个性化推荐、在线购买及社区交流于一体的综合性平......
  • springboot+vue《Python数据分析》的教学系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着大数据时代的到来,数据分析技能已成为各行各业不可或缺的核心竞争力之一。Python,作为一门高效、灵活且拥有丰富数据分析库的编程语言,正逐步成为数据分析领域的主流工具。然而,当前高等教育体系中,《Python数据分析》课程的教学仍面临......
  • 基于SpringBoot的校园招聘系统+论文参考示例
    1.项目介绍技术栈+工具:SpringBoot+MyBatis-Plus+JSP+Maven+IDEA2022+MySQL系统角色:管理员、企业、普通用户(学生)系统功能:管理员(用户管理、企业管理、实体管理、岗位管理等)、企业(简历搜集、推荐简历查看、投递简历查看、发布职位、信息维护等)、普通用户(职位查询......
  • springboot+vue网上动物园售票系统的设计与实现【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字化转型已成为各行各业不可逆转的趋势。在旅游业中,特别是以动物园为代表的休闲娱乐场所,传统的售票模式逐渐暴露出效率低下、排队时间长、信息更新不及时等弊端。游客对于便捷、高效的购票体验有着日益增长......
  • springboot+vue网上订餐系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,人们的生活方式正经历着前所未有的变革。在快节奏的现代生活中,餐饮消费作为日常不可或缺的一部分,其服务模式也逐渐向便捷化、智能化转型。传统的餐饮消费往往需要顾客亲自前往餐厅,不仅耗费时间,还可能受限于地......
  • springboot+vue网络相册设计与实现【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字化生活已成为现代社会的常态。在这个背景下,个人影像资料的存储与分享需求日益增长。传统相册因其实体性、不便携带及难以共享等局限性,已难以满足用户随时随地记录生活、分享美好瞬间的需求。因此,网络相册......
  • springboot+vue网络相册平台【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字化生活已成为现代社会的常态,人们对于个人影像资料的存储、管理与分享需求日益增长。传统的相册存储方式受限于物理空间、携带不便且难以实现即时共享。网络相册平台应运而生,它利用云计算和大数据技术,为用......