使用 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 命令手动缩放群集。 如果使用水平 Pod 自动缩放程序,则会在群集自动缩放程序禁用的情况下继续运行,但 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 节点利用率级别(定义为所请求资源的总和除以容量),其中可以考虑对节点进行纵向缩减。 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 中正式发布。 如果使用 CLI 更新这些标志,请确保使用的是版本 2.63 或更高版本。

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

  • 使用 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"
    

    只要有要检索的日志,就会看到与以下日志类似的日志:

    Log Analytics 日志的屏幕截图。

  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. 群集自动缩放程序还会将运行状况写出到名为 cluster-autoscaler-statusconfigmap。 可以使用以下 kubectl 命令检索这些日志:

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

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

后续步骤

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