Spring Boot应用在Kubernetes环境中启动后立即关闭的诊断与解决

大辰姑娘_7446

大辰姑娘_7446

2025-11-09

620人浏览

原创

spring boot应用在kubernetes环境中启动后立即关闭的诊断与解决

本文旨在解决Spring Boot应用在Kubernetes环境中启动后立即关闭的问题。核心原因在于Kubernetes的就绪性探针(Readiness Probe)在应用尚未完全初始化并准备好接受流量时,过早地判断应用为“未就绪”并触发终止。通过配置就绪性探针和存活性探针的`initialDelaySeconds`参数,为应用提供足够的启动时间,可以有效解决此问题,确保应用稳定运行。

在将Spring Boot应用部署到Kubernetes集群时,开发者可能会遇到应用在容器启动后立即终止的现象。尽管应用在本地开发环境或非Kubernetes的开发环境中运行良好,但在生产预发布(PP)等更严格的Kubernetes环境中,却出现启动后迅速关闭的问题。通过分析应用日志,我们通常会发现以下关键信息:

2022-11-30 13:11:12.110  INFO 1 --- [           main] c.a.f.MyApplication                      : Started MyApplication in 96.297 seconds (JVM running for 104.706)
2022-11-30 13:11:12.513  INFO 1 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
...
Application availability state ReadinessState changed to REFUSING_TRAFFIC

日志显示应用似乎成功启动("Started MyApplication..."),但紧接着出现了Application availability state ReadinessState changed to REFUSING_TRAFFIC,并且触发了关闭事件("Closing JPA EntityManagerFactory...","HikariPool-1 - Shutdown initiated...")。这表明应用在启动后不久就被外部机制判定为不可用并被终止。

理解Kubernetes的探针机制

Kubernetes为了确保部署的应用的健壮性和高可用性,引入了两种核心探针:存活性探针(Liveness Probe)和就绪性探针(Readiness Probe)。

  1. 存活性探针 (Liveness Probe)

    • 作用: 用于检测容器内的应用是否正在运行。如果存活性探针失败,Kubernetes会认为该容器已死亡,并根据重启策略重启容器。
    • 目的: 捕获应用死锁(例如,应用进程仍在运行但无法处理请求)的情况,通过重启来恢复服务。
  2. 就绪性探针 (Readiness Probe)

    • 作用: 用于检测容器内的应用是否已准备好接收流量。如果就绪性探针失败,Kubernetes会从Service的Endpoint列表中移除该Pod的IP地址,停止向其发送流量。当探针成功时,Pod会被重新加入Endpoint列表。
    • 目的: 确保流量只发送给完全初始化并能够响应请求的应用实例,避免在应用启动过程中或处理复杂初始化任务时将请求发送给未准备好的实例。

问题根源:就绪性探针的过早判断

从日志中ReadinessState changed to REFUSING_TRAFFIC这一行可以看出,问题在于Kubernetes的就绪性探针过早地对应用进行了健康检查。Spring Boot应用,尤其是包含数据库初始化(如Flyway)和JPA实体管理器加载等复杂逻辑的应用,启动过程可能需要较长时间。在此期间,尽管JVM已经启动,但应用可能尚未完全完成所有依赖注入、数据库连接池初始化或业务逻辑层的准备。

如果Kubernetes的就绪性探针在应用完全准备好之前就开始检查,并且应用尚未能响应探针请求(例如/actuator/health/readiness),或者其内部状态仍处于“REFUSING_TRAFFIC”,Kubernetes就会误判应用为“未就绪”。根据Kubernetes的默认行为,如果一个Pod长时间处于非就绪状态,或者其存活性探针失败,可能会导致Pod被终止并重新创建,从而陷入无限重启的循环。

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

为了解决这个问题,我们需要为Kubernetes的就绪性探针和存活性探针配置一个初始延迟时间(initialDelaySeconds)。这个参数告诉Kubernetes在容器启动后,等待指定秒数后再开始执行探针检查。这为Spring Boot应用提供了足够的时间来完成其启动和初始化过程,确保在探针开始检查时,应用已经处于可接受流量的“ACCEPTING_TRAFFIC”状态。

Kubernetes Network Policy Generator
Kubernetes Network Policy Generator

使用加权评分卡在12项标准上评估和比较隐私解决方案供应商。适用于选择隐私管理软件、比较数据保护方案等场景。

下载

1. Kubernetes配置示例 (Kustomization或Deployment YAML)

在Kubernetes的部署配置中,可以通过在readinessProbe和livenessProbe下添加initialDelaySeconds来设置延迟。

使用Kustomization文件进行补丁修改:

# kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml # 假设你的Deployment定义在这里

patches:
  - target:
      kind: Deployment
      name: my-app-deployment # 替换为你的Deployment名称
    patch: |
      - op: replace
        path: /spec/template/spec/containers/0/readinessProbe/initialDelaySeconds
        value: 60
      - op: replace
        path: /spec/template/spec/containers/0/livenessProbe/initialDelaySeconds
        value: 60

直接在Deployment YAML中配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app-container
          image: com.xyz/my-app:0.0.1-SNAPSHOT
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness # Spring Boot Actuator的就绪性端点
              port: 8080
            initialDelaySeconds: 60 # 容器启动后,等待60秒再开始检查就绪性
            periodSeconds: 10       # 每10秒检查一次
            timeoutSeconds: 5       # 探针超时时间
            failureThreshold: 3     # 失败3次后认为不就绪
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness # Spring Boot Actuator的存活性端点
              port: 8080
            initialDelaySeconds: 60 # 容器启动后,等待60秒再开始检查存活性
            periodSeconds: 10       # 每10秒检查一次
            timeoutSeconds: 5       # 探针超时时间
            failureThreshold: 3     # 失败3次后认为不存活

2. Spring Boot应用内配置 (可选但推荐)

为了让Spring Boot应用能够正确响应Kubernetes的健康检查,需要引入spring-boot-starter-actuator依赖,并在application.yml中配置相应的健康端点。

pom.xml依赖:

<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-actuator</artifactid></dependency>

application.yml配置:

management:
  endpoint:
    health:
      show-details: always # 建议在非生产环境开启,方便调试
      probes:
        enabled: true # 启用LivenessState和ReadinessState
  endpoints:
    web:
      exposure:
        include: health # 暴露健康端点

如果需要进一步细化Spring Boot应用内部的就绪性判断逻辑,例如,当所有数据库连接池都初始化完毕后才报告为“就绪”,可以自定义健康指示器。

注意事项与最佳实践

  • initialDelaySeconds的设置: 这个值应该根据应用的实际启动时间来确定。可以通过本地测试、查看日志中“Started MyApplication in X seconds”的时间,并在此基础上增加一个安全裕度来估算。过短可能导致问题复现,过长则会延长应用部署上线时间。
  • periodSeconds、timeoutSeconds和failureThreshold:
    • periodSeconds:探针执行的频率。
    • timeoutSeconds:探针请求的超时时间。
    • failureThreshold:探针连续失败多少次后被判定为失败。 合理配置这些参数可以防止误判,并提高系统的响应性。
  • 区分Liveness和Readiness: 存活性探针关注应用是否“活着”,就绪性探针关注应用是否“准备好接收流量”。两者目的不同,通常就绪性探针的条件会比存活性探针更严格。
  • 日志监控: 部署后务必密切关注Pod的事件日志和应用容器的详细日志,以便在探针配置不当或应用本身存在其他问题时,能及时发现并进行调整。
  • 平滑启动与关闭: 除了探针,还应考虑应用在接收SIGTERM信号时的平滑关闭机制,确保在Pod终止前,所有正在处理的请求都能完成,并释放资源。Spring Boot 2.3+ 默认支持优雅停机。

总结

Spring Boot应用在Kubernetes中启动后立即关闭,通常是由于Kubernetes的就绪性探针在应用尚未完全初始化时过早检查所致。通过在Kubernetes部署配置中为readinessProbe和livenessProbe设置合理的initialDelaySeconds,可以为应用提供充足的启动时间。结合Spring Boot Actuator的健康端点,确保应用能够正确响应Kubernetes的健康检查,是保障应用在云原生环境中稳定运行的关键。正确配置这些探针,不仅能解决启动问题,还能提升应用的韧性和用户体验。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

kubernetes 日志监控

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.08.06

2771

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

497

25

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

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

2023.09.05

671

5

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

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

2023.10.12

1455

7

Java Spring Boot开发
Java Spring Boot开发

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

2025.08.19

5366

10

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

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

2025.12.22

436

5

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

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

2025.12.24

660

18

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

2026.02.11

405

24

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

2026.02.12

391

18

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习