Compartir a través de

重设 Azure Kubernetes 服务 (AKS) 中的节点池大小

可能需要更改虚拟机(VM)的大小,以适应越来越多的部署或运行更大的工作负荷。 在 AKS 中使用 虚拟机规模集 时,不支持直接调整 AKS 实例的大小,如 AKS 的支持策略中所述:

AKS 代理节点在 Azure 门户中显示为常规 Azure IaaS 资源。 但是这些虚拟机被部署到自定义的 Azure 资源组(通常前缀为 MC_*)中。 不能使用 IaaS API 或资源对这些节点进行直接自定义。 通过 AKS API 未完成的任何自定义更改都不会通过升级、缩放、更新或重新启动来持久保存。

在本文中,你将了解如何通过创建具有所需 SKU 大小、封锁和清空现有节点的新节点池,然后删除现有节点池来调整节点池大小的建议方法。

重要

此方法特定于基于 虚拟机规模集的 AKS 群集。 使用基于虚拟机的节点池时,可以使用单个 Azure CLI 命令轻松更新现有节点池中的 VM 大小,并在同一节点池中具有多个 VM 大小。 有关详细信息,请参阅 虚拟机节点池文档

使用所需的 SKU 创建新的节点池

注意

每个 AKS 群集必须至少包含一个系统节点池,该池至少包含一个节点。 在此示例中,我们使用--modeSystem添加一个系统节点池,以替换我们希望调整大小的系统节点池。 可以随时 更新节点池的模式 。 还可以通过设置 --modeUser 来添加用户节点池。

调整大小时,请确保考虑所有工作负荷要求,例如可用性区域,并相应地配置 VMSS 节点池。 可能需要修改以下命令才能最好地满足你的需求。 有关配置选项的完整列表,请参阅 az aks nodepool add 参考页。

  1. 使用 az aks nodepool add 命令创建新的节点池。 在此示例中,我们将创建一个新的节点池,mynodepool其中包含三个节点和 Standard_DS3_v2 VM SKU 来替换具有 nodepool1 VM SKU 的现有节点池Standard_DS2_v2

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    创建新节点池需要几分钟时间。

  2. 使用 kubectl get nodes 命令获取新节点池的状态。

    kubectl get nodes
    

    输出应类似于以下示例输出,其中显示了新的节点池 mynodepool 和现有节点池 nodepool1

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

封锁现有节点

封锁将指定的节点标记为不可调度,并阻止将任何其他 Pod 添加到节点。

  1. 使用 kubectl get nodes 命令获取要封锁的节点的名称。

    kubectl get nodes
    

    输出应类似于以下示例输出,其中显示了要封锁的现有节点池 nodepool1 中的节点:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. 使用 kubectl cordon 命令连接现有节点,并在空格分隔列表中指定所需的节点。 例如:

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    输出应类似于以下示例输出,其中显示了节点被封锁:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

排出现有节点

重要

为了成功排出节点并收回正在运行的 Pod,请确保任何 PodDisruptionBudgets (PDB) 都允许一次至少移动一个 Pod 副本。 否则,清空/逐出作将失败。 若要检查这一点,可以运行 kubectl get pdb -A 并验证 ALLOWED DISRUPTIONS 是否至少 1 更高。

排空节点时,在其上运行的 Pod 将被逐出,并在其他可调度的节点上重新创建。

  1. 使用kubectl drain命令和--ignore-daemonsets--delete-emptydir-data标志清空现有节点,并在空格分隔列表中指定所需节点。 例如:

    重要

    需要使用 --delete-emptydir-data 才能收回 AKS 创建的 corednsmetrics-server Pod。 如果不使用此标志,则会收到错误。 有关详细信息,请参阅 emptydir 上的文档

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. 清空操作完成后,所有 Pod(不包括守护进程集控制的 Pod)都应在新的节点池上运行。 可以使用 kubectl get pods 命令进行验证。

    kubectl get pods -o wide -A
    

排查 Pod 逐出问题

清空节点时可能会遇到以下错误:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

默认情况下,群集具有由 AKS 管理的 Pod 中断预算(例如coredns-pdbkonnectivity-agent),且具有MinAvailable1。 例如,如果有两 coredns 个 Pod 正在运行,一次只能中断一个 Pod。 当其中一个 Pod 正在重新创建和不可用时,由于 Pod 中断预算的限制,另一 coredns 个 Pod 无法被逐出。 此问题在初始 coredns Pod 调度并运行后自行解决,从而使第二个 Pod 能够被正确逐出并重新创建。

提示

请考虑逐个清空节点,以便获得更流畅的逐出体验并避免限制。 有关详细信息,请参阅:

删除现有节点池

重要

删除节点池时,AKS 不会执行隔离和排出。 若要尽量减少当前在计划删除的节点池上运行的重新安排 Pod 的中断,请在删除之前对节点池中的所有节点执行封锁并清空。

  1. 使用 az aks nodepool delete 命令删除原始节点池。

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. 验证您的 AKS 群集是否仅包含新的节点池,并确认应用程序和 Pod 使用 kubectl get nodes 命令正常运行。

    kubectl get nodes
    

    输出应类似于以下示例输出,仅显示新的节点池 mynodepool

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

后续步骤

通过封锁和排出来重设节点池大小后,详细了解如何使用多个节点池