K8S 探针配置
kubernetes提供了三种探针(支持exec、tcp和http方式)来探测容器的状态
1. LivenessProbe
容器存活性检查,用于判断容器是否健康,告诉 kubelet 一个容器什么时候处于不健康的状态。如果 LivenessProbe 探针探测到容器不健康,则 kubelet 将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success;
2. ReadinessProbe
容器就绪性检查,用于判断容器是否启动完成且准备接收请求。如果ReadinessProbe探针探测到失败,Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 IP 地址的Endpoint条目。如果容器不提供就绪态探针,则默认状态为 Success。
3. StartupProbe
容器启动检查,指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。
4. 三种探针共有配置
Probe有如下配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:
-
initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
-
periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
-
timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
-
successThreshold:探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
-
failureThreshold:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。
SpringBoot集成
1. 引入依赖
implementation("org.springframework.boot:spring-boot-starter-actuator")
从 Spring Boot 2.3 开始,LivenessStateHealthIndicator 和 ReadinessStateHealthIndicator 类将公开应用程序的活跃度和就绪状态。 当将应用程序部署到 Kubernetes 时,Spring Boot 会自动注册这些健康指标,即默认在K8S环境下,liveness
和readiness
探针会自动注册,当然也可以显示开启。
显示开启liveness
和readiness
探针
management:
endpoint:
health:
probes:
enabled: true
health:
livenessstate:
enabled: true
readinessstate:
enabled: true
2. 探针配置
Spring Boot Actuator 提供了 Endpoints(端点)给外部来与应用程序进行访问和交互。
例如 /health
端点提供了关于应用健康情况的一些基础信息。/metrics
端点提供了一些有用的应用程序指标(JVM 内存使用、系统 CPU 使用等)。
一般来说,端点可以分为几类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与 Spring Boot 应用密切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP 请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能。
如上述配置,开启了helath
端点。
management:
endpoints:
web:
exposure:
include: health
helath端点配置
/health
端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于参数 management.endpoint.health.show-details
,该属性值可选项为:
属性值 | 描述 |
---|---|
never | 不展示详细信息,up 或者 down 的状态,默认配置 |
when-authorized | 详细信息将会展示给通过认证的用户,授权的用户可以通过management.endpoint.health.roles配置 |
alawys | 对所有用户暴露详细信息 |
由于我们配置在K8S内部,且服务不对外暴露,这里配置成always
就可。
management:
endpoints:
web:
exposure:
include: health
endpoint:
health:
probes:
enabled: true
show-details: always
访问 IP + PORT + /acacutor/health
就可以看到详细信息了。
组件健康监测
如上如,我们访问IP + PORT + /acacutor/health
看到的是所有组件的健康状态,也可以通过配置禁用某个组件的健康监测
## 禁用Redis健康监测
management:
health:
redis:
enabled: false
## 禁用所有自动配置的健康监测
management:
health:
defaults:
enabled: false
常见指示器
自定义健康监测
实现HealthIndicator
接口或者继承AbstractHelathIndicator
类