0

0

解决Spring Boot应用在Kubernetes中启动后立即关闭的问题

碧海醫心

碧海醫心

发布时间:2025-11-09 13:00:02

|

979人浏览过

|

来源于php中文网

原创

解决Spring Boot应用在Kubernetes中启动后立即关闭的问题

本文探讨spring boot应用在kubernetes环境中启动后立即关闭的常见问题,并提供解决方案。核心原因在于kubernetes的liveness和readiness探针在应用完全启动并准备好接受流量之前过早失败。教程将详细解释liveness和readiness探针的作用,并通过配置initialdelayseconds来延迟探针检查,从而确保应用有足够时间完成初始化,避免被kubernetes误判为不健康而重启。

在将Spring Boot应用程序部署到Kubernetes环境时,开发者可能会遇到应用启动后立即关闭的现象。尽管应用在本地或开发环境运行正常,但在生产预发布(PP)等特定环境中,容器可能在启动几秒后就被终止并重启。这种行为通常是由于Kubernetes的健康检查机制与Spring Boot应用的启动时间不匹配所致。

理解Kubernetes健康探针

Kubernetes通过两种主要类型的探针来管理容器的生命周期和流量路由

  1. Liveness Probe(存活探针)
    • 目的:检测容器是否仍然存活并运行。如果Liveness探针失败,Kubernetes会认为容器已损坏,并根据重启策略将其重启。
    • 场景:适用于应用程序可能进入死锁状态(例如,线程被卡住,但进程仍在运行)的情况。
  2. Readiness Probe(就绪探针)
    • 目的:检测容器是否已准备好接收流量。如果Readiness探针失败,Kubernetes会将该Pod从Service的Endpoint列表中移除,停止向其发送流量,直到探针成功为止。
    • 场景:适用于应用程序需要时间进行初始化(例如,加载数据、连接数据库、预热缓存)才能处理请求的情况。

Spring Boot Actuator通过/actuator/health/liveness和/actuator/health/readiness等端点,为Kubernetes提供了标准的健康检查接口。当应用程序完全启动并准备就绪时,这些端点会返回200 OK状态码

问题诊断:过早的探针失败

当Spring Boot应用在Kubernetes中启动后立即关闭时,查看应用日志会发现类似以下的关键信息:

2022-11-30 14:45:14.420  INFO 1 --- [           main] c.a.f.MyApplication                      : Started FMyApplication in 98.611 seconds (JVM running for 107.522)
2022-11-30 14:45:14.512 DEBUG 1 --- [ionShutdownHook] o.s.b.a.ApplicationAvailabilityBean      : Application availability state ReadinessState changed to REFUSING_TRAFFIC
...
2022-11-30 14:45:14.904  INFO 1 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'

从日志中可以看出,应用程序报告自身“Started”(启动成功),但紧接着ReadinessState迅速变为REFUSING_TRAFFIC(拒绝流量),随后Spring上下文开始关闭,EntityManagerFactory和数据库连接池也随之关闭。这表明在应用报告启动完成之后,Kubernetes的Readiness探针可能立即执行并失败,导致Kubernetes认为Pod不健康而触发关闭操作。

根本原因在于,Spring Boot应用程序在报告“Started”后,可能还需要一些时间才能完全初始化所有组件并准备好响应外部请求。例如,数据库连接池的初始化、JPA EntityManagerFactory的完全就绪等都需要额外的时间。如果Kubernetes探针在这些组件完全就绪之前就开始检查,就会导致探针失败。

解决方案:配置探针的初始延迟

为了解决这个问题,我们需要在Kubernetes的Pod定义中为Liveness和Readiness探针配置initialDelaySeconds参数。initialDelaySeconds指定了容器启动后,Kubernetes应该等待多少秒才开始执行探针。这为应用程序提供了必要的缓冲时间,使其能够完成所有初始化任务。

推荐配置方式:在Kubernetes部署文件中设置

在Kubernetes的Deployment、StatefulSet或Pod定义中,为容器的livenessProbe和readinessProbe添加initialDelaySeconds。

以下是一个示例Kubernetes Deployment配置片段:

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-spring-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-spring-app
  template:
    metadata:
      labels:
        app: my-spring-app
    spec:
      containers:
      - name: my-spring-app-container
        image: your-repo/my-spring-app:latest
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 60  # 容器启动后等待60秒才开始检查存活
          periodSeconds: 30        # 每30秒检查一次
          timeoutSeconds: 5        # 5秒内无响应则认为失败
          failureThreshold: 3      # 连续3次失败则重启容器
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 60  # 容器启动后等待60秒才开始检查就绪
          periodSeconds: 30        # 每30秒检查一次
          timeoutSeconds: 5        # 5秒内无响应则认为失败
          failureThreshold: 3      # 连续3次失败则认为不就绪,停止发送流量

在kustomization.yml中,可以通过patches或patchesStrategicMerge来修改现有Deployment的探针配置:

# kustomization.yml 示例
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml # 假设你的Deployment定义在此文件

patches:
- target:
    kind: Deployment
    name: my-spring-app
  patch: |-
    - op: replace
      path: /spec/template/spec/containers/0/livenessProbe/initialDelaySeconds
      value: 60
    - op: replace
      path: /spec/template/spec/containers/0/readinessProbe/initialDelaySeconds
      value: 60

注意事项:

  • initialDelaySeconds的值:应根据应用程序实际的启动时间来确定。可以通过观察应用程序在问题环境中的完整启动日志(从容器启动到/actuator/health/readiness返回200 OK)来估算所需时间。通常,可以从一个相对保守的值(如30-60秒)开始,然后根据实际情况进行调整。

  • Liveness和Readiness探针的路径:Spring Boot 2.3及更高版本默认提供了/actuator/health/liveness和/actuator/health/readiness用于区分存活和就绪状态。

  • periodSeconds、timeoutSeconds、failureThreshold:这些参数也应根据应用的响应特性和可接受的故障容忍度进行合理配置。

  • 应用内配置(可选):虽然Kubernetes的探针配置是首选,但Spring Boot也允许在application.yml中配置Actuator探针的某些行为,例如:

    management:
      endpoint:
        health:
          probes:
            enabled: true
    livenessProbe:
      httpGet:
        path: /actuator/health/liveness
        port: 8080
        initialDelaySeconds: 30 # 此处的initialDelaySeconds仅影响Spring Boot内部的探针行为,不直接控制Kubernetes探针
        periodSeconds: 30

    请注意,application.yml中的initialDelaySeconds主要是为那些不使用Kubernetes但需要内部健康检查的场景设计的,它并不能直接替代Kubernetes Pod定义中的探针配置。Kubernetes的探针配置是最终生效的。

总结

Spring Boot应用在Kubernetes中启动后立即关闭的问题,通常是由于Kubernetes的Liveness和Readiness探针在应用尚未完全准备好时就进行检查并失败所致。通过在Kubernetes的部署配置中,为Liveness和Readiness探针设置合适的initialDelaySeconds,可以为应用程序提供足够的启动和初始化时间。这确保了Kubernetes在应用程序真正健康并准备好接收流量之后才开始对其进行检查,从而避免了不必要的容器重启,提高了应用的稳定性和可用性。在生产环境中部署Spring Boot应用时,合理配置健康探针是保障服务高可用的关键一环。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

102

2025.08.06

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

389

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

68

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

33

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

114

2025.12.24

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

63

2025.10.17

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

20

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 46.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号