排查 CSE 错误导致的节点未就绪故障

本文可帮助你排查以下情况:由于自定义脚本扩展 (CSE) 错误,Microsoft Azure Kubernetes 服务 (AKS) 群集未处于Succeeded状态,并且 AKS 节点在节点池中未准备就绪。

先决条件

症状

由于 CSE 错误,AKS 群集节点在节点池中未准备就绪,并且 AKS 群集未处于状态 Succeeded

原因

预配 kubelet 和其他组件时,节点扩展部署失败并返回多个错误代码。 这是最常见的错误原因。 若要验证在预配 kubelet 时节点扩展部署是否失败,请执行以下步骤:

  1. 若要更好地了解群集上的当前故障,请运行 az aks showaz resource update 命令以设置调试:

    clusterResourceId=$(az aks show \
        --resource-group <resource-group-name> --name <cluster-name> --output tsv --query id)
    az resource update --debug --verbose --ids $clusterResourceId
    
  2. 根据 GitHub 上的 CSE 帮助程序可执行文件中的错误列表,检查从 az resource update 命令收到的调试输出和错误消息。

如果任何错误涉及 kubelet 的 CSE 部署,则你已验证此处所述的方案是节点未就绪失败的原因。

通常,退出代码标识导致失败的特定问题。 例如,你将看到“无法与 API 服务器通信”或“无法连接到 Internet”等消息。或者,退出代码可能会提醒你 API 网络超时或需要更换的节点故障。

解决方案 1:确保正确配置自定义 DNS 服务器

设置自定义域名系统 (DNS) 服务器,以便它可以正确进行名称解析。 配置服务器以满足以下要求:

  • 如果使用的是自定义 DNS 服务器,请确保服务器正常运行且可通过网络访问。

  • 确保自定义 DNS 服务器具有 Azure DNS IP 地址 (所需的条件转发器 ,或具有指向该地址) 的转发器。

  • 如果专用 AKS DNS 区域托管在 Azure 上,请确保将其链接到自定义 DNS 虚拟网络。

  • 不要将 Azure DNS IP 地址与自定义 DNS 服务器的 IP 地址一起使用。 不建议这样做。

  • 避免在 DNS 设置中使用 IP 地址而不是 DNS 服务器。 可以使用 Azure CLI 命令在虚拟机 (VM) 规模集或可用性集上检查这种情况。

    • 对于 VM 规模集节点,请使用 az vmss run-command invoke 命令:

      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --command-id RunShellScript \
          --instance-id 0 \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --instance-id 0 \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      
    • 对于 VM 可用性集节点,请使用 az vm run-command invoke 命令:

      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      

有关详细信息,请参阅 Azure 虚拟网络和中心中的资源的名称解析,并使用自定义 DNS 进行分支

解决方案 2:修复 API 网络超时

确保可以访问 API 服务器,并且不会受到延迟。 为此,请按照下列步骤操作:

  • 检查 AKS 子网,查看分配的网络安全组 (NSG) 是否阻止了到 API 服务器的出口流量端口 443。

  • 检查节点本身,查看节点是否有另一个阻止流量的 NSG。

  • 检查 AKS 子网中是否有任何分配的路由表。 如果路由表中的网络虚拟设备 (NVA) 或防火墙,请确保端口 443 可用于出口流量。 有关详细信息,请参阅 控制 AKS 中群集节点的出口流量

  • 如果 DNS 成功解析名称并且 API 可访问,但节点 CSE 因 API 超时而失败,请执行下表所示的相应操作。

    设置类型 操作
    VM 可用性集 使用 kubectl delete node 命令从 Azure 门户 和 AKS API 中删除节点,然后再次纵向扩展群集。
    VM 规模集 重置节点映像或删除节点,然后再次纵向扩展群集。
  • 如果 AKS API 服务器限制请求,请升级到更高的服务层。 有关详细信息,请参阅 AKS 运行时间 SLA

更多信息