다음을 통해 공유

Azure Kubernetes 服务 (AKS) 群集的升级选项和建议

本文介绍 Azure Kubernetes 服务 (AKS) 群集升级的技术基础,包括升级选项和常见方案。 有关根据需求定制的深入指南,请使用本文末尾的基于方案的导航路径。

本文介绍的内容

此技术参考提供了全面的 AKS 升级基础知识,

  • 手动和自动升级选项以及何时使用每个选项。
  • 具有特定建议的常见升级方案。
  • 针对性能和最小中断的优化技术。
  • 容量、排水故障和计时问题的故障排除指南。
  • 验证过程和升级前检查。

此中心最适合帮助你了解升级机制、排查问题、优化升级设置以及了解技术实现。

有关详细信息,请参阅以下相关文章:


如果你不熟悉 AKS 升级,请从 升级方案中心 开始,获取基于方案的引导式帮助。

快速导航

你的情况 建议的路径
生产群集需要升级 生产升级策略
数据库/有状态工作负荷 有状态工作负荷模式
首次升级或基本群集 基本 AKS 群集升级
多个环境或机群 升级方案中心
节点池或 Windows 节点 节点池升级
仅限特定节点池 单节点池升级

升级选项

执行手动升级

通过手动升级,可以控制群集何时升级到新的 Kubernetes 版本。 这些升级对于测试或面向特定版本非常有用:

配置自动升级

自动升级使群集保持受支持的版本并保持最新状态。 如果要自动执行设置,请使用这些升级:

跨多个可用性区域的节点池的特殊注意事项

AKS 在节点组中使用尽力区域均衡。 在升级激增期间,虚拟机规模集中激增节点的区域提前未知,这可以暂时导致区域配置不平衡。 AKS 在升级后删除激增节点,并还原原始区域平衡。

若要保持区域均衡,请将激增设置为三个节点的倍数。 使用 Azure 本地冗余存储磁盘的永久性卷声明受区域限制,如果激增节点位于其他区域中,可能会导致停机。 使用 Pod 中断预算(PDB) 在排水期间保持高可用性。

优化升级以提高性能并最大程度地减少中断

合并 计划内维护时段最大激增PDB节点排出超时节点浸泡时间 ,以提高成功、低中断升级的可能性:

  • 计划内维护时段:在低流量期间计划自动升级。 建议至少四个小时。
  • 最大激增:更高的值会加快升级速度,但可能会中断工作负荷。 建议为生产使用 33 个%。
  • 最大不可用:当容量受限时使用。
  • Pod 中断预算:设置为在升级期间限制 Pod 减少。 验证服务。
  • 节点排空超时:配置 Pod 逐出等待持续时间。 默认值为 30 分钟。
  • 节点浸泡时间:错开升级以最大程度地减少停机时间。 默认值为 0 分钟。
升级设置 如何使用额外的节点 预期行为
maxSurge=5maxUnavailable=0 5 个激增节点 升级时会激增五个节点。
maxSurge=5maxUnavailable=0 0-4 个激增节点 由于激增节点不足,升级失败。
maxSurge=0maxUnavailable=5 5 个现有节点会耗尽升级。

注释

在升级之前,请检查 API 中断性变更并查看 AKS 发行说明 ,以避免中断。

升级过程中使用的验证

AKS 执行升级前验证,以确保群集运行状况:

  • API 中断性变更: 检测已弃用的 API。
  • Kubernetes 升级版本: 确保有效的升级路径。
  • PDB 配置: 检查配置错误的 PDB(例如 maxUnavailable=0)。
  • 配额: 确认有足够的配额来容纳激增节点。
  • 子网: 验证足够的 IP 地址。
  • 证书/服务主体: 检测过期的凭据。

这些检查有助于最大程度地减少升级失败,并尽早了解问题。

常见升级方案和建议

方案 1:容量约束

如果群集受产品层或区域容量的限制,则无法预配激增节点时升级可能会失败。 这种情况常见于专用产品层(如 GPU 节点)或资源有限的区域中。 如果 SKUNotAvailable 设置得太高而无法满足可用容量要求,则可能会出现 AllocationFailedOverconstrainedAllocationRequestmaxSurge 等错误。

阻止或解决的建议

方案 2:节点排出故障和 PDB

升级需要排出节点(逐出 Pod)。 当 Pod 终止速度缓慢或严格的 Pod 中断预算(PDB) 阻止 Pod 驱逐时,排空可能会失败。

示例错误:

Code: UpgradeFailed
Message: Drain node ... failed when evicting pod ... Cannot evict pod as it would violate the pod's disruption budget.

选项 1:强制升级(绕过 PDB)

警告

强制升级会绕过 Pod 中断预算(PDB)约束,可能导致服务中断,因为它会同时清空所有 Pod。 使用此选项之前,请先尝试修复 PDB 配置错误(查看 PDB minAvailable/maxUnavailable 设置,确保有足够的 Pod 副本,验证 PDB 未阻止所有逐出)。

仅当 PDB 阻止关键升级且无法解决时,才使用强制升级。 这将覆盖 PDB 保护,并可能导致升级期间服务完全不可用。

要求: Azure CLI 2.79.0+ 或 AKS API 版本 2025-09-01+

az aks upgrade \
  --name $CLUSTER_NAME \
  --resource-group $RESOURCE_GROUP_NAME \
  --kubernetes-version $KUBERNETES_VERSION \
  --enable-force-upgrade \
  --upgrade-override-until 2023-10-01T13:00:00Z

注释

  • upgrade-override-until 参数定义验证绕过何时结束(必须是将来的日期/时间)
  • 如果未指定,时间窗口默认从当前时间起为 3 天
  • “Z”表示 UTC/GMT 时区

警告

启用强制升级功能后,它优先于所有其他引流配置。 当强制升级处于活动状态时,将不会应用不可清空的节点行为设置(选项 2)。

选项 2:处理不可清空的节点(遵守 PDB)

使用这种保守的方法来维护 PDB,并防止升级失败。

配置无法排空的节点行为:

az aks nodepool update \
  --resource-group <resource-group-name> \
  --cluster-name <cluster-name> \
  --name <node-pool-name> \
  --undrainable-node-behavior Cordon \
  --max-blocked-nodes 2 \
  --drain-timeout 30

行为选项:

  • 计划(默认值): 删除阻止的节点和激增替换
  • Cordon (建议): Cordons 节点并将其标记为 kubernetes.azure.com/upgrade-status=Quarantined

最大阻止节点数(预览):

  • 指定可容忍的无法排空节点的数量
  • undrainable-node-behavior需要设置
  • 如果未指定,则maxSurge默认为该值(通常为 10%)
最大受阻节点的先决条件
  • 使用最大受阻节点功能需要 Azure CLI aks-preview 扩展版本 18.0.0b9 或更高版本。

    # Install or update the aks-preview extension
    az extension add --name aks-preview
    az extension update --name aks-preview
    
包含最大阻止节点的示例配置
az aks nodepool update \
  --cluster-name jizenMC1 \
  --name nodepool1 \
  --resource-group jizenTestMaxBlockedNodesRG \
  --max-surge 1 \
  --undrainable-node-behavior Cordon \
  --max-blocked-nodes 2 \
  --drain-timeout 5

防止排水故障的建议

  • 在 PDB 中设置 maxUnavailable 以允许至少一个 pod 逐出
  • 增加 Pod 副本以满足中断预算要求
  • 如果工作负荷需要更多时间,则延长排空超时时间。 (默认值为 30 分钟
  • 在过渡阶段测试 PDB、监视升级事件,并使用蓝绿部署来部署关键工作负载。 有关详细信息,请参阅 AKS 群集的蓝绿部署
验证无法透支的节点
  • 被阻止的节点为 Pod 取消计划,并标有标签 "kubernetes.azure.com/upgrade-status: Quarantined"

  • 在升级时出现排出节点故障时,验证任何受阻节点上的标签:

    kubectl get nodes --show-labels=true
    
解析无法透支的节点
  1. 移除负责任的 PDB:

    kubectl delete pdb <pdb-name>
    
  2. 删除kubernetes.azure.com/upgrade-status: Quarantined标签:

    kubectl label nodes <node-name> <label-name>
    
  3. (可选)删除阻止的节点:

    az aks nodepool delete-machines --cluster-name <cluster-name> --machine-names <machine-name> --name <node-pool-name> --resource-group <resource-group-name>
    
  4. 完成此步骤后,可以通过执行任何更新作来协调群集状态,而无需 az aks 中概述的可选字段。 或者,可以将节点池缩放为与升级的节点计数相同的节点数。 此作可确保节点池达到其预期的原始大小。 AKS 优先移除被阻止的节点。 此命令还会将群集预配状态还原到 Succeeded。 在以下示例中, 2 是已升级的节点总数。

    # Update the cluster to restore the provisioning status
    az aks update --resource-group <resource-group-name> --name <cluster-name>
    
    # Scale the node pool to restore the original size
    az aks nodepool scale --resource-group <resource-group-name> --cluster-name <cluster-name> --name <node-pool-name> --node-count 2
    

方案 3:升级速度缓慢

保守设置或节点级问题可能会延迟升级,这会影响你保持最新修补程序和改进的能力。

升级速度缓慢的常见原因包括:

  • maxSurge 值或 maxUnavailable 值(限制并行度)。
  • 高浸泡时间(节点升级之间的等待间隔过久)。
  • 清空故障(请参阅 节点排出失败)。

阻止或解决的建议

  • maxSurge=33%用于maxUnavailable=1生产。
  • maxSurge=50%用于maxUnavailable=2开发/测试。
  • 使用 OS 安全修补程序进行快速、有针对性的修补(避免完整节点重新映像)。
  • 启用 undrainableNodeBehavior 以避免升级阻止程序。

方案 4:IP 耗尽

激增节点需要更多 IP。 如果子网接近容量,则节点预配可能会失败(例如, Error: SubnetIsFull)。 此方案常见于 Azure 容器网络接口、高 maxPods节点计数或大型节点计数。

阻止或解决的建议

  • 确保子网有足够的 IP 用于所有节点、激增节点和 Pod。 公式为 Total IPs = (Number of nodes + maxSurge) * (1 + maxPods).

  • 回收未使用的 IP 或展开子网(例如,从 /24 到 /22)。

  • 如果无法进行子网扩展,则降低 maxSurge

    az aks nodepool update \
      --resource-group <resource-group-name> \
      --cluster-name <cluster-name> \
      --name <node-pool-name> \
      --max-surge 10%
    
  • 使用 Azure Monitor 或自定义警报监视 IP 使用情况。

  • 减少 maxPods 每个节点,清理孤立的负载均衡器 IP,并为大规模群集规划子网大小。


常见问题

是否可以使用开源工具进行验证?

是的。 许多开源工具与 AKS 升级过程很好地集成:

  • kube-no-trouble (kubent):在升级之前扫描已弃用的 API。
  • Trivy:容器映像和 Kubernetes 配置的安全扫描。
  • Sonobuoy:Kubernetes 一致性测试和群集验证。
  • kube-bench:针对 Internet 安全标准中心的安全基准检查。
  • Polaris:验证 Kubernetes 最佳做法。
  • kubectl-neat:清理 Kubernetes 清单进行验证。

如何在升级之前验证 API 兼容性?

使用 kubent 等工具运行弃用检查:

# Install and run API deprecation scanner
kubectl apply -f https://github.com/doitintl/kube-no-trouble/releases/latest/download/knt-full.yaml

# Check for deprecated APIs in your cluster
kubectl run knt --image=doitintl/knt:latest --rm -it --restart=Never -- \
  -c /kubeconfig -o json > api-deprecation-report.json

# Review findings
cat api-deprecation-report.json | jq '.[] | select(.deprecated==true)'

AKS 升级与其他 Kubernetes 平台有何不同?

AKS 提供了多种独特的优势:

  • 本机 Azure 与 Azure 流量管理器、Azure 负载均衡器和网络集成。
  • 用于协调多群集升级的 Azure Kubernetes Fleet Manager。
  • 没有手动节点管理的自动节点映像修补。
  • 配额、网络和凭据的内置验证。
  • Azure 支持与升级相关的问题。

选择升级路径

本文提供了技术基础。 现在,选择基于方案的路径。

准备好执行了吗?

如果有... 然后转到...
生产环境 生产升级策略:零停机升级的经过战斗测试的模式
数据库或有状态应用 有状态工作负荷模式:数据持久性的安全升级模式
多个环境 升级方案中心:复杂设置的决策树
基本群集 升级 AKS 群集:分步升级群集

仍在决定?

升级方案中心 用于考虑以下事项的引导决策树:

  • 停机时间容差
  • 环境复杂性
  • 风险配置文件
  • 时间线约束

下一个任务

  • 请始终检查 API 中断性变更 ,并验证工作负载与目标 Kubernetes 版本的兼容性。
  • 在过渡环境中测试升级设置(例如 maxSurgemaxUnavailable和 PDB),以最大程度地降低生产风险。
  • 在整个过程中监视升级事件和群集运行状况。