在 Azure Kubernetes 服务 (AKS) 中使用群集自动缩放器

若要跟上 AKS 中的应用程序需求,可能需要调整运行工作负荷的节点数。 集群自动扩缩容组件会监视你的集群中因资源限制而无法调度的 Pod。 当群集自动缩放程序检测到问题时,它会纵向扩展节点池中的节点数来满足应用程序需求。 它还会定期检查节点上是否没有正在运行的 Pod,并根据需要缩减节点数量。

本文介绍如何在 AKS 中启用和管理群集自动缩放程序,该缩放程序是基于开源 Kubernetes 版本的。

开始之前

本文需要 Azure CLI 2.0.76 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

在 AKS 群集上使用群集自动缩放程序

重要

群集自动缩放程序是 Kubernetes 组件。 虽然 AKS 群集对节点使用虚拟机规模集,但请勿手动启用或编辑规模集自动缩放的设置。 让 Kubernetes 群集自动缩放程序管理所需的规模设置。 有关详细信息,请参阅我可以修改节点资源组中的 AKS 资源吗?

在新群集上启用群集自动缩放程序

  1. 使用 az group create 命令创建资源组。

    az group create --name myResourceGroup --location eastus
    
  2. 使用 az aks create 命令创建 AKS 群集,使用 --enable-cluster-autoscaler 参数并指定节点 --min-count--max-count,在该群集的节点池中启用和配置群集自动缩放程序。 以下示例命令使用虚拟机规模集支持的单个节点创建群集、启用群集自动缩放程序,并将节点的最小数目设置为 1,最大数目设置为 3:

    az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --generate-ssh-keys
    

    创建群集并配置群集自动缩放程序设置需要几分钟时间。

在现有群集上启用群集自动缩放程序

使用 az aks update 命令更新现有群集,使用 --enable-cluster-autoscaler 参数并指定节点 --min-count--max-count,在节点池中启用和配置群集自动缩放程序。 以下示例命令更新现有 AKS 群集以在群集的节点池中启用群集自动缩放程序,并将节点的最小数目设置为 1,最大数目设置为 3:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

更新群集并配置群集自动缩放程序设置需要几分钟时间。

在群集上禁用群集自动缩放程序

使用 az aks update 命令和 --disable-cluster-autoscaler 参数禁用群集自动缩放程序。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --disable-cluster-autoscaler

群集自动缩放程序处于禁用状态时,不会删除节点。

注意

禁用群集自动缩放程序后,可以使用 az aks scale 命令手动缩放群集。 如果使用 Horizontal Pod Autoscaler,即使禁用了集群自动扩缩器,它也会继续运行;但如果所有节点资源都已被占用,Pod 可能最终无法被调度。

在群集上重新启用群集自动缩放程序

可以使用 az aks update 命令并指定 --enable-cluster-autoscaler--min-count--max-count 参数,在现有群集上重新启用群集自动缩放程序。

在节点池上使用群集自动缩放程序

在多个节点池上使用群集自动缩放程序

可以将群集自动缩放程序用于多个节点池,并且可以在每个单独的节点池上启用群集自动缩放程序,并将唯一的自动缩放规则传递给它们。

使用 az aks nodepool update 命令更新现有节点池上的设置。

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

在节点池上禁用群集自动缩放程序

使用 az aks nodepool update 命令和 --disable-cluster-autoscaler 参数在节点池上禁用群集自动缩放程序。

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --disable-cluster-autoscaler

在节点池上重新启用群集自动缩放程序

可以使用 az aks nodepool update 命令在节点池上重新启用群集自动缩放程序,并指定 --enable-cluster-autoscaler--min-count--max-count 参数。

注意

如果你计划将群集自动缩放器用于跨多个可用区的节点池,并利用与可用区相关的调度功能(例如卷拓扑调度),我们建议每个可用区设置一个节点池,并通过自动缩放器配置文件启用 --balance-similar-node-groups。 这可确保自动缩放程序能够成功地纵向扩展并保持节点池大小均衡。

更新群集自动缩放程序设置

随着应用程序需求发生变化,可能需要调整群集自动缩放程序节点计数以实现高效缩放。

使用 az aks update 命令更改节点数量,并使用 --update-cluster-autoscaler 参数指定更新后的节点 --min-count--max-count,以更新集群自动扩缩器。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

注意

如果由于外部因素(例如在抢占式实例被驱逐期间,或通过 AKS API 更改最小计数值时)导致实际计数低于最小值,群集自动缩放器会强制维持最小计数。

使用群集自动缩放程序配置文件

可以通过更改群集范围的自动缩放程序配置文件中的默认值,来配置群集自动缩放程序的更高粒度详细信息。 例如,当节点处于低利用率状态达到 10 分钟后,就会发生缩容事件。 如果你的工作负载每 15 分钟运行一次,则可能需要更改自动缩放程序配置文件,以便在 15 到 20 分钟后纵向缩减未充分利用的节点。 启用集群自动缩放器时,除非指定其他设置,否则将使用默认配置文件。

重要

群集自动缩放配置会影响使用群集自动缩放的所有节点池。 无法针对每个节点池单独设置自动缩放器配置。 设置配置文件后,启用了群集自动缩放程序的任何现有节点池都将立即开始使用该配置文件。

群集自动缩放程序配置文件设置

下表列出了群集自动缩放程序配置文件的可用设置:

设置 说明 默认值
scan-interval 重新评估群集纵向扩展或缩减的频率。 10 秒
scale-down-delay-after-add 扩容后多久恢复缩容评估。 10 分钟
scale-down-delay-after-delete 删除节点后,经过多长时间会恢复缩容评估。 scan-interval
scale-down-delay-after-failure 缩容失败后,经过多长时间会恢复缩容评估。 3 分钟
scale-down-unneeded-time 节点闲置多长时间之后才有资格进行纵向缩减。 10 分钟
scale-down-unready-time 未就绪的节点在不再被需要后,经过多长时间才符合缩容条件。 20 分钟
ignore-daemonsets-utilization 计算缩容时的资源利用率时,是否会忽略 DaemonSet Pod。 false
daemonset-eviction-for-empty-nodes DaemonSet Pod 是否会从空节点正常终止。 false
daemonset-eviction-for-occupied-nodes DaemonSet Pod 是否会从非空节点正常终止。 true
scale-down-utilization-threshold CPU 请求和节点上运行的所有 Pod 的内存请求之和之间的最大值除以节点的相应可分配资源,下面可以考虑节点进行缩减。 0.5
max-graceful-termination-sec 集群自动扩缩容器在尝试缩减节点规模时等待 Pod 终止的最长秒数。 600 秒
balance-similar-node-groups 检测类似节点池并在各池之间均衡节点数。 false
expander 扩展器纵向扩展中使用的节点池类型。 可能的值包括 most-podsrandomleast-wastepriority random
skip-nodes-with-local-storage 如果为 true,则群集自动缩放程序不会删除其 Pod 具有本地存储的节点,例如 EmptyDir 或 HostPath。 false
skip-nodes-with-system-pods 如果为 true,则群集自动缩放程序不会从 kube-system 中删除具有 Pod 的节点(DaemonSet 或 mirror Pod 除外)。 true
max-empty-bulk-delete 可同时删除的空节点的最大数目。 10 个节点
new-pod-scale-up-delay 对于突发/批量扩缩容等场景,如果你不希望 CA 在 Kubernetes 调度器将所有 Pod 都调度出去之前就采取操作,你可以让 CA 在未调度的 Pod 达到某个存在时长之前忽略它们。 0 秒
max-total-unready-percentage 群集中未就绪节点的最大百分比。 超过此百分比后,CA 将暂停操作。 45%
max-node-provision-time 自动缩放程序等待节点预配的最长时间。 15 分钟
ok-total-unready-count 允许的未就绪节点数,与 max-total-unready-percentage 无关。 三个节点

注意

ignore-daemonsets-utilization、daemonset-eviction-for-empty-nodes 以及 daemonset-eviction-for-occupied-nodes 参数从 API 版本 2024-05-01 开始正式发布。

为新集群设置集群自动缩放器配置文件

使用 az aks create 命令创建 AKS 群集,并使用 cluster-autoscaler-profile 参数设置群集自动缩放程序配置文件。

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --cluster-autoscaler-profile scan-interval=30s \
    --generate-ssh-keys

在现有集群上设置集群自动扩缩容配置

使用 az aks update 命令和 cluster-autoscaler-profile 参数在现有群集上设置群集自动缩放程序。 以下示例将扫描间隔设置配置为“30 秒”:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s

为主动纵向缩减配置群集自动缩放程序配置文件

注意

不建议对短间隔内频繁横向扩展和横向缩减的群集进行主动纵向缩减,因为这可能会导致这些情况下的节点预配时间延长。 在这些情况下,增加scale-down-delay-after-add有助于让节点保留更长时间,以处理传入的工作负载。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

为突发工作负载配置群集自动缩放程序配置文件

az aks update \   
    --resource-group "myResourceGroup" \
    --name myAKSCluster \ 
    --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

将集群自动缩放器配置重置为默认值

使用 az aks update 命令重置群集自动缩放器配置文件。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile ""

检索群集自动缩放程序日志和状态

可以从群集自动缩放程序检索日志和状态更新,以帮助诊断和调试自动缩放程序事件。 AKS 将代你管理群集自动缩放程序,并在托管控制平面中运行它。 可以启用控制平面日志记录,以查看集群自动扩缩器的日志和操作信息。

  1. 设置一个资源日志规则,按照此处的说明将群集自动缩放程序日志推送到 Log Analytics。 在为日志选择选项时,请确保勾选cluster-autoscaler的复选框。

  2. 选择群集上的“日志”部分。

  3. 在 Log Analytics 中输入以下示例查询:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    
  4. 通过 CLI 查看集群自动扩缩器未触发扩容的事件。

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. 在 CLI 上查看群集自动缩放程序警告事件。

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. 群集自动缩放程序还会将健康状态写入名为 configmapcluster-autoscaler-status 中。 可以使用以下 kubectl 命令检索这些日志:

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

有关详细信息,请参阅 Kubernetes/autoscaler GitHub 项目常见问题解答

本文演示了如何自动缩放 AKS 节点数。 还可以使用水平 Pod 自动扩缩器来自动调整运行应用程序的 Pod 数量。 有关如何使用水平 Pod 自动缩放器的步骤,请参阅在 AKS 中缩放应用程序