:你填了吗?10人将获赠CNCF商店$100美元礼券!
来参与2020年CNCF中国云原生调查

问卷链接(https://www.wjx.cn/jq/97146486.aspx)

配置 readiness、liveness 和 startup 探针可以处理不健康的 Pod,本文介绍了三种类型的探针、最佳实践和有关工具,以检测可能存在的配置问题。
翻译:Bach(才云)
校对:木子(才云)
分布式系统和微服务架构面临着诸多挑战,其中之一便是如何自动检测出异常的应用程序,然后将请求重新路由到其他可用系统,并恢复损坏的组件。健康检查,便是应对这一挑战的得力方法。在Kubernetes中,通过探针配置运行状况检查,能明确每个Pod的状态。
默认情况下,Kubernetes 会观察 Pod 生命周期,并在容器从挂起(pending)状态转移到成功(succeeded)状态时,将流量路由到 Pod。Kubelet 会监控崩溃的应用程序,并重新启动 Pod 进行恢复。许多开发人员认为这样的基本设置就足够了,尤其是当 Pod 内的应用程序还配置了守护进程管理器(例如 Node.js 的 PM2)时。但有一种意外情况,当 Kubernetes 在所有容器启动后,认为 Pod 是健康且可以接受请求时,但应用程序在实际准备就绪之前就已收到流量,比如应用程序在处理应用程序逻辑之前,初始化了一些状态,建立了数据库连接或加载了数据。当 Deployment 开始扩展时,未就绪的应用程序会接收流量并返回 500 错误,这造成了应用程序实际的准备就绪与 Kubernetes 认为的准备就绪之间的时间间隔问题。同样的,这也是 Kubernetes 探针用来定义容器何时准备接受流量,以及何时重新启动容器的方式。从 Kubernetes v1.16 开始,已经支持三种类型的探针。在本文中将介绍这三种类型的探针、最佳实践和有关工具,以检测可能存在的配置问题。
K8sMeetupKubernetes 探针
Kubernetes 版本小于 v1.15 时支持 readiness 和 liveness 探针,在 v1.16 中添加了 startup 探针作为 Alpha 功能,并在 v1.18 中升级为 Beta。
这三种探针均具有以下参数:initialDelaySeconds:启动 liveness、readiness 探针前要等待的秒数。periodSeconds:检查探针的频率。timeoutSeconds:将探针标记为超时(未通过运行状况检查)之前的秒数。successThreshold:探针需要通过的最小连续成功检查数量。failureThreshold:将探针标记为失败之前的重试次数。对于 liveness 探针,这将导致 Pod 重新启动。对于 readiness 探针,将标记 Pod 为未就绪(unready)。
initialDelaySeconds来确定 readiness 探测在准备就绪前要等待多长时间。设想有个应用程序,偶尔会有大量数据下载需求。由于initialDelaySeconds是个静态数字,所以即便该应用程序无需那么久的初始化等待时间,我们也只能设置最保守的等待时长。不过,借助startup探针,我们能够配置failureThreshold和periodSeconds来解决此问题。比如说,将failureThreshold设为15,periodSeconds设为5,这就意味着应用程序在失败前会有10×5 = 75秒的启动时间。
配置探针
现在我们了解了不同类型的探针,下面是配置每种探针的三种不同方式。
HTTPkubelet 将 HTTP GET 请求发送到 endpoint,并检查 2xx 或 3xx 响应。我们可以重复使用现有的 HTTP endpoint 或设置轻量级 HTTP 服务器以进行探测(例如,具有/healthzendpoint 的 Express server)。HTTP 探针包含其他额外参数:host:要连接的主机名(默认值:pod 的 IP)。scheme:HTTP(默认)或 HTTPS。path:HTTP/S 服务器上的路径 。httpHeaders:自定义标头(如果需要标头用于身份验证、CORS 设置等) 。port:访问服务器的端口名称或端口号。


K8sMeetup最佳实践
虽然说探针的确切参数和使用方法取决于应用程序,但也有一些常用的最佳实践:
- 对于较旧的(≤v1.15)Kubernetes 集群,使用具有初始延迟的 readiness 探针来处理容器启动阶段。
- 对于较新的(≥v1.16)Kubernetes 集群,如果是具有不可预测或可变启动时间的应用程序应使用 startup 探针。startup 探针与 readiness 和 liveness 探针共享相同的 endpoint(例如
/healthz),但能将failureThreshold设置得比其他探针更高,以拥有更长的启动时间,相对于 liveness 和 readiness 而言,设置的失败时间会更合理。 - 如果 readiness 探针不用于其他信号目的,readiness 和 liveness 探针可以共享相同的 endpoint,但如果只有一个 Pod(也就是使用 VPA)时,设置 readiness 探针来解决启动行为,使用 liveness 探针来确定运行状况。这种情况下,标记 Pod 不健康意味着停机时间。
- readiness 检查可以用各种方式来发出系统故障的信号。例如,当应用程序失去与数据库的连接时,可以使用 readiness 探针暂时阻止新请求并允许系统重新连接。它还可以将繁忙的 Pod 标记为未准备,将工作负载平衡到其他 Pod。
简而言之,定义明确的探针通常会带来更好的弹性和可用性。确保观察启动时间和系统行为,在应用程序更改时调整探针设置。
K8sMeetup工具
最后,鉴于 Kubernetes 探针的重要性,我们可以使用 Kubernetes 资源分析工具来检测缺失的探针。这些工具可以在现有集群上运行,也可以置入 CI/CD 流程中,可以在没有正确配置资源的情况下自动拒绝工作负载。
- polaris:一个具有仪表板的资源分析工具,也可以用作验证 webhook 或 CLI 工具。
- kube-score:一个静态代码分析工具,可用于 Helm、Kustomize 和标准 YAML 文件。
- popeye:只读的实用工具,用于扫描 Kubernetes 集群并报告配置中的潜在问题。

推荐阅读:





扫描二维码联系我们!
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请长按以下二维码进行关注。

本文分享自微信公众号 - CNCF(lf_cncf)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。