排查 CSE 错误导致的“节点未准备就绪”故障

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

先决条件

现象

由于 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 虚拟网络。

  • 请勿使用 IP 地址为自定义 DNS 服务器 IP 地址的 Azure DNS。 不推荐这样做。

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

    • 对于虚拟机规模集节点,请使用 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) 是否阻止了端口 443 到 API 服务器的出口流量。

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

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

  • 如果 DNS 成功解析名称并且 API 可访问,但节点 CSE 由于 API 超时而失败,请采取适当的操作,如下表所示。

    设置类型 操作
    VM 可用性集 使用 kubectl delete 节点命令从 Azure 门户 和 AKS API 中删除节点,然后再次纵向扩展群集。
    虚拟机规模集 从Azure 门户重新映像节点,或删除节点,然后再次纵向扩展群集。 若要删除特定节点,请使用 az aks nodepool delete-machines 命令。 它将先封锁并排空,然后删除节点。
  • 如果 AKS API 服务器限制请求,请升级到更高的服务层级。 有关详细信息,请参阅 AKS 的定价层。

详细信息