使用 AKS 配置多个节点并使缩放为零

已完成

借助 Azure Kubernetes 服务,你可创建不同的节点池,从而将特定工作负载与每个节点池中运行的节点进行匹配。 通过将工作负载与节点进行匹配的过程,可规划计算消耗量并优化成本。

与许多容器化应用程序和服务一样,你公司的无人机跟踪解决方案也部署在 Azure Kubernetes 服务 (AKS) 上。 你的团队开发了一项新的预测建模服务,它可在极端天气条件下处理飞行路线信息并创建最佳飞行路线。 此服务需要基于 GPU 的虚拟机 (VM) 支持,并且仅在一周中的特定日期运行。

你希望配置一个群集节点池用于专门处理飞行路线信息。 此进程每天只运行几小时,而你想要使用基于 GPU 的节点池。 但是,你只想在使用节点时为其付费。

让我们看看节点池和 AKS 如何使用节点,以及如何缩放节点池中的节点计数。

什么是节点池?

节点池描述 AKS 群集中具有相同配置的一组节点。 这些节点包含运行应用程序的基础 VM。 可以在 AKS 托管 Kubernetes 群集上创建两种类型的节点池:

  • 系统节点池

  • 用户节点池

系统节点池

系统节点池承载构成群集控制平面的关键系统 Pod。 系统节点池只允许将 Linux 用作节点 OS,并且只运行基于 Linux 的工作负载。 系统节点池中的节点保留用于系统工作负载,通常不用于运行自定义工作负载。 每个 AKS 群集都必须至少包含一个具有至少一个节点的系统节点池,并且必须为节点定义基础 VM 大小。

用户节点池

用户节点池支持你的工作负载,你可将 Windows 或 Linux 指定为节点操作系统。 你还可以定义节点的基础 VM 大小并运行特定的工作负载。 例如,你的无人机跟踪解决方案有一个批处理服务,你要将该服务部署到采用通用 VM 配置的节点池。 新的预测建模服务需要更高容量的基于 GPU 的 VM。 你决定配置单独的节点池,并将其配置为使用启用了 GPU 的节点。

节点池中的节点数

最多可在节点池中配置 100 个节点。 但是,你选择配置的节点数取决于每个节点运行的 Pod 数。

例如在系统节点池中,必须将单个节点上运行的最大 Pod 数设置为 30。 此值可保证有足够的空间运行对群集运行状况至关重要的系统 Pod。 当 Pod 数超过此最小值时,池中需要新节点来调度其他工作负载。 因此,系统节点池中需要至少一个节点。 对于生产环境,系统节点池的建议节点计数至少为 3。

用户节点池设计用于运行自定义工作负载,不需要 30 个 Pod。 用户节点池允许你将池的节点数设置为零。

在 AKS 群集中管理应用程序需求

在 AKS 中,增加或减少 Kubernetes 群集中的计算资源数量就是缩放。 可以缩放需要运行的工作负载实例数,也可以缩放运行这些工作负载的节点数。 通过以下两种方式之一,可以缩放 AKS 托管群集上的工作负载。 第一种方法是按需手动缩放 Pod 数或节点数。 第二个选项是通过自动化:使用水平 Pod 自动缩放程序来缩放 Pod,使用群集自动缩放程序来缩放节点。

如何手动缩放节点池

如果运行的工作负载以特定已知间隔在特定时间段内执行,则要控制节点成本,一种合理方法是手动缩放节点池大小。

假设预测建模服务需要一个基于 GPU 的节点池,并在每天中午运行一个小时。 你可以使用特定的基于 GPU 的节点配置节点池,并在不使用群集时将节点池缩放为零节点。

下面是可用于创建节点池的 az aks node pool add 命令的示例。 请注意 --node-vm-size 参数,它为池中的节点指定基于 GPU 的 VM 大小 Standard_NC6

az aks nodepool add \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name gpunodepool \
    --node-count 1 \
    --node-vm-size Standard_NC6 \
    --no-wait

池准备就绪后,可使用 az aks nodepool scale 命令将节点池缩放为零节点。 请注意,--node-count 参数设置为零。 下面是该命令的示例:

az aks nodepool scale \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name gpunodepool \
    --node-count 0

如何自动缩放群集

Diagram that shows how the cluster autoscaler adds nodes and how the horizontal pod autoscaler adds pods.

AKS 使用 Kubernetes 群集自动缩放程序自动缩放工作负载。 可使用两个选项来缩放群集:

  • 水平 Pod 自动缩放程序

  • 群集自动缩放程序

接下来,让我们看一下每个选项,从水平 Pod 自动缩放程序开始。

水平 Pod 自动缩放程序

可使用 Kubernetes 水平 Pod 自动缩放程序监视群集上的资源需求并自动缩放工作负载副本数。

Kubernetes 指标服务器会从 AKS 群集上运行的控制器、节点和容器中收集内存和处理器指标。 要访问此信息,一种方法是使用指标 API。 水平 Pod 自动缩放程序每 30 秒检查一次指标 API,以确定应用程序是否需要其他实例来满足需求。

假设你的公司还有一项批处理服务用于计划无人机飞行路线。 你会注意到该服务会收到海量请求,并开始积压大量交付,从而导致延迟,令客户感到失望。 增加批处理服务的副本数可及时处理订单。

若要解决此问题,请配置水平 Pod 自动缩放程序,按需增加服务副本的数量。 当批处理请求数减少时,它会减少服务副本的数量。

但是,水平 Pod 自动缩放程序只在群集已配置的节点池中的可用节点上缩放 Pod。

群集自动缩放程序

当水平 Pod 自动缩放程序无法在节点池中现有节点上调度另一个 Pod 时,将触发资源约束。 受到约束时,需要使用群集自动缩放程序缩放群集节点池中的节点数量。 群集自动缩放程序会检查定义的指标,并根据所需的计算资源来增加或缩减节点数。

群集自动缩放程序与水平 Pod 自动缩放程序一起使用。

群集自动缩放程序会监视纵向扩展和纵向缩减事件,并允许 Kubernetes 群集在资源需求变化时更改节点池中的节点计数。

可以用不同的缩放规则配置每个节点池。 例如,你可能希望仅配置一个节点池以允许自动缩放,或者可以将节点池配置为仅缩放到特定数量的节点。

重要

在节点池中启用群集自动缩放程序后,无法将节点计数缩放为零。 相反,可以将最小计数设置为零以节省群集资源。

知识检查

1.

假设你的软件解决方案中有 3 个关键组件。 第一个组件是 Web 应用程序。 第二个组件是一个服务,用于处理在线订单。 第三个组件是视频渲染和分析服务,它仅根据需要运行,且需要基于 GPU 的 VM。 为了优化成本,你将在 Azure Kubernetes 服务 (AKS) 群集中部署多少个节点池来管理解决方案?

2.

请将以下表述补充完整。 Kubernetes 群集自动缩放程序可缩放…