k8s健康检查参数解析

一、背景

k8s会托管部署在其中的容器,并且对于容器进行全生命周期的管理,包括容器的创建,销毁和重启等操作。那么k8s是怎么管理容器的生命周期呢?

k8s为资源提供了健康检查的探针,通过健康检查的探针来监测容器的运行和存活状态,在通过资源配置的管理策略,结合kubelet api来完成对于集群资源全周期的管理。

k8s提供了三种探针来进行容器的监控检查,分别是startupProbe,livenessProbe,readinessProbe。接下来主要介绍这三种探针以及如何配置这三种探针。

二、探针

在了解k8s通过三个不同的探针来进行容器健康状态检查,从而配置其他功能完成对容器的管理。

  • startupProbe

启动探针主要关注容器启动阶段的初始化过程,确保应用已正确启动并进入稳定状态。

  • livenessProbe

主要作用是看什么时候重启容器,存活探针用于检查容器是否仍然"活着",即它是否能正常提供服务。如果连续多次探测失败(达到failureThreshold),kubelet会认为容器已经死亡或不可恢复,进而重启该容器。

  • readinessProbe

主要作用是判断容器是否准备好接收请求流量。只有当readinessProbe返回成功时,kubelet才会将Pod标记为就绪状态,并将其纳入Service的endpoints中。如果readiness检查失败会从service的endpoints中将pod移除。已确保只有健康状态的应用才会分发流量。

如果配置了startupProbe,则只有当startupProbe成功后,kubelet才会开始处理livenessProbe和readinessProbe;如果没有配置startupProbe,则由livenessProbe和readinessProbe配置参数决定各自启动时间。不同服务可以通过配置启动探针来调整进行readiness和liveness的时间避免过早执行检查造成不必要的重启和流量分发。

The kubelet uses startup probes to know when a container application has started. If such a probe is configured, liveness and readiness probes do not start until it succeeds, making sure those probes don't interfere with the application startup. This can be used to adopt liveness checks on slow starting containers, avoiding them getting killed by the kubelet before they are up and running.

以下代码分别展示了k8s健康检查的三个探针startupProbe,livenessProbe,readinessProbe。

yaml 复制代码
    startupProbe:
        httpGet:
          path: /actuator/health
          port: 88888
        initialDelaySeconds: 240
        periodSeconds: 30
        timeoutSeconds: 10
        failureThreshold: 20
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /actuator/health
        port: 88888
        scheme: HTTP
      initialDelaySeconds: 60
      periodSeconds: 30
      successThreshold: 1
      timeoutSeconds: 120          
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /actuator/health
        port: 88888
        scheme: HTTP
      initialDelaySeconds: 20
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 120

三、探针解释

在了解健康检查探针的作用之后,如果配置适合自己的探针才是关键,否则配置不合理的探针要么导致容器重启或者无法使用服务,又或者可能需要等待很久才能完成健康检查,造成不必要的时间浪费。

  • httpGet:探针健康检查机制,除了可以配置httpget之外,还有exec,tcpsocket,grpc来作为探测方式类型。

    • path: /actuator/health
    • port: 8011
    • scheme: HTTP
  • initialDelaySeconds:容器启动后要等待多少秒开始第一次执行探针。如果定义了启动探针,则存活探针和就绪探针的延迟将在启动探针已成功之后才开始计算。 如果periodSeconds的值大于initialDelaySeconds,则initialDelaySeconds将被忽略。

  • periodSeconds:执行探测的时间间隔。两次健康检查过程中等待的时间间隔。也就是第一次健康检查之后,等待periodSeconds在进行下一次时间检查。

  • timeoutSeconds: 探针单次执行的超时时间。单次健康检查如果超过timeout时间没有返回成功结果,那么本次健康检查会因为超时失败。

  • failureThreshold:探针最大执行失败次数。探针执行失败次数达到failureThreshold之后,k8s集群会认为容器是不健康或者未就绪状态。

  • successThreshold:探针失败之后,容器再次被当作成功的最少探测成功次数。

  • terminationGracePeriodSeconds:kubelet等待强制停止失败容器的缓解时间。在terminationGracePeriodSeconds之后,kubelet会强制停止失败的容器。

在了解这些参数的具体意思之后,我们在实际使用中配置参数要结合自己的服务特定来定义各个参数的时间,避免initialDelaySeconds参数过大导致不必要的等待,或者参数过小很快达到failureThreshold触发重启等操作。

总之,配置合理的健康检查可以利用集群的健康检查机制,达到一定程度的容器自我修复,但是如果配置不合理反而会引起不必要的重启和等待,影响服务运行效率。

对于不同协议的健康检查机制(exec,grpc,tcpsocket),可以参考文档来查看更多示例。

附录

参考文档

配置存活,就绪,启动探针

相关推荐
菜鸟4049 分钟前
Hermes实战案例_NAS 上跑了个 AI 管家:从信息孤岛到飞书一句话调度
云原生·eureka
小码哥_常8 小时前
告别MySQL!大厂集体转投PostgreSQL,到底藏着什么玄机?
后端
刀法如飞9 小时前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
swipe9 小时前
别再把 AI 聊天做成纯文本:从 agui 这个前后端项目,拆解“可感知工具调用”的流式 AI UI
后端·langchain·llm
GetcharZp9 小时前
GitHub 爆火!纯 Go 编写的文件同步神器 Syncthing,凭什么成为程序员的标配?
后端
hERS EOUS9 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
LucianaiB10 小时前
我用飞书多维表做了一个 AI 活动推荐智能体:每天自动催我别错过截止日期!
后端
铁皮饭盒11 小时前
第2课:5分钟!用 Trae AI 生成你的第一个后端服务(Bunjs + Elysia)
前端·后端·全栈
金銀銅鐵11 小时前
[git] 浅解 git reset 命令
git·后端