1.引言
在云原生应用开发中,健康检查是确保微服务可靠性和稳定性的关键环节。特别是在 Kubernetes 这样的容器编排平台上,健康检查可以有效地监控和管理应用程序的状态,及时发现并处理潜在的故障情况,从而确保整个系统的正常运行。
而 Spring Boot 作为一种流行的 Java 微服务框架,其在 Kubernetes 上的部署和健康检查配置也是开发者们关注的焦点。本文将针对这一问题,提供一套完整的实战指南,帮助读者深入了解在 Kubernetes 环境中部署 Spring Boot 微服务并实施健康检查的步骤和方法。
2.原理
2.1.Kubernetes健康检查机制
Kubernetes中的健康检查主要使用 就绪性探针`readinessProbe` 、存活性探针 `livenessProbe` 和启动探针 `startupProbe` 来实现,service即为负载均衡,k8s保证 service 后面的 pod 都可用,是k8s中自愈能力的主要手段,基于这两种探测机制,可以实现如下需求:
- 异常实例自动剔除,并重启新实例。
- 多种类型探针检测,保证异常pod不接入流量。
- 不停机部署,更安全的滚动升级。
2.1.1探针类型
针对运行中的容器,`kubelet` 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:
- livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其`重启策略`进行重启。如果容器不提供存活探针,则默认状态为 Success。
- readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。初始延迟之前的就绪态的状态值默认为 `Failure`。 如果容器不提供就绪态探针,则默认状态为 `Success。`
- startupProbe:指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其`重启策略`进行重启。 如果容器没有提供启动探测,则默认状态为 `Success`。
2.1.2.探针结果
每次探测都将获得以下三种结果之一:
- Success(成功): 容器通过了诊断。
- Failure(失败): 容器未通过诊断。
- Unknown(未知): 诊断失败,因此不会采取任何行动。
2.2.Spring Boot对Kubernetes容器探针的支持
Spring Boot 2.3 版本引入了容器探针功能,其中包括了 `/actuator/health/liveness` 和 `/actuator/health/readiness` 这两个健康检查路径。这些路径是为了更好地支持部署在 Kubernetes 等容器环境中的应用程序。
- `/actuator/health/liveness` 用于存活性检查,确定应用程序是否仍然在运行。
- `/actuator/health/readiness` 用于就绪性检查,确定应用程序是否准备好接收流量。
Spring Boot Actuator 会自动将这两个路径暴露出来,并通过它们来执行相应的健康检查。这样,当你在 Kubernetes 中部署 Spring Boot 应用程序时,Kubernetes 可以利用这些路径来确定容器是否健康和准备好接收流量。
这种集成简化了在 Kubernetes 中部署 Spring Boot 应用程序的流程,并提高了应用程序的可靠性和可用性。
2.2.1.Spring Boot如何识别k8s环境
Spring Boot 通过检查环境中的 `"*_SERVICE_HOST"` 和 `"*_SERVICE_PORT"` 变量来自动检测 Kubernetes 部署环境。也可以使用 `spring.main.cloud-platform` 配置属性覆盖此检测。Spring Boot 识别到 Kubernetes 环境后,Spring Boot Actuator 会自动将`/actuator/health/liveness` 和 `/actuator/health/readiness`这两个端点暴露出来。
小技巧:本地验证这一特性可以通过手动设置 *KUBERNETES_SERVICE_HOST* 和 *KUBERNETES_SERVICE_PORT* 这两个环境变量来开启存活和就绪检查。访问 *http://localhost:8080/actuator/health/liveness* 响应200状态码时代表已开启。