若依微服务健康检查终极指南:K8s探针配置实战
1. 实际应用场景背景
在企业数字化转型过程中,基于若依框架构建的微服务系统在Kubernetes集群中运行时,如何确保服务高可用成为关键挑战。
通过合理配置健康检查探针,可以实现故障自动恢复和流量智能调度,保障业务连续性。
2. 微服务健康检查的核心价值
Kubernetes通过三种探针来监控容器状态:
- 存活探针(Liveness Probe):检测容器是否正常运行,失败时会重启容器
- 就绪探针(Readiness Probe):检测容器是否准备好接收流量,失败时会从服务端点中移除
- 启动探针(Startup Probe):检测应用是否已启动完成,适用于启动较慢的应用
这些探针协同工作,确保微服务在Kubernetes集群中的高可用性。
2.1 探针失败时的行为
当不同类型的探针失败时,Kubernetes会有不同的处理方式:
-
启动探针失败:如果启动探针在配置的失败阈值内未能成功,Kubernetes会终止容器并根据重启策略决定是否重启。如果重启策略允许,会在当前Pod内创建一个新的容器实例来替代失败的容器。
-
就绪探针失败:当就绪探针失败时,Kubernetes不会终止或重启Pod,而是将该Pod从服务的端点列表中移除,这意味着不会有新的流量被路由到这个Pod。一旦就绪探针再次成功,Pod会重新加入到服务端点列表中。
-
存活探针失败:当存活探针失败时,Kubernetes会终止Pod中的容器,并根据Pod的重启策略在同一个Pod内创建一个新的容器来替代它。这会导致容器的重启,但Pod本身不会被重新创建。如果Pod的重启策略设置为Always或OnFailure,容器重启失败时可能会导致整个Pod被重新调度创建。
需要注意的是,就绪探针和存活探针是并行运行的,它们各自独立地进行检查和响应。如果只有就绪探针失败而存活探针成功,Pod会继续运行但不会接收流量;如果存活探针失败,无论就绪探针状态如何,容器都会被重启。
2.2 探针失败后的行为总结表
探针类型 | 重启策略 | 行为描述 |
---|---|---|
Startup | Always | 重启工作容器(若多次失败且超时,可能触发 Pod 重建,取决于控制器配置)。 |
Startup | OnFailure | 重启工作容器(仅当容器退出状态非零时生效)。 |
Startup | Never | 不重启容器,Pod 保持运行但容器终止(启动失败)。 |
Readiness | Always | 无影响(仅标记容器为未就绪,不重启或删除 Pod)。 |
Readiness | OnFailure | 无影响(同上)。 |
Readiness | Never | 无影响(同上)。 |
Liveness | Always | 重启工作容器(Pod 保持运行,容器重新启动)。若容器持续失败可能导致Pod重建。 |
Liveness | OnFailure | 重启工作容器(仅当容器退出状态非零时生效,与 Always 在此场景下行为一致)。 |
Liveness | Never | 不重启容器,Pod 保持运行但容器终止(需外部干预恢复)。 |
3. 若依系统架构与健康检查需求
若依微服务系统包含多个核心组件:
- ruoyi-gateway:API网关,负责请求路由和权限控制
- ruoyi-auth:认证授权服务,处理用户登录和Token验证
- ruoyi-system:系统管理服务,包含用户、角色、菜单等基础功能
- ruoyi-web:前端Web服务,提供用户界面
这些服务均基于Spring Boot框架,自带Actuator健康检查端点。
4. 健康检查配置实践
4.1 基础健康检查端点
若依项目基于Spring Boot框架,自带Actuator健康检查端点。为了启用这些功能,首先需要在项目的pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
该依赖用于引入Spring Boot Actuator组件,它提供了生产就绪的功能,包括健康检查、指标收集等。Actuator是Spring Boot提供的用于监控和管理应用程序的模块。
然后在各服务的配置文件中启用健康检查并配置管理端口:
# 暴露监控端点
management:
server:
port: 18080
endpoints:
web:
exposure:
include: '*'
该配置的作用:
- 将Actuator的管理端口设置为
18080
,与应用程序的业务端口(通常是8080)分离 - 暴露所有web端点(通过
include: '*'
),包括健康检查端点 - 这样做可以将健康检查与业务逻辑分离,提高安全性
在实际项目中,将管理端口与业务端口分离不仅提高了安全性,还避免了业务高峰期对健康检查接口的影响。
5. 基于Kustomize的健康检查配置实践
5.1 项目目录结构
ruoyi-cloud/
├── base/
│ ├── ruoyi-auth/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── kustomization.yaml
│ ├── ruoyi-gateway/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── kustomization.yaml
│ ├── ruoyi-system/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── kustomization.yaml
│ └── ruoyi-web/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
└── ruoyi-cloud-prod-project/
├── ruoyi-auth/
│ ├── health-patch.yaml
│ └── kustomization.yaml
├── ruoyi-gateway/
│ ├── health-patch.yaml
│ └── kustomization.yaml
├── ruoyi-system/
│ ├── ruoyi-system-v1/
│ │ ├── health-patch.yaml
│ │ └── kustomization.yaml
│ └── ruoyi-system-v2/
│ ├── health-patch.yaml
│ └── kustomization.yaml
└── ruoyi-web/
├── health-patch.yaml
└── service-health-patch.yaml
5.2 基础配置文件
基础Deployment配置(以ruoyi-gateway为例):
# base/ruoyi-gateway/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-gateway
spec:
template:
spec:
containers:
- image: ruoyi-gateway-image
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
name: ruoyi-gateway
ports:
- name: http-8080
containerPort: 8080
protocol: TCP
- name: http-18080
containerPort: 18080
protocol: TCP
5.3 健康检查补丁配置
通过Kustomize补丁机制添加健康检查,避免修改基础配置:
# overlays/ruoyi-cloud-prod-project/ruoyi-gateway/health-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-gateway
spec:
template:
spec:
containers:
- name: ruoyi-gateway
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 18080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 18080
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 3
就绪与存活探针是同步进行的。以ruoyi-gateway为例解释相关字段含义:
initialDelaySeconds
:初始延迟时间,单位为秒periodSeconds
:检查间隔时间,单位为秒timeoutSeconds
:请求超时时间failureThreshold
:失败阈值,即连续多少次检查失败
容器启动后,livenessProbe
和readinessProbe
就准备开始工作,在经历initialDelaySeconds
时间后,就开始向path: port
发送HTTP GET请求,并等待响应。每隔periodSeconds
时间检查一次,每发一次请求,timeoutSeconds
后认为超时失败,如果连续failureThreshold
次检查失败,则认为容器已经死亡,Kubernetes会重启该容器。
5.4 Kustomize配置引用
在overlay层引用补丁文件:
# overlays/ruoyi-cloud-prod-project/ruoyi-gateway/kustomization.yaml
resources:
- ../../../base/ruoyi-gateway
patches:
- health-patch.yaml
6. 各服务健康检查配置详解
6.1 Java服务健康检查(ruoyi-gateway、ruoyi-auth、ruoyi-system)
这些基于Spring Boot的服务使用Actuator端点:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 18080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 18080
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 3
6.2 Web服务健康检查(ruoyi-web)
前端Web服务使用首页作为健康检查端点:
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 3
7. Istio服务网格中的健康检查适配
在Istio环境中,健康检查配置会被自动重写:
原始配置:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 18080
scheme: HTTP
Istio重写后:
livenessProbe:
httpGet:
path: /app-health/ruoyi-gateway/livez
port: 15020
scheme: HTTP
这是Istio的正常行为,通过重写探针路径确保流量经过sidecar代理。
8. 健康检查参数优化建议
8.1 探针参数配置原则
- initialDelaySeconds:根据应用启动时间设置,避免过早探测
- periodSeconds:生产环境建议10-30秒,平衡及时性和性能
- timeoutSeconds:通常设置为3-5秒,避免网络波动导致误判
- failureThreshold:设置为3次,防止瞬时故障导致服务中断
8.2 不同环境的差异化配置
开发环境可适当放宽探针条件,生产环境则需要更严格的配置以确保服务稳定性。
9. 故障排查与监控
9.1 常用排查命令
# 查看Pod详细信息和探针状态
kubectl describe pod <pod-name> -n <namespace>
# 查看Pod日志
kubectl logs <pod-name> -n <namespace> -c <container-name>
# 查看探针相关事件
kubectl get events --field-selector involvedObject.name=<pod-name>
9.2 常见问题处理
- 频繁重启:检查initialDelaySeconds是否足够长
- 探针超时:优化健康检查端点性能或增加timeoutSeconds
- 就绪探针失败:检查服务依赖和配置
10. 总结
通过Kustomize补丁机制为若依微服务系统配置健康检查,既保持了基础配置的纯净性,又实现了灵活的定制化需求。合理配置存活探针和就绪探针,结合Istio服务网格的自动适配,可以显著提升系统在Kubernetes环境中的稳定性和可靠性。
关键实践要点:
- 使用Kustomize补丁机制分离基础配置和定制配置
- 合理设置探针参数,平衡检测及时性和系统性能
- 理解Istio环境下健康检查的自动重写机制
- 建立完善的监控和故障排查流程
参考文档:
评论区