排查 CSE 错误导致的“节点未准备就绪”故障
本文可帮助你排查Microsoft Azure Kubernetes 服务(AKS)群集未处于Succeeded
状态,AKS 节点由于自定义脚本扩展(CSE)错误而未在节点池中就绪的情况。
先决条件
现象
由于 CSE 错误,AKS 群集节点在节点池中未就绪,AKS 群集未处于 Succeeded
状态。
原因
节点扩展部署失败,并在预配 kubelet 和其他组件时返回多个错误代码。 这是最常见的错误原因。 若要验证预配 kubelet 时节点扩展部署是否失败,请执行以下步骤:
若要更好地了解群集上的当前故障,请运行 az aks show 和 az 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
根据 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 的定价层。
详细信息
- 有关常规故障排除步骤,请参阅 节点未就绪故障的基本故障排除。