一、概述
在 spring boot 2.3 中引入了容器探针,也就是增加了 /actuator/health/liveness
和 /actuator/health/readiness
这两个健康检查路径,对于部署在 k8s 中的应用,spring-boot-actuator 将通过这两个路径自动进行健康检查。本文主要根据官方文档的描述实践并记录使用流程,从如下几个方面进行介绍:
二、spring-boot-actuator 中的 k8s 探针
1、spring boot 对 k8s 环境的判断
官方文档如下图所示,SpringBoot 判断是否是 kubernetes 环境的逻辑很简单,检查是否有 *_SERVICE_HOST
和*_SERVICE_PORT
这两个环境变量:
对于熟悉 k8s 的小伙伴应该会想起 KUBERNETES_SERVICE_HOST
和 KUBERNETES_SERVICE_PORT
,这是 k8s 给 pod 中配置的环境变量,所以我们可以知道 SpringBoot
是针对 k8s 的这个规则来判定是否是容器环境的。通过下面的操作查看一下 pod 中的这两个环境变量:
2、验证上述规则
创建一个 spring boot 应用,其中 pom.xml 的 parent 信息如下(我这里使用的 2.4.5,需要 >= 2.3.x 版本):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
并且添加 spring-boot-starter-actuator
的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
直接启动应用,使用浏览器访问:http://localhost:8080/actuator/health/readiness ,返回 404 错误:
以上返回是符合预期的,因为此时并非在kubernetes环境。/actuator/health/liveness
和 /actuator/health/readiness
在 kubernetes 环境才会开启,但是一般情况下,在开发阶段 SpringBoot 应用运行在自己的电脑上,此时如果想查看这两个接口的返回值有两种方式:
第一种,就是添加*_SERVICE_HOST
和*_SERVICE_PORT
这两个环境变量,让 SpringBoot 以为当前环境是kubernetes环境;
在 idea 中配置这两个环境变量如下图所示:
再次运行程序,这次返回的状态码是200:
第二种,官方给出的描述是:如果应用运行在 k8s 环境,这些健康检查自动启动,你可以配置management.endpoint.health.probes.enabled=true
在任何环境中启用他们。
在 application.properties 中添加如下配置:
management.endpoint.health.probes.enabled=true
再次运行程序,这次返回的状态码是200:
3、应用生命周期和探针状态
Kubernetes Probes支持的一个重要方面是它与应用程序生命周期的一致性。在AvailabilityState(应用程序的内存内部状态)和暴露该状态的实际Probe之间有一个显著的区别:根据应用程序生命周期的阶段,Probe可能不可用。
Spring Boot 在启动和关闭期间发布 Application Events,Probes 可以监听此类事件并暴露 AvailabilityState 信息。
下表显示了AvailabilityState和HTTP连接器在不同阶段的状态。
在 Spring Boot 启动过程中,应用、存活探针、就绪探针以及 http server状态对应关系如下图:
在 Spring Boot 关闭过程中,应用、存活探针、就绪探针以及 http server状态对应关系如下图:
参考文档
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。