作者:Harry Martland

翻译:Bach(才云)

校对:星空下的文仔(才云)、bot(才云)

分布式系统会不可避免地产生些故障,咱们须要打算好如何解决,其中有种办法是运行多个服务实例,这样即使有一个故障了,其余的能够持续接管。在本文中,咱们将探讨一些在 Kubernetes 上实现此指标的不同办法。

K8sMeetup

None

冗余(Redundancy)是有代价的,咱们在思考弹性时就应想到这一点。当然,如果客户能够忍耐大量中断,并且对他们的体验没有太大影响,那么这点就无所谓了。

在探讨服务运行工夫(uptime)时,通常以几个 9 来评估,例如运行工夫为 99.9%,这意味着每 1000 个申请中,只有一个失败。依据以往教训,咱们每减少九个服务,须要破费约十倍的老本

只有应用程序不是常常解体,咱们就能够运行一个 Pod 并依附 K8s 从新运行,不过这须要一个 Pod 来解决服务接管的负载。

K8sMeetup

N

随着服务开始须要更多的 Pod 来解决负载,咱们能够对其进行扩大。如果流量是随工夫变动的(例如中午顶峰),那咱们要有足够的 Pod 在顶峰工夫解决负载。这种策略在 Pod 接管的流量会显著缩小时,能力提供较好的弹性。

如果某个 Pod 在顶峰时段产生故障,那么申请(request)将散布到其余 Pod 上,这样可能会超过它们的容量。不过在流量较小的话,其余 Pod 可能会有足够的容量来接受负载。

在探讨伸缩时,大家可能听过一些术语,例如 in、out、up 和 down。通常,up 和 down 意味着放弃雷同数量的实例,但减少或缩小 CPU 或 Server 的内存。In 和 out 是减少或删除服务实例,但放弃资源不变。明确这些后,咱们能够进一步实现伸缩,但要留神会受到可应用的最大 CPU 或内存限度。

K8sMeetup

N+1

N 一样,咱们要理解须要多少 Pod 来解决顶峰流量,这次增加了一个额定 Pod 来为咱们提供爱护,以避免顶峰期间呈现 Pod 故障的状况。这种策略的弹性老本就是一个 Pod,这是额定的老本,并只在故障状况下才须要。这就是为什么即使有一个 Pod 能够解决所有流量,但咱们仍要有一个额定 Pod。

K8sMeetup

伸缩

与其手动计算顶峰时段所需的 Pod 数量,不如让 K8s 代为实现。有了伸缩指标(scaling metric),K8s 能够依据以后需要伸缩服务,在需要较低时放大规模,在须要时扩充规模,这样就升高了老本。尽管伸缩自身并不能使 Pod 从故障中恢复过来,然而能够应答激增的需要。管制好 Pod 的内存和 CPU 能够使咱们更准确地扩大规模并降低成本。

扩大服务须要留出肯定的空间,最好不要将 Pod 用到极限。Pod 须要一些工夫能力启动,它会主动计算主动伸缩指标。应用程序须要可能解决申请扩大与理论扩大之间的申请。另外,如果有很多 Pod,那么总的闲暇空间会放大,因为它散布在所有 Pod 中。

K8sMeetup

75% 伸缩

晓得主动伸缩以及何时伸缩服务时,咱们就能够管制所需的弹性。将服务容量伸缩到 75% 时,咱们会损失 25% 的 Pod,领有的 Pod 越多,损失的也就越多,同时咱们还要为未利用的 Pod 领取大量费用。即使是这样,当咱们运行着大量的 Pod 时,仍旧要思考升高弹性百分比,因为可能会呈现大量 Pod 产生故障的状况。

如果服务的流量特地麻烦,这项策略就会特地有用。尖峰流量(spike)会对主动伸缩产生很大影响,因为它们呈现的工夫很短,以至于主动伸缩器没有工夫做出反馈。如果咱们大抵晓得峰值是多少,那么就能够将其布局到服务的伸缩中。

K8sMeetup

伸缩 + N

如果想准确地管制冗余而不是某个百分比,那么能够抉择扩大容量,再减少 N 中的额定 Pod。这样即使 N 的 Pod 故障,咱们依然有足够的容量,来准确管制冗余 Pod。

K8s Service 应用标签(labels)来决定路由哪些 Pod 的申请。这样咱们能够应用不同配置部署同一 Service 的两个正本集,一个正本集应用程度 Pod 主动伸缩器,而另一副本集配置为具备 N 的 Pod。两个正本集应用雷同的标签标记容器,并且 Service 将路由到该标签。该 Service 在所有 Pod 中平均分配流量,从而容许在扩大服务的同时保护 N 的冗余 Pod。

K8sMeetup

多集群

咱们还能够将应用程序部署到两个 K8s 集群中,这样即使整个集群呈现故障,都还能持续保护服务。负载均衡器在集群后面,并在集群之间路由流量。

运行多个集群时,主动伸缩也更具挑战性,因为伸缩指标通常不会在集群之间共享。如果集群产生了故障,仍在工作的集群将在简直没有告诉的状况下,接管来自故障集群的所有流量。有多种办法能够应答这种忽然减少的负载,主动伸缩性能能迅速地做出反馈并解决流量。

依据所需的冗余水平,集群能够以“被动-被动”模式(active-passive mode)运行,这意味着集群能够接管所有申请,但除非在集群之间共享伸缩指标,否则在此设置中,服务必须从零开始扩大。

K8sMeetup

数量与冗余

领有的 Pod 越多,单个 Pod 的故障对其余 Pod 的影响就越小。假如咱们有十个能够服务 100rps 的 Pod,如果以 90rps 的比例伸缩并且有一个 Pod 故障,那么其余 Pod 要接管 100rps,并达到容量极限;如果咱们有 20 个 Pod,其中有一个 Pod 故障,其余的 Pod 仅需解决 95rps。这两种状况都是假设服务能精确接管申请。实际上,服务通常会收到比这少的流量,如果扩充规模,收到的流量会稍多一些。

K8sMeetup

总结

主动伸缩是一个简单的问题,有很多抉择须要咱们思考。通过本文,心愿大家对此有更好的理解,并且能够应用它来缩小云账单老本,同时放弃服务的失常运行。

原文链接:https://medium.com/better-pro...