spring boot 应用在 k8s 中的健康检查(二)

一、概述

在 spring boot 2.3 中引入了容器探针,也就是增加了 /actuator/health/liveness/actuator/health/readiness 这两个健康检查路径,对于部署在 k8s 中的应用,spring-boot-actuator 将通过这两个路径自动进行健康检查。本文主要根据官方文档的描述实践并记录使用流程,从如下几个方面进行介绍:

  1. k8s 中的健康检查
  2. spring-boot-actuator 中的 k8s 探针
  3. spring boot 健康检查在 k8s 中的实践

二、spring-boot-actuator 中的 k8s 探针

1、spring boot 对 k8s 环境的判断

官方文档如下图所示,SpringBoot 判断是否是 kubernetes 环境的逻辑很简单,检查是否有 *_SERVICE_HOST*_SERVICE_PORT 这两个环境变量:

image.png

对于熟悉 k8s 的小伙伴应该会想起 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT,这是 k8s 给 pod 中配置的环境变量,所以我们可以知道 SpringBoot 是针对 k8s 的这个规则来判定是否是容器环境的。通过下面的操作查看一下 pod 中的这两个环境变量:

image.png

2、验证上述规则

创建一个 spring boot 应用,其中 pom.xml 的 parent 信息如下(我这里使用的 2.4.5,需要 >= 2.3.x 版本):


    org.springframework.boot
    spring-boot-starter-parent
    2.4.5
     

并且添加 spring-boot-starter-actuator 的依赖:


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

直接启动应用,使用浏览器访问:http://localhost:8080/actuator/health/readiness ,返回 404 错误:

image.png

以上返回是符合预期的,因为此时并非在kubernetes环境。/actuator/health/liveness/actuator/health/readiness 在 kubernetes 环境才会开启,但是一般情况下,在开发阶段 SpringBoot 应用运行在自己的电脑上,此时如果想查看这两个接口的返回值有两种方式:

第一种,就是添加*_SERVICE_HOST*_SERVICE_PORT这两个环境变量,让 SpringBoot 以为当前环境是kubernetes环境;

在 idea 中配置这两个环境变量如下图所示:

image.png
image.png
image.png

再次运行程序,这次返回的状态码是200:

image.png

第二种,官方给出的描述是:如果应用运行在 k8s 环境,这些健康检查自动启动,你可以配置management.endpoint.health.probes.enabled=true 在任何环境中启用他们。

image.png

在 application.properties 中添加如下配置:

management.endpoint.health.probes.enabled=true

再次运行程序,这次返回的状态码是200:

image.png

3、应用生命周期和探针状态

Kubernetes Probes支持的一个重要方面是它与应用程序生命周期的一致性。在AvailabilityState(应用程序的内存内部状态)和暴露该状态的实际Probe之间有一个显著的区别:根据应用程序生命周期的阶段,Probe可能不可用。

Spring Boot 在启动和关闭期间发布 Application Events,Probes 可以监听此类事件并暴露 AvailabilityState 信息。

下表显示了AvailabilityState和HTTP连接器在不同阶段的状态。

在 Spring Boot 启动过程中,应用、存活探针、就绪探针以及 http server状态对应关系如下图:

image.png

在 Spring Boot 关闭过程中,应用、存活探针、就绪探针以及 http server状态对应关系如下图:


image.png

参考文档

官网 spring boot actuator k8s 配置

官网 spring boot 运行 k8s 环境

官网 应用生命周期和探针状态

你可能感兴趣的:(spring boot 应用在 k8s 中的健康检查(二))