停当探针(Readiness Probe): 在将流量路由到 Pod 之前举行检查。假如停当探针检测失败,Pod 将不再接收流量。
存活探针(Liveness Probe): 用于判断 Pod 内的容器是否正常运行。假如存活探针检测失败,容器将被重新启动。
停当探针
当 Pod 完全启动并准备好接收流量时,停当探针才会通过检测。假如需要通过启动缓存或初始化数据库连接池来预热应用程序,请在停当探针检测之前完成这些操作。
只有当您的 Pod 通过 Kubernetes 服务对外提供流量时,才需要设置停当探针。假如您的 Pod 只是执行任务,例如运行批处置惩罚作业或从队列中消耗数据,则不需要设置停当探针。
Pod 终止时是请求失败的另一个常见缘故原由。除非能优雅地处置惩罚 Pod 的终止,否则发送到终止 Pod 的请求大概会失败。
当 Pod 内的容器没有优雅地关闭(即突然制止或瓦解)时,正在处置惩罚中的请求会受到影响。别的,与 pod 关联的 Kubernetes 服务对象会一直发送流量,直到应用程序退出,从而导致某些请求收到“连接拒绝”的报错。
防止出现此类突发故障的方式是精确处置惩罚 SIGTERM 信号。为了理解其工作原理,让我们详细看看 Pod 的终止生命周期。
当 Pod 被标记为删除时,kubelet 会调用 Pod 中界说的全部容器的 preStop 处置惩罚程序。同时,优雅终止周期(由 terminationGracePeriodSeconds 界说)的倒计时也开始了。
当停当探针失败时,连接到 Pod 的服务对象将不再将请求发送到该 Pod 的 IP,如许可以立即减少流量。
要接收 SIGTERM 信号,容器内的应用程序应该以进程 ID 1 运行。假如您使用脚原来启动应用程序,那么该脚本将是 PID 为 1 的进程。在这种情况下,您需要保存应用程序的 PID,并使用该 PID 将 SIGTERM 信号转发回应用程序。
调整滚动更新
在推出新版本应用程序时,也大概会出现宕机。当摆设被扩展到最大副本数并举行滚动更新时,有资格处置惩罚流量的 Pod 大概会出现故障,导致某些请求失败。
通过将 maxUnavailable 设置为 0,您可以确保在关闭任何现有 Pod 之前,先调治新 Pod。
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
复制代码
请注意,一旦新 Pod 开始运行,旧 Pod 就会被关闭。控制平面并不会检查新 Pod 是否已准备好接收流量。假如您需要在新 Pod 准备好接收流量之前延迟终止旧 Pod,可以使用停当门(readiness gates)。
现在,这一功能仅由 AWS 负载平衡器原生支持。有关如何在 AWS 负载平衡器中使用停当门的更多信息,请查看AWS官方文档[1]
界说 Pod 停止预算
假设您在一个托管的 Kubernetes 集群上运行,例如 EKS 或 AKS,并且需要将 Pod 均匀分布在差别的可用区(Availability Zones)中。您可以使用 topologySpreadConstraints 来实现这一点。
可用区是云基础设施提供商用来隔离故障的一种方法。通过在可用区之间分散 Pod,可以使应用程序具有更高的可用性。
即使有适当的反亲和性规则将 Pod 放置在差别的节点上,您的应用程序也大概会被调治成如下情况:
通过界说如下的 topologySpreadConstraint,您可以实现均匀分布:
topologySpreadConstraints:
- labelSelector:
matchLabels:
app: transaction-service
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
matchLabelKeys:
- pod-template-hash
whenUnsatisfiable: DoNotSchedule
复制代码
您大概会想知道,为什么在这种情况下不能使用反亲和性,只需将 Topology key 更改为 topology.kubernetes.io/zone。假如不仔细设置策略和参数,则会限定应用程序的扩展性。例如,假如您只是简单地通过更改 Topology key 来更改我们看到的反亲和性策略,那么您的应用程序将无法扩展到凌驾三个副本。
因此,当您的目标是将一个 Pod 与另一个 Pod 放在一起,或避免将 Pod 放在一起时,最好使用亲和;而使用拓扑分布约束则可以在节点、可用区和地区之间分配 Pod。
借助 Karpenter 提拔应用弹性
Karpenter是一款开源的 Kubernetes 集群自动扩缩容工具。它可以通过观察不可调治的 Pod 的聚合资源请求并做出启动和终止节点的决策,以最大限度地减少调治延迟,从而在几秒钟内(而不是几分钟)提供合适的盘算资源来满足您的应用程序的需求。
它根据 pod 的调治需求自动设置和取消设置节点,从而实现高效扩展和成本优化。它的主要功能包括:
只管实现 Kubernetes 的弹性和零宕机摆设好像是不大概的,但通过经心规划和适当设置,您可以利用该平台的动态特性来运行关键任务应用程序。
通过采用本文介绍的策略——例如设置适当的健康探针、优雅地处置惩罚 Pod 终止和界说 Pod 停止预算——您可以显著减少宕机时间并进步应用程序的整体稳定性。别的,设置集群自动扩展工具 Karpenter 和 Pod 自动扩展可以更有效地应对流量激增。
随着 Kubernetes 的不断发展,了解最新的功能和最佳实践将进一步加强您构建和维护弹性应用程序的能力。