可伸缩性概念

已完成

在查找缩放解决方案之前,需要了解什么是可伸缩性以及如何将其应用于 Kubernetes 应用程序。

在本单元中,我们将回顾一些可伸缩性概念。

伸缩性

可伸缩性描述了应用程序或系统通过向其添加更多资源来处理不断增加的工作的能力

在我们的示例方案中,增加的工作量是客户请求数。 可以通过两种方式表示添加的资源量:垂直可伸缩性和水平可伸缩性

垂直可伸缩性

垂直可伸缩性或纵向扩展是指通过添加更多的物理资源(例如内存或 CPU 能力)来缩放系统。 例如,如果公司网站消耗了太多的内存,你可以更新 VM 实例来包含更多内存,同时保持基础应用程序不变。

Vertical scaling diagram.

简而言之,垂直缩放是在保持应用程序数量不变的情况下增加 VM 大小。 如果拥有需要大量计算能力的单体应用程序,但成本过高,无法分解成较小的部件,则此方法会非常有用。 这些应用程序大多托管在 VM 中,而不是分布式系统。

尽管成本更易于管理,但非常大的 VM 可能会变得非常昂贵。 增加更多计算能力的成本高于复制小型 VM 的成本。 可以添加到单台 VM 的资源数量存在上限,这意味着达到上限后,最终必须复制 VM。

横向可缩放性

水平可伸缩性或横向扩展是指通过复制应用程序并在应用程序实例之间均衡负载来缩放系统

Horizontal scaling diagram.

水平缩放对于分布式应用程序(例如在 AKS 中部署的应用程序)和无状态系统非常有用,因为可以在单台 VM 中使用同一应用程序启动多个容器。 通过横向扩展,可以提取最多的资源,而只需为单台 VM 付费。

在我们的示例方案中,你的公司站点是无状态的。 这意味着横向扩展是最佳操作过程。 Kubernetes 提供了称为 HorizontalPodAutoscaler (HPA) 的现成资源,它可支持你横向扩展部署

Kubernetes 上的手动可伸缩性

在介绍 HPA 之前,我们先回顾一下如何手动缩放 Kubernetes 应用程序。

每个部署都会绑定到另一个名为 ReplicaSet 的资源。 ReplicaSet 负责维护“所需的副本状态”,并横向扩展或缩减实际应用程序,以保持所需的状态与实际状态相同。 可以通过部署规范中的 spec.replicas 密钥来控制部署中的副本数。 此密钥会设置基础 ReplicaSet 中所需副本的数量,并强制复制控制器在任何给定时间保留此数目的副本。

也可以通过 kubectl scale deploy/contoso-website --replicas <number> 命令来控制部署中的副本数。 此命令动态更改部署中所需的副本数,并横向扩展或缩减应用程序。

HorizontalPodAutoscaler (HPA)

HPA 是本机 Kubernetes 1.8 及更高版本资源,为群集中的 Pod 提供水平可伸缩性。 它每 30 秒监视一次指标 API,以确定所需副本计数是否有任何变化。 如果所需副本计数与当前副本计数不同,则管理 HPA 对象的控制器管理器会横向扩展或缩减部署。

HorizontalPodAutoscaling design diagram.

HPA 与 Kubernetes 中的 autoscaling API 组配合运行。 此 API 组包括两个版本:v1v2。 版本 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: 250m
              memory: 256M
            limits:
              cpu: 500m
              memory: 512M

HPA 清单示例

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

知识检查

1.

什么是横向缩放?

2.

为什么务必要在绑定到 HPA 的 pod 上设置资源请求?

3.

为什么不太建议对无状态应用程序进行垂直缩放?