一文掌握k8s的健康检查探针

简介

容器的健康检查探针是指容器运行过程中,需要定时检查容器中应用健康状况。

若未配置健康检查机制,当容器内的应用程序发生异常时,Pod无法感知该异常,也不会自动执行重启操作进行恢复。这样可能导致Pod状态显示为"运行中",但实际上容器内的应用已处于不可用或异常状态。

官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

Kubernetes提供了三种健康检查探针:

  • 存活探针livenessProbe:用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作,否则不执行任何操作。

  • 就绪探针readinessProbe:探测应用业务是否已经就绪,用于判断容器中的业务是否已就绪,以决定是否将流量转发至当前实例。在某些场景中,应用程序虽然进程已启动,但由于需要依赖外部服务的初始化,尚未具备对外提供服务的能力。此时,通过就绪检查可以避免将流量路由至尚未就绪的实例。如果容器的就绪检查失败,CCE集群会临时将其从服务端点中移除,屏蔽外部请求的访问。而一旦检查通过,容器即被视为就绪,可正常接收流量。

  • 启动探针startupProbe:用于检测应用是否已启动。 启动探针检测通过后,集群才会开始执行存活检查和就绪检查, 从而确保这些检查不会影响应用程序的启动。该探针适用于启动时间较长的容器,能够有效避免容器在初始化尚未完成时被误判为异常,从而被提前终止。

健康检查方式

  • HTTP请求方式httpGet:探针往容器发送HTTP请求,如果探针收到2xx或3xx的返回状态码,说明容器是健康。HTTP请求检查(httpGet):适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。

  • TCP请求方式tcpSocket:探针使用TCP套接字。 使用这种配置时,kubelet 会尝试在指定端口和容器建立套接字连接。如果能建立连接,这个容器就被看作是健康的,如果不能则这个容器就被看作是有问题的。适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。

  • 命令行脚本exec:探针执行容器中的命令并检查命令退出的状态码,如果状态码为0则说明健康。要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果退出码状态为0则检查成功,否则检查失败。

注意:

在高负载环境中,建议避免使用执行命令检查方式,执行命令会消耗系统资源,如果系统资源紧张(如CPU负载高、文件系统被锁住等)可能导致健康检查超时失败。如果需要使用执行命令检查,您可以参考以下建议:

  1. 增加失败次数和超时时间配置,避免因为突发性的资源竞争导致健康检查超时失败,但是该方式可能会降低业务敏感度,请合理配置。
  2. 通过合理规划业务容器或者系统插件的CPU Limit配置,避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。

各参数指标含义:

参数 名称 介绍
periodSeconds 检测周期 表示两次检测的间隔时间,单位为秒。 例如,设置为30,表示每30秒检测一次。
initialDelaySeconds 启动延时 表示成功运行后多久时间开始检测,是预留给业务程序启动的时间,单位为秒。 例如,设置为30,表明容器启动后30秒开始健康检查。
timeoutSeconds 超时时间 探针超时时间,单位为秒。若设置为0或不设置,默认超时等待时间为1秒。 例如,设置为10,表明执行健康检查的超时等待时间为10秒。如果超过这个时间,本次健康检查就被视为失败。
successThreshold 成功阈值 表示服务检测失败后,转变为"健康"所需要的最小连续成功次数。该参数的默认值为1,且最小允许值为1。在存活探针和启动探针中,这个值必须为1。 例如,设置为1时,表明健康检查失败后,仅需连续成功1次,即可将工作负载恢复为正常状态。
failureThreshold 最大失败次数 表示在容器被判定为"不健康"之前,允许连续探测失败的次数。该参数默认值为 3,最小值为 1。 1.对于存活探针:当连续失败次数达到该阈值后,容器将被标记为不健康,且kubelet会重启容器。 2.对于就绪探针:当连续失败次数达到阈值后,Pod会被标记为未就绪,并从Service的Endpoints 中移除,停止接收新流量,且容器不会被重启。

YAML示例


复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: <image_address>
    args:
    - /server
    livenessProbe:                 # 存活探针
      httpGet:                     # 以HTTP请求检查为例
        path: /healthz             # HTTP检查路径为/healthz
        port: 80                   # 检查端口为80
        httpHeaders:               # 可选,请求头名称为Custom-Header,对应的值为Awesome
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3
    readinessProbe:                # 就绪探针
      exec:                        # 以执行命令检查为例
        command:                   # 需要执行的命令
          - cat
          - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
    startupProbe:                  # 启动探针
      httpGet:                     # 以HTTP请求检查为例
        path: /healthz             # HTTP检查路径为/healthz
        port: 80                   # 检查端口为80
      failureThreshold: 30
      periodSeconds: 10

通过xkube进行设置

通过多集群k8s管理平台xkube的功能可以轻松的设置探针,xkube安装部署参考:https://blog.csdn.net/weixin_56364253/article/details/156390146

功能参考下图:

相关推荐
我是谁??1 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
Patrick_Wilson1 小时前
K8s 探针避坑:Next.js 不同部署模式下的健康检查实践
kubernetes·node.js·next.js
运维瓦工1 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Plastic garden2 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
Plastic garden2 小时前
k8s(11) Pod 控制器,服务发现与存储管理
kubernetes
与海boy2 小时前
docker compose minio
docker·容器·eureka
星辰徐哥3 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops
武子康3 小时前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
heimeiyingwang4 小时前
【架构实战】分布式会话:从Session到JWT的演进
微服务·云原生·架构