次の方法で共有

为 Azure Kubernetes 服务 (AKS) 节点池配置滚动升级

滚动升级策略一次升级一个节点(或一次升级几个节点),同时最大程度地减少工作负荷中断,同时确保节点池在整个升级过程中保持可用状态。 本文介绍如何为 AKS 节点池配置滚动升级,包括激增设置、排水超时和浸泡时间。

在您开始之前

  • 确保控制平面已升级到目标 Kubernetes 版本。 无法将节点池升级到高于控制平面的版本。 有关详细信息,请参阅 升级 AKS 群集控制平面
  • 如果你使用的是 Azure CLI,本文要求 Azure CLI 2.34.1 或更高版本。 使用az --version命令查找版本。 如果需要安装或升级,请参阅 [安装 Azure CLI][azure-cli-install]。
  • 需要 Microsoft.ContainerService/managedClusters/agentPools/write RBAC 角色权限才能为 AKS 节点池配置滚动升级。

滚动升级行为的概述

在滚动升级期间,AKS 对节点池中的每个节点执行以下作:

  1. 添加激增节点:基于最大激增(--max-surge)设置添加新的缓冲区节点,以在升级期间维护容量。
  2. Cordon 和清空节点:逐个cordon 和清空旧节点,以尽量减少对正在运行的应用程序造成的中断。 如果使用最大激增,它会与指定的缓冲区节点数同时封锁和清空尽可能多的节点。
  3. 等待浸泡时间 (可选):等待配置的 浸泡持续时间 ,然后继续让工作负载在新节点上稳定,然后再继续升级。
  4. 重置旧节点映像:当旧节点被清空时,它们将被重新映像以接收新版本。 重装后的节点将用作要升级的下一组节点的缓冲节点。
  5. 重复:此过程将重复,直到升级节点池中的所有节点。
  6. 删除激增节点:升级所有节点后,将删除所有剩余的缓冲区节点,维护原始节点池大小和平衡。

配置滚动升级设置

自定义节点流量

重要

  • 节点激增要求与每个升级操作所请求的最大激增计数相对应的订阅配额。 例如,一个群集有五个节点池,每个节点池有四个节点,共有 20 个节点。 如果每个节点池的最大激增值为 50%,则需要额外的计算和 IP 配额 10 个节点( 个节点× 个池)才能完成升级。
  • 节点池中的最大激增设置是永久性的。 后续 Kubernetes 升级或节点版本升级使用此设置。 你可以随时更改节点池的最大激增值。 对于生产节点池,建议最大激增设置为 33%。
  • 如果使用的是 Azure CNI,需要验证子网中是否有可用 IP 以 满足 Azure CNI 的 IP 要求

默认情况下,AKS 会将升级配置为使用一个额外节点进行激增。 对于最大激增设置,默认值为一,它允许 AKS 在封锁或排空现有应用程序之前创建一个额外的节点,以替换旧版本的节点,从而最大限度地减少对工作负载的中断。 可以自定义每个节点池的最大激增值。 增加最大激增值时,升级过程会更快完成,但在升级过程中可能会遇到更多中断。

例如,最大跃升值 100% 可以实现最快的升级过程,但也会导致节点池中的所有节点同时被清空。 你可能想要在测试环境中使用更高的值,比如这个。 对于生产节点池,建议使用最大浪涌设置 33%

AKS 可以接受整数值和百分比值作为最大激增值。 例如:

值类型 Example Description
整数 5 要激增的五个额外节点
百分比 50% 池中当前节点计数的一半的激增值

最大激增百分比值可以是最小值 1% 和最大值 100%。 百分比值将向上舍入到最近的节点计数。 如果最大激增值高于要升级的所需节点数,则要升级的节点数将用于最大激增值。

设置最大浪涌值

使用 az aks nodepool add 和参数 az aks nodepool update--max-surge 命令,为新的或现有节点池设置最大突增值。 例如:

# Set max surge for a new node pool
az aks nodepool add \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 33%

# Update max surge for an existing node pool 
az aks nodepool update \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 5

自定义不可用的节点

重要

  • 要设置最大不可用值,必须将最大激增数设置为0。 两个值不能同时处于活动状态。
  • 在升级过程中,最大不可用节点数限制不会创建额外节点。 相反,AKS 会一次封锁 n 个节点(最大不可用值),并将 Pod 逐出到代理池中的其他节点。 如果无法安排 Pod,可能会导致工作负载中断。
  • 由于未满足的 Pod 中断预算(PDB),最大不可用可能会导致更多故障,因为计划 Pod 的资源较少。 有关详细信息,请参阅 Pod 中断预算的故障排除
  • 无法在系统节点池上设置“max unavailable”参数。

AKS 还可以将升级配置为不使用激增节点并就地升级节点。 最大不可用值确定可从现有节点池节点同时封锁和清空的节点数。

AKS 接受整数值和百分比值作为最大不可用值。 例如:

值类型 Example Description
整数 5 从现有节点隔离五个节点
百分比 50% 池中当前节点数量的一半将不可用

最大不可用百分比值可以是最小值 1% 和最大值 100%。 百分比值将向上舍入到最近的节点计数。

设置最大不可用值

使用 az aks nodepool addaz aks nodepool updateaz aks nodepool upgrade 命令加上 --max-unavailable 参数为新的或现有的节点池设置最大不可用值。 例如:

# Set max unavailable for a new node pool
az aks nodepool add \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 0 \
    --max-unavailable 5

# Update max unavailable for an existing node pool 
az aks nodepool update \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 0 \
    --max-unavailable 5

# Set max unavailable at upgrade time
az aks nodepool upgrade \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 0 \
    --max-unavailable 5

自定义节点排空超时

某些 Pod 可能存在长期运行的工作负载,无法在运行时重新调度到另一个节点。 例如,必须完成运行的内存密集型有状态工作负荷。 在这些情况下,可以配置 AKS 在升级工作流中遵循的节点清空超时。

默认节点排出超时值为 30 分钟。 节点排空超时值可以至少为 5 分钟,最多为 24 小时。

如果排空超时时间已到且 Pods 仍在运行,升级操作将停止。 任何后续PUT操作 都将继续进行暂停的升级。

小窍门

对于长时间运行的 Pod,还应在 Pod 规范中配置 terminationGracePeriodSeconds

设置节点排出超时值

使用 az aks nodepool addaz aks nodepool update 命令并通过 --drain-time-out 参数,设置新的或现有节点池的节点排空超时(以分钟为单位)。

# Set drain timeout for a new node pool
az aks nodepool add \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --drain-time-out 100

# Update drain timeout for an existing node pool
az aks nodepool update \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --drain-time-out 45

自定义节点浸泡时间

若要在清空节点、重置其映像,并在两个操作之间指定等待时间,再继续操作下一个节点,可以设置等待时间。 这种浸泡时间让你有机会在升级过程中执行其他任务,例如从监视仪表板检查应用程序运行状况。

默认节点浸泡时间为 0 分钟。 节点浸泡时间值可以至少为 0 分钟,最多为 30 分钟。 我们建议尽可能短地保持浸泡时间。 节点浸泡时间越高,升级总持续时间就会增加,并延迟问题发现。

设置节点浸泡时间值

使用az aks nodepool addaz aks nodepool updateaz aks nodepool upgrade标志或命令--node-soak-duration为新的或现有节点池设置节点浸泡时间(以分钟为单位)。

# Set node soak time for a new node pool
az aks nodepool add \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --node-soak-duration 10

# Update node soak time for an existing node pool
az aks nodepool update \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 33% \
    --node-soak-duration 5

# Set node soak time when upgrading an existing node pool
az aks nodepool upgrade \
    --name <node-pool-name> \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --max-surge 33% \
    --node-soak-duration 20

查看 AKS 节点升级事件

使用 kubectl get events 命令查看升级事件以监视滚动升级进度。

kubectl get events --field-selector reason=Drain,reason=Surge,reason=Upgrade

升级事件期间的示例输出:

default  2m1s  Normal  Drain    node/aks-nodepool1-12345678-vmss000001  Draining node: [aks-nodepool1-12345678-vmss000001]
default  9m22s Normal  Surge    node/aks-nodepool1-12345678-vmss000002  Created a surge node [aks-nodepool1-12345678-vmss000002 nodepool1] for agentpool nodepool1
default  1m45s Normal  Upgrade  node/aks-nodepool1-12345678-vmss000001  Soak duration 5m0s after draining node: aks-nodepool1-12345678-vmss000001

下表概述了针对生产工作负荷的建议节点池升级设置:

设置 建议
最大浪涌 对于生产节点池,设置为 33%
清空超时 根据您的最长运行时间的 Pod 要求进行配置
浸泡时间 除非需要手动验证,否则请使用短持续时间(0-5 分钟)
Pod 中断预算 为关键工作负荷配置 PDB 以控制 Pod 逐出
升级顺序 首先升级非生产节点池以验证新版本