K8s健康检查:探针机制与实战指南

K8s 健康检查概念:机制、类型与实战示例

在 Kubernetes(K8s)中,健康检查是保障容器化应用高可用性的核心机制。它通过内置探针(Probe)定期检测容器内部状态,判断应用是否正常运行,并根据检测结果自动触发修复动作(如重启容器、移除服务流量),避免异常实例影响整体服务。健康检查的核心目标是 **“及时发现故障并自动恢复”**,减少人工干预,提升系统稳定性。

一、健康检查的核心作用

  1. 避免 “假活” 容器:容器进程可能运行但应用已卡死(如死锁、内存泄漏),健康检查可识别此类状态并重启容器。
  2. 防止流量转发到未就绪实例:新启动的容器可能需要加载配置或初始化数据,未完成前不应接收请求,健康检查可暂时屏蔽此类实例。
  3. 适配慢启动应用:部分应用(如 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 运维的核心实践之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值