对 Azure Kubernetes 服务处于失败状态的群集或节点进行故障排除

本文介绍如何对进入失败状态的Microsoft Azure Kubernetes 服务(AKS)群集或节点进行故障排除。

常见原因

下面是失败群集或节点池的常见原因:

原因 参考
自定义脚本扩展 (CSE) 虚拟机 (VM) 扩展预配错误 排查 CSE 错误导致的“节点未准备就绪”故障
密钥 Azure 资源不可用
由于没有区域/区域容量,VM 分配失败
VM 分配失败,因为核心配额已超过 Quotaexceeded 错误
客户施加的限制
工作负荷问题

常见错误的基本故障排除导致群集/节点失败

下表概述了一些常见错误,这些错误可能导致群集或节点进入失败状态、其说明以及解决这些错误的基本故障排除方法。

错误 说明 故障排除方法
OutboundConnFailVMExtensionError 此错误表示 VM 扩展由于缺少出站连接而无法安装或更新。 检查 VM 或 VM 规模集的网络安全组(NSG)规则和防火墙设置。 确保 VM 或 VM 规模集可以访问以下终结点:https://aka.ms/aks/outboundhttps://aka.ms/aks/ssh、和https://aka.ms/aks/agenthttps://aka.ms/aks/containerinsights
清空错误 此错误表示在升级操作之前节点无法清空。 使用 kubectl 命令检查节点上的 Pod 状态和事件: kubectl get pods --all-namespaces -o widekubectl describe pod <pod-name> -n <namespace>。 查找停滞在终止或未知状态或事件中的任何错误或警告的任何 Pod。 可能需要强制删除 Pod 或重启节点上的 kubelet 服务。
SubscriptionNotRegistered 错误 此错误表示未注册订阅以使用 AKS 资源提供程序。 使用 az provider register --namespace Microsoft.ContainerService 命令注册订阅。
RequestDisallowedByPolicy 错误 此错误表示操作被应用于订阅或资源组的策略阻止。 查看策略详细信息和策略分配范围。 若要允许该操作,可能需要修改或排除策略。
QuotaExceeded 错误 此错误表示操作超出了资源类型或区域的配额限制。 使用 Azure 门户、Azure CLI 或 Azure PowerShell 检查资源类型或区域的当前配额使用情况和配额限制。 可能需要删除一些未使用的资源或请求增加配额。
PublicIPCountLimitReached 错误 此错误指示操作达到可在订阅或区域中创建的最大公共 IP 地址数。 使用 Azure 门户、Azure CLI 或 Azure PowerShell 检查订阅或区域的当前公共 IP 地址使用情况和限制。 可能需要删除一些未使用的公共 IP 地址,或请求增加公共 IP 地址限制。
OverconstrainedAllocationRequest 错误 此错误表示操作无法在区域中分配请求的 VM 大小。 使用 Azure 门户、Azure CLI 或 Azure PowerShell 检查区域中 VM 大小的可用性。 可能需要选择不同的 VM 大小或不同的区域。
ReadOnlyDisabledSubscription 错误 此错误表示订阅当前已禁用,并设置为只读。 查看和调整订阅权限,因为订阅可能因计费问题、信用额度过期或策略冲突而暂停。

其他可能问题的基本故障排除导致群集/节点失败

下表描述了可能导致群集或节点进入失败状态的其他可能问题、其说明和解决这些问题的解决方案。

问题 说明 解决方案
子网大小太小 该操作无法创建或更新群集,因为子网没有足够的空间来容纳所需的节点数。 删除节点池,并使用 Azure 门户、Azure CLI 或 Azure PowerShell 创建具有更大子网大小的新节点池。
虚拟网络被阻止 该操作无法与群集 API 服务器或 Kubernetes 控制平面通信,因为防火墙或自定义域名系统(DNS)设置会阻止来自节点的出站连接。 允许防火墙上的节点流量,并使用 Azure 门户、Azure CLI 或 Azure PowerShell 设置到 Azure 的 DNS 解析。
PDB 问题 操作无法更新群集,因为 PDB 停止删除一个或多个 Pod。 PDB 是一种资源,用于限制在特定时间段内可以自愿终止的 Pod 数量。 暂时删除 PDB,协调群集,然后使用 kubectl 命令行工具再次添加 PDB。
基础结构问题 由于 Azure 资源管理器 (ARM) 服务管理 Azure 中的资源存在内部问题,操作无法更新群集。 针对每个节点池执行代理池对帐,并使用 Azure CLI 或 Azure PowerShell 对托管群集进行对帐。
API 服务器错误 由于服务中断或 bug,操作无法访问群集 API 服务器或 Kubernetes 控制平面。 将其报告给 AKS 支持团队,并提供相关的日志和诊断信息。 可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 获取日志和诊断信息。

注意

  • 上表中提到的操作是指从客户端触发的任何更新(PUT)操作。
  • 在 Kubernetes 中,控制器中有一个组件。 它确保世界的实际状态,包括群集状态和潜在的外部状态,例如为 Kubelet 运行容器或云提供商的负载均衡器。 它与对象中指定的所需状态保持一致。 此对齐过程是控制器的关键功能。 对于 AKS,此组件可确保 AKS 群集的状态与所需的配置保持一致。 若要手动触发它,请运行 az resource update --ids <AKS cluster id>。 可以通过运行 az aks show -n <cluster name> -g <cluster resource group> -o json --query id来获取 AKS 群集 ID。 如果实际状态与所需状态之间存在任何差异,请采取必要措施纠正这些差异。

预配状态检查

若要检查群集状态,请选择“ 预配状态检查”。 然后,会显示群集和代理池的预配状态。

显示“预配状态检查”选项的屏幕截图。

方案 1:群集处于失败状态

若要解决此问题,请获取导致失败的操作并找出错误。 下面是导致群集失败的两个常见操作失败:

  • 群集创建已失败
  • 群集升级失败

如果最近创建的或升级的群集处于失败状态,请使用以下方法来排查故障:

  • 检查 活动日志 以确定失败的根本原因。

    可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 查看活动日志

    活动日志可以显示与失败关联的错误代码和消息。 有关特定错误的详细信息,请参阅 导致群集/节点失败 的常见错误的基本故障排除部分。

  • 使用 AKS 诊断和解决问题功能 来排查和解决常见问题。

    注意

    此功能仅在 Azure 门户 和 Azure CLI 中可用。

使用Azure 门户查看失败群集的活动日志

若要查看Azure 门户中失败群集的活动日志,请执行以下步骤:

  1. 在Azure 门户中,转到“资源组”页,然后选择包含群集的资源组。

  2. 在“ 概述 ”页上,从资源列表中选择群集名称。

  3. 在群集页上, 从左侧菜单中选择“活动日志 ”。

  4. “活动日志”页上,可以按“状态”、“时间跨度”、“事件发起的事件”“事件”类别筛选事件。 例如,可以从“状态”下拉列表中选择“失败以查看仅失败的事件。

    显示如何在“活动日志”页上筛选事件的屏幕截图。

  5. 若要检查事件的详细信息,请从列表中选择事件名称。 此时会打开一个新窗格,其中包含事件摘要、属性和 JSON 数据。 还可以将 JSON 数据下载为文件。

  6. 若要查看与事件关联的错误代码和消息,请向下滚动到 事件摘要中的“状态 ”部分。 还可以在属性和 JSON 数据节中找到错误信息。

使用 Azure CLI 查看失败群集的活动日志

如果想要使用 Azure CLI 查看失败群集的活动日志,请执行以下步骤:

  1. 在计算机上安装 Azure CLI,并使用 Azure 帐户登录。

  2. 使用 az group list 命令列出订阅中的资源组,并查找包含群集的资源组的名称。

  3. 使用 az resource list 具有参数的命令 --resource-group 列出资源组中的资源,并查找群集的名称。

  4. 使用az monitor activity-log list命令和--resource-group--resource参数列出群集的活动日志。 还可以使用 --start-time--end-time--caller> --status--filter参数按不同的条件筛选事件。 例如,可用于 --status Failed 仅查看失败的事件。

  5. 使用az monitor activity-log show命令和--resource-group--resource--event-id参数显示特定事件的详细信息。 可以从上一命令的输出中找到事件 ID。 输出将包括事件摘要、属性和 JSON 数据。 还可以使用 --output 参数更改输出格式。

  6. 若要查看与事件关联的错误代码和消息,请查找 statusMessage 命令输出中的字段。 还可以在属性和 JSON 数据节中找到错误信息。

    显示 JSON 数据的屏幕截图。

对失败的群集使用 AKS 诊断和解决问题功能

在Azure 门户中,导航到 AKS 群集资源,并从左侧菜单中选择“诊断并解决问题”。 你将看到一系列类别和方案,你可以选择这些类别和方案来运行诊断检查并获取建议的解决方案。

在 Azure CLI 中,使用az aks collect命令和--name--resource-group参数从群集节点收集诊断数据。 还可以使用--storage-account参数--sas-token来指定要在其中上传数据的Azure 存储帐户。 输出将包含“ 诊断和解决问题 ”边栏选项卡的链接,可在其中查看结果和建议的操作。

在“诊断和解决问题”边栏选项卡中,可以选择“群集问题作为类别。 如果检测到任何问题,你将看到一系列可能的解决方案,你可以遵循这些解决方案来修复这些问题。

显示“诊断和解决问题”门户中可能的解决方案的屏幕截图。

方案 2:节点处于失败状态

在极少数情况下,Azure 磁盘分离操作可能会部分失败,这会使节点 VM 处于失败状态。

若要解决此问题,请使用以下方法之一手动更新 VM 状态:

  • 对于基于可用性集的群集,请运行以下 az vm update 命令:

    az vm update --resource-group <resource-group-name> --name <vm-name>
    
  • 对于基于 VM 规模集的群集,请运行以下 az vmss update-instances 命令:

    az vmss update-instances --resource-group <resource-group-name> --name <scale-set-name> --instance-id <vm-or-scale-set-id>
    

方案 3:节点池处于失败状态

当支持节点池的 VM 规模集或可用性集在预配、缩放或更新期间遇到错误时,可能会出现此问题。 此问题可能是由于容量、配额限制、网络问题、策略冲突、资源锁或其他因素导致无法正确分配或配置 VM。

若要排查此问题,请执行以下步骤:

  1. 使用 az aks nodepool show 命令检查节点池的状态。 如果预配状态为 Failed,可以在输出中看到错误消息和代码。
  2. 使用 az vmss showaz vm availability-set show 命令检查 VM 规模集或可用性集的状态。 如果预配状态为 Failed,可以在输出中看到错误消息和代码。
  3. 使用 az vmss list-instancesaz vm list 命令检查节点池中单个 VM 的状态。 如果任何 VM 处于 FailedUnhealthy 状态,则可以在输出中看到错误消息和代码。
  4. 检查 VM 规模集或可用性集的活动日志和诊断设置,查看指示失败原因的任何事件或警报。 可以使用 Azure 门户、Azure CLI 或 Azure Monitor API 访问活动日志和诊断设置。
  5. 检查部署节点池的区域和订阅的配额和容量。 可以使用az vm list-usage命令或Azure 门户来检查配额和容量。 如果达到配额或容量限制,可以请求增加或删除一些未使用的资源。
  6. 检查节点池的策略和角色分配。 可以使用az policy命令az role或Azure 门户来检查策略定义、分配、合规性和豁免。 还可以使用az role assignment命令或Azure 门户检查节点池的角色分配和权限。
  7. 检查节点池的资源锁。 可以使用az lock命令或Azure 门户检查锁级别、范围和备注。 还可以根据需要删除或更新锁。

其他日志记录和诊断工具

如果以前的故障排除方法无法解决问题,可以使用以下日志记录和诊断工具来收集详细信息并识别根本原因:

  • 适用于容器的 Azure Monitor:

    此服务从 AKS 群集和节点收集和分析指标和日志。 用于容器的 Azure Monitor 可以监视群集和节点运行状况、性能和可用性。 还可以使用它来查看容器日志、kubelet 日志和节点启动诊断日志。

  • AKS Periscope

    此工具从 AKS 群集收集节点和 Pod 日志、网络信息和群集配置,并将其上传到 Azure 存储帐户。 此工具可帮助你排查常见的群集问题,例如 DNS 解析、网络连接和节点状态。 还可以使用它通过附加的收集日志生成支持请求。

  • AKS 诊断

    此工具对 AKS 群集和节点运行一系列检查,并为常见问题提供建议和修正步骤。 此工具可帮助你排查与群集创建、升级、缩放、网络、存储和安全性相关的问题。 还可以使用它生成附加了诊断结果的支持请求。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区