在查找缩放解决方案之前,需要了解什么是可伸缩性以及如何将其应用于Kubernetes应用程序。
在本单元中,我们将回顾一些可伸缩性概念。
可伸缩性描述了应用程序或系统通过向其添加更多资源来处理不断增加的工作的能力。
在我们的示例方案中,增加的工作量是客户请求数。可以通过两种方式表示添加的资源量:垂直可伸缩性和水平可伸缩性。
垂直可伸缩性或纵向扩展是指通过添加更多的物理资源(例如内存或CPU能力)来缩放系统。例如,如果公司网站消耗了太多的内存,你可以更新VM实例来包含更多内存,同时保持基础应用程序不变。
简而言之,垂直缩放是在保持应用程序数量不变的情况下增加VM大小。如果拥有需要大量计算能力的单体应用程序,但成本过高,无法分解成较小的部件,则此方法会非常有用。这些应用程序大多托管在VM中,而不是分布式系统。
尽管成本更易于管理,但非常大的VM可能会变得非常昂贵。增加更多计算能力的成本高于复制小型VM的成本。可以添加到单台VM的资源数量存在上限,这意味着达到上限后,最终必须复制VM。
水平可伸缩性或横向扩展是指通过复制应用程序并在应用程序实例之间均衡负载来缩放系统。
水平缩放对于分布式应用程序(例如在AKS中部署的应用程序)和无状态系统非常有用,因为可以在单台VM中使用同一应用程序启动多个容器。通过横向扩展,可以提取最多的资源,而只需为单台VM付费。
在我们的示例方案中,你的公司站点是无状态的。这意味着横向扩展是最佳操作过程。Kubernetes提供了称为HorizontalPodAutoscaler(HPA)的现成资源,它可支持你横向扩展部署。
在介绍HPA之前,我们先回顾一下如何手动缩放Kubernetes应用程序。
也可以通过kubectlscaledeploy/contoso-website--replicas
HPA是本机Kubernetes1.8及更高版本资源,为群集中的Pod提供水平可伸缩性。它每30秒监视一次指标API,以确定所需副本计数是否有任何变化。如果所需副本计数与当前副本计数不同,则管理HPA对象的控制器管理器会横向扩展或缩减部署。
HPA与Kubernetes中的autoscalingAPI组配合运行。此API组包括两个版本:v1或v2。版本v1允许仅根据CPU指标缩放部署。版本v2则允许本机同时监视CPU和内存。在本模块中,我们使用v2版本。
每个HPA都附加到一个在HPA清单的spec.scaleTargetRef键中定义的缩放引用。此缩放引用必须有需要缩放的基础Pod,否则HPA无法正常工作,因为无法将缩放应用于无法缩放的对象(如DaemonSets)。
重要的是每个pod都在其规范中设置资源请求。如果没有此设置,HPA算法无法正确计算指标并确定资源利用率。可以通过部署清单中的spec.template.spec.containers[].resources密钥来设置此限制,如以下示例所示:
spec:template:spec:containers:-resources:requests:cpu:250mmemory:256Mlimits:cpu:500mmemory:512MHPA清单示例apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:php-apachespec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:php-apacheminReplicas:1maxReplicas:10metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:50知识检查1.什么是横向缩放?
当复制应用程序以维持更大负载时。
向VM添加更多RAM。
将应用程序呈现为无状态,这样就可以在没有永久性存储的情况下使用它。
为什么务必要在绑定到HPA的pod上设置资源请求?
因为这是计算资源利用率的唯一方法。
虽然并不务必要这样做,但建议这样做,以免应用程序缺乏资源。
因此,HPA知道何时根据群集中的可用资源停止对资源进行缩放。