Kubernetes 存活、就绪探针

Kubernetes 存活、就绪探针

作者:闪念基因 2020-09-10 13:51:48

云计算 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中。为了确保Kubernetes托管的应用程序高可用,在设计集群时需要遵循一些特定的模式,其中有“健康探测模式”。应用 高可观察性原则 (HOP)可确保您的应用程序收到的每个请求都能及时找到响应。

在设计关键任务、高可用应用程序时,弹性是要考虑的最重要因素之一。

当应用程序可以快速从故障中恢复时,它便具有弹性。

云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中。为了确保Kubernetes托管的应用程序高可用,在设计集群时需要遵循一些特定的模式,其中有“健康探测模式”。应用 高可观察性原则 (HOP)可确保您的应用程序收到的每个请求都能及时找到响应。

The High Observability Principle (HOP)

高可观察性原则是基于容器的应用程序设计原则之一。微服务体系要求每个服务不关心(也不应该关心)被调用方如何处理请求。

HOP原则要求每个服务必须公开几个API端点,其意义在于揭示服务健康状态,Kubernetes调用这些端点,决定下一步的路由和负载平衡。

设计良好的云原生程序应将日志事件记录到STDERR和STDOUT,由logstash、Fluent等日志摄取服务将这些日志运送到集中式监控(例如Prometheus)和日志聚合系统(例如ELK)。下图说明了云原生应用程序如何遵守健康状况探测模式和高可观察性原则。

 

How to Apply Health Probe Pattern in Kubernetes?

我之前写过ASP.NetCore + Docker健康检查的原创:[web程序暴露http健康检查端点,平台轮询探测], Kubernetes针对不同场合细化了探针,更为强大的是给出对应决策。

Liveness Probes

使用[存活探针]判断什么时候重启容器。

使用存活探针检查容器本身是否无响应、死锁, 有时候重启容器常常能解决此类问题。

我们以kubernetes官方demo为例:

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4.   labels: 
  5.     test: liveness 
  6.   name: liveness-exec 
  7. spec: 
  8.   containers: 
  9.   - name: liveness 
  10.     image: busybox 
  11.     args: 
  12.     - /bin/sh    - -c    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 
  13.     livenessProbe: 
  14.       exec
  15.         command: 
  16.         - cat 
  17.         - /tmp/healthy 
  18.       initialDelaySeconds: 5   # 指示kubectl等待5s才执行首次探测 
  19.       periodSeconds: 5         # 间隔5秒轮询 
  • 在第5秒kubectl开始首次liveness探测
  • 在30秒进行的每次探测均成功
  • 30s之后容器内文件被删除,之后间隔5s的探测会失败,根据liveness默认配置连续3次失败就会放弃探测,放弃探测意味着重启容器,故容器会在第45s重启
  • 重启之后又开始以上流程, 故可以看到此探针以重启的决策尝试修复应用问题。

这个探针会体现到 kubectl get pod 的 RESTARTS 列

 

Readiness Probes

使用[就绪探针]判断容器是否就绪,是否可以接受流量。

Pod内所有容器ready,则该Pod被认为ready,当pod没有ready,将会从服务负载均衡中移除。

有些时候,应用程序临时不可用(加载大量数据或者依赖外部服务),这个时候,重启这个Pod无济于事,同时你也不希望请求被发送到该Pod

下面的应用强依赖mongodb,我们针对这些依赖项设置了readiness探针

  1. services.AddHealthChecks() 
  2.     .AddCheck<MongoHealthCheck>(nameof(MongoHealthCheck), tags: new[] { "readyz" }); 
  3. // ---------------------- 
  4. app.UseHealthChecks("/readyz", new HealthCheckOptions 
  5.         Predicate = (check) => check.Tags.Contains("readyz"
  6. }); 

以下是探测Mongodb的连通性

  1. sealed class MongoHealthCheck : IHealthCheck 
  2.     {        private readonly IMongoDatabase _defaultMongoDatabase; 
  3.         public MongoHealthCheck(IDefaultMongoDatabaseProvider defaultMongoDatabaseProvider) 
  4.         {            _defaultMongoDatabase = defaultMongoDatabaseProvider.GetDatabase();        }        public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default
  5.         {            var doc = await _defaultMongoDatabase.RunCommandAsync( 
  6.                 new BsonDocumentCommand<BsonDocument>( 
  7.                     new BsonDocument() { 
  8.                         { "ping""1" } 
  9.                     }),                 cancellationToken: cancellationToken);            var ok = doc["ok"].ToBoolean(); 
  10.             if (ok) 
  11.             {                return HealthCheckResult.Healthy("OK"); 
  12.             }            return HealthCheckResult.Unhealthy("NotOK"); 
  13.         }    } 

对于依赖项的探测,探测周期和超时时间可以设置的稍长一点

  1. readinessProbe: 
  2.   httpGet: 
  3.     path: /readyz 
  4.     port: 80 
  5.   initialDelaySeconds: 5 
  6.   periodSeconds: 60     # 60s探测一次 
  7.   timeoutSeconds: 30    # 每次探测30s超时,与应用建立与依赖项的连接超时时间一致 
  8.   failureThreshold: 3   # 连续3次探测失败,该Pod会被标记为`Unready` 

Startup Probes

使用[启动探针]判断容器应用是否已经启动。如果配置了这个探针,则该探针成功之前将会禁用存活和就绪探针。

配置探针

  • initialDelaySeconds:容器启动,探针延后工作,默认是0s
  • periodSeconds 探针探测周期,默认10s
  • timeoutSeconds: 探针工作的超时时间,默认1s
  • successThreshold: 连续几次探测成功,该探针被认为是成功的,默认1次
  • failureThreshold: 连续几次探测失败,该探针被认为最终失败,对于livenes探针最终失败意味着重启,对于readiness探针意味着该pod Unready, 默认3次。

强烈建议根据应用结构合理设置探针参数,避免不切实际的认定失败导致的频繁重启或 Unready。

结论:

  • Kubernetes生态这么庞大,为啥单独拎出k8s探针, 是因为k8s探针是与应用程序结构密切相关的机制。

就使用方式看:

  • 存活探针:用于快速判断应用进程是否无响应,尝试重启修复;
  • 就绪探针:判断应用及依赖项是否就绪,是否可以分配流量,如果不能就标记Unready,从负载均衡器中移除该Pod

Kubernetes存活、就绪探针可以极大地提高服务的健壮性和弹性,并提供出色的最终用户体验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/245308.html<

(0)
运维的头像运维
上一篇2025-04-26 03:17
下一篇 2025-04-26 03:19

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注