当前位置: 首页 > news >正文

K8s + Springboot 如何实现 优雅停机 + 不停服更新

一、为什么要实现优雅停机 + 不停服更新?

  • 提升用户体验:避免服务中断,减少用户困扰;

  • 增强系统稳定性:确保服务在停止前处理完现有请求,减少错误,避免数据异常;

  • 支持持续交付:实现频繁部署而不影响业务连续性;

  • 降低成本:减少因服务中断带来的经济损失和维护成本;


二、如何实现优雅停机?

1、项目自身的配置:

其实,在Spring Boot 2.3 及以上版本中,已经内置了对优雅停机的支持,但是前提是确保我们服务中,已经已经正确引入了actuator依赖:

1

2

3

4

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

我们可以在 application.yml 或 application.properties 中进行如下配置:

1

2

3

4

5

6

server:

  shutdown: graceful

spring:

  lifecycle:

    timeout-per-shutdown-phase: 30s

2、K8s中对的配置:

在 Kubernetes 中,我们需要确保 Pod 在停止之前有足够的时间来完成优雅停机,可对terminationGracePeriodSeconds参数进行如下配置:

1

2

3

4

5

6

7

8

9

10

11

apiVersion: v1

kind: Pod

metadata:

  name: example-pod

spec:

  terminationGracePeriodSeconds: 60  # 设置为合适的值,确保应用有足够的时间完成优雅停机

  containers:

  - name: example-container

    image: your-spring-boot-app:latest

    ports:

    - containerPort: 8080

3、对于没有内置优雅停机的程序,我们可以通过自定义优雅停机的端口,配合k8s的preStop钩子,完成优雅停机:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

apiVersion: v1

kind: Pod

metadata:

  name: example-pod

spec:

  terminationGracePeriodSeconds: 60

  containers:

  - name: example-container

    image: your-spring-boot-app:latest

    ports:

    - containerPort: 8080

    lifecycle:

      preStop:

        exec:

          # command: ["sh", "-c", "sleep 10"]  # 预处理操作,例如等待 10 秒

          command: ["curl", "-XPOST", "127.0.0.1:50000/actuator/shutdown"]  # 调用优雅停机接口

4、进行了以上配置,我们的程序就可以实现优雅停机的效果了:

1731656063818307.png

调试期间,重点观察:pod是否是在 Graceful shutdown complete 成功打印后,才被删除的?

但是,光实现优雅停机,服务的高可用性还是没有得到完全保障的,我们好需要实现,服务的不停服更新才可以!


三、如何实现不停服更新?

不停服更新的关键点就在于:要实现 滚动更新 + 就绪/存活探针 的配置!

1、如何配置滚动更新:

对于滚动更新策略,正常时候我们使用k8s管理面板的页面操作会更方便一点,因为市面上,所有的面板都会提供这一块的配置:

1

2

3

4

5

6

7

8

9

10

11

apiVersion: apps/v1

kind: Deployment

metadata:

  name: my-spring-boot-app

spec:

  replicas: 3

  strategy:

    type: RollingUpdate

    rollingUpdate:

      maxSurge: 1   # 也可以使用 25% 表示

      maxUnavailable: 0

  • maxSurge: "25%"  :在更新过程中最多可以创建当前副本数的 25% 的额外 Pod,从而加快更新速度。

  • maxUnavailable: 0  :确保在更新过程中没有 Pod 不可用,保持服务高可用性。

2、如何配置就绪/存活探针:

配置就绪/存活探针的关键就是,我们的系统有提供对应的探针,巧了,如果我们的 springboot 项目已经引入了actuator依赖,就是已经待了对应的探针的;

但是记得要把这两个探针加入登录认证的白名单哦!

之后,在k8s上配置时候,正常时候我们也会选择在k8s管理面板上进行配置:

相关文章:

  • Python 数据分析与可视化 Day 9 - 缺失值与异常值处理技巧
  • MFC获取本机所有IP、局域网所有IP、本机和局域网可连接IP
  • 深度学习框架入门指南:PyTorch 核心实战
  • Discrete Audio Tokens: More Than a Survey
  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 随机生成的乱码域名”常由**域名生成算法(DGA)** 产生
  • Flutter基础(UI监听)
  • MyBatis 缓存机制详解
  • Nestjs框架: nestjs-bull的使用与相关queue的规划
  • 【RAG面试题】LLMs已经具备了较强能力,存在哪些不足点?
  • day49-硬件学习之I2C(续)
  • TTvideo免费开源PC录屏软件
  • UE--Slate 焦点、捕获,输入处理与玩家控制器的关系
  • 【 MyBatis-Plus | 精讲 】
  • 1 Studying《Is Parallel Programming Hard》1-5
  • 【网络安全】密码学知识普及
  • leetcode.2014 重复k次的最长子序列
  • Unity 脚本自动添加头部注释
  • 不同信创系统如何集中远程运维?贝锐向日葵提供稳定方案
  • 科技如何影响我们的生活?