排查 CSE 错误导致的节点未就绪故障
本文可帮助你排查以下情况:由于自定义脚本扩展 (CSE) 错误,Microsoft Azure Kubernetes 服务 (AKS) 群集未处于Succeeded
状态,并且 AKS 节点在节点池中未准备就绪。
先决条件
症状
由于 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 虚拟网络。
不要将 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。
更多信息
- 有关常规故障排除步骤,请参阅 节点未就绪故障的基本故障排除。