SpringBoot在K8s下实现优雅停机

woman-6059236_640.jpg

当我们实现滚动升级之前,务必要实现应用级别的优雅停机,否则滚动升级时,还是会影响到业务。所以,我们希望SpringBoot应用实现优雅停机。此次教程基于SpringBoot 2.5.0。

1. 加入必要依赖


        org.springframework.boot
        spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-actuator

2. 配置SpringBoot应用

默认情况下,SpringBoot是直接关机的,所以,需要将优雅停机配置打开。在applicatoin.yaml中配置:

spring:
  application:
    name: demo
  # 停机过程超时时长设置了20s,超过20s,直接停机
  lifecycle:
    timeout-per-shutdown-phase: 20s

server:
  port: 8080
  #  默认为IMMEDIATE,表示立即关机;GRACEFUL表示优雅关机
  shutdown: graceful

management:
  server:
    address: 127.0.0.1
    port: 50000
  # 开启shutdown endpoint
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      base-path: /private-url
      exposure:
                # 暴露shutdown endpoint
        include: health,shutdown

这时我们只需要在发送停机请求告诉应用,即可优雅停机。发送指令为:curl -XPOST 127.0.0.1:50000/private-url/shutdown

3. 集成到Pod中

生产环境中当然不会直接使用Pod部署应用,而是使用Deployment部署应用。以下只是样例:

apiVersion: v1 
kind: Pod 
metadata:
  name: demopod
spec:
  containers:
  - image: springboot-demo:v1.10
    name: demo-container
    ports:
    - containerPort: 8080
    lifecycle:
      preStop:
        exec:
          command: ["curl", "-XPOST", "127.0.0.1:50000/private-url/shutdown"]

注意:

  1. 前提是你的应用镜像中必须包含curl命令。
  2. 50000是应用管理端口,不能暴露给公网。

4. 实验效果

在命令行里执行:

% curl -X POST 127.0.0.1:50000/private-url/shutdown
{"message":"Shutting down, bye..."}%

应用日志:

... o.s.b.w.e.tomc1at.GracefulShutdown  : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Graceful shutdown complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Commencing graceful shutdown. Waiting for active requests to complete
... o.s.b.w.e.tomcat.GracefulShutdown  : Graceful shutdown complete

最后,后台发消息:springboot优雅停机,即可拿到源码。

你可能感兴趣的:(SpringBoot在K8s下实现优雅停机)