K8s 健康检查概念:机制、类型与实战示例
在 Kubernetes(K8s)中,健康检查是保障容器化应用高可用性的核心机制。它通过内置探针(Probe)定期检测容器内部状态,判断应用是否正常运行,并根据检测结果自动触发修复动作(如重启容器、移除服务流量),避免异常实例影响整体服务。健康检查的核心目标是 **“及时发现故障并自动恢复”**,减少人工干预,提升系统稳定性。
一、健康检查的核心作用
- 避免 “假活” 容器:容器进程可能运行但应用已卡死(如死锁、内存泄漏),健康检查可识别此类状态并重启容器。
- 防止流量转发到未就绪实例:新启动的容器可能需要加载配置或初始化数据,未完成前不应接收请求,健康检查可暂时屏蔽此类实例。
- 适配慢启动应用:部分应用(如 Java 服务)启动耗时较长,健康检查可避免因启动未完成而被误判为故障。
二、三类核心探针及实战示例
K8s 提供三种探针类型,分别解决不同场景的健康检查需求,可单独或组合使用。
1. 存活探针(Liveness Probe):检测容器是否 “存活”
作用:判断容器是否处于运行状态,若探测失败,K8s 会根据restartPolicy
重启容器(默认策略为Always
),适用于解决应用 “卡死但进程未退出” 的问题。
支持的探测方式:
- HTTP 请求:向容器内指定端口和路径发送 HTTP 请求,返回 2xx/3xx 状态码视为成功。
- TCP 连接:尝试与容器内指定端口建立 TCP 连接,连接成功视为正常。
- 命令执行:在容器内执行指定命令,返回码为 0 视为成功。
示例 1:HTTP 存活探针(Web 应用)
假设部署一个 Nginx 服务,需确保其能正常处理 HTTP 请求。若 Nginx 进程存活但配置错误导致无法响应,存活探针会触发重启。
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-liveness
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
livenessProbe: # 存活探针配置
httpGet:
path: / # 检测路径(首页)
port: 80 # 检测端口
initialDelaySeconds: 5 # 容器启动后延迟5秒开始第一次探测(避免启动中误判)
periodSeconds: 10 # 每10秒探测一次
timeoutSeconds: 2 # 探测超时时间(2秒内无响应视为失败)
failureThreshold: 3 # 连续3次失败则判定为容器故障
示例 2:命令执行存活探针(数据库应用)
对于 MySQL 容器,可通过执行mysqladmin ping
命令检测数据库是否正常响应。若命令执行失败(返回非 0 状态码),则重启容器。
yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-liveness
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
livenessProbe: # 命令执行型存活探针
exec:
command: ["mysqladmin", "ping", "-u", "root", "-ppassword"] # 执行ping命令
initialDelaySeconds: 30 # MySQL启动较慢,延迟30秒开始探测
periodSeconds: 10
failureThreshold: 2 # 连续2次失败则重启
2. 就绪探针(Readiness Probe):检测容器是否 “就绪” 提供服务
作用:判断容器是否已完成初始化,可正常接收请求。若探测失败,K8s 会将该 Pod 从服务(Service)的 endpoints 列表中移除,不再转发流量,适用于避免未准备好的实例接收请求。
特点:就绪探针失败不会重启容器,仅屏蔽流量;当探测成功后,Pod 会重新加入服务端点。
示例:HTTP 就绪探针(API 服务)
假设部署一个 Python API 服务,启动时需加载数据(耗时约 20 秒),未加载完成前不应接收请求。就绪探针可在数据加载完成后才允许流量进入。
yaml
apiVersion: v1
kind: Pod
metadata:
name: api-readiness
spec:
containers:
- name: api-service
image: my-api:latest
ports:
- containerPort: 5000
readinessProbe: # 就绪探针配置
httpGet:
path: /health # 应用自定义健康检查接口(数据加载完成后返回200)
port: 5000
initialDelaySeconds: 10 # 启动10秒后开始探测
periodSeconds: 5 # 每5秒探测一次
successThreshold: 1 # 1次成功即视为就绪
- 启动初期,
/health
接口返回 503,Pod 不会被加入 Service endpoints,流量不转发。 - 数据加载完成后,
/health
返回 200,Pod 被加入 endpoints,开始接收请求。
3. 启动探针(Startup Probe):适配慢启动应用
作用:专门针对启动时间长的应用(如大型 Java 服务、数据处理服务),确保应用完全启动前不执行存活 / 就绪探针,避免因启动未完成而被误判为故障。
逻辑:启动探针成功前,存活 / 就绪探针不会运行;启动探针成功后,存活 / 就绪探针才开始工作。若启动探针失败,K8s 会重启容器。
示例:启动探针 + 存活探针(Java 服务)
某 Java 服务启动需 60 秒(加载依赖、初始化缓存),若存活探针过早探测会失败。通过启动探针先确认服务启动完成,再启用存活探针。
yaml
apiVersion: v1
kind: Pod
metadata:
name: java-startup
spec:
containers:
- name: java-app
image: my-java-app:latest
ports:
- containerPort: 8080
startupProbe: # 启动探针:判断服务是否启动完成
httpGet:
path: /actuator/health # Spring Boot健康检查接口
port: 8080
failureThreshold: 30 # 最多探测30次
periodSeconds: 2 # 每2秒探测一次(总超时30×2=60秒)
livenessProbe: # 启动探针成功后才生效
httpGet:
path: /actuator/health
port: 8080
periodSeconds: 10
- 启动探针在 60 秒内持续探测,若 60 秒内
/actuator/health
返回 200,视为启动成功,存活探针开始工作。 - 若 60 秒内未成功,判定启动失败,容器重启。
三、探针配置参数说明
所有探针均可配置以下核心参数,灵活适配应用特性:
参数 | 作用 | 示例值 |
---|---|---|
initialDelaySeconds | 容器启动后延迟多久开始第一次探测 | 5(秒) |
periodSeconds | 探测间隔时间 | 10(秒) |
timeoutSeconds | 单次探测超时时间(超时视为失败) | 2(秒) |
successThreshold | 连续成功多少次视为探测通过 | 1 |
failureThreshold | 连续失败多少次视为整体失败 | 3 |
四、总结
K8s 健康检查通过存活、就绪、启动三类探针,全方位保障应用稳定性:
- 存活探针解决 “容器活但应用死” 的问题,确保实例存活。
- 就绪探针控制流量分发,避免未准备好的实例接收请求。
- 启动探针适配慢启动场景,防止误判。
通过合理配置探针类型和参数,可显著提升容器化应用的可用性,是 K8s 运维的核心实践之一。