总结
本文可帮助你排查 Azure Kubernetes 服务(AKS)群集未处于 Succeeded 状态且 AKS 节点因自定义脚本扩展(CSE)错误而未在节点池中就绪的情况。 按照以下步骤诊断和解决 AKS 环境中的 CSE 错误。
先决条件
现象
由于 CSE 错误,AKS 群集节点在节点池中未就绪,AKS 群集未处于 Succeeded 状态。
原因
节点扩展部署失败,并在预配 kubelet 和其他组件时返回多个错误代码。 这是最常见的错误原因。 若要验证预配 kubelet 时节点扩展部署是否失败,请执行以下步骤:
若要更好地了解群集上的当前故障,请运行 az aks show 和 az resource update 命令以设置调试:
设置环境变量并运行命令以查看群集的状态和调试信息。
export RG_NAME="my-aks-rg" export CLUSTER_NAME="myakscluster" clusterResourceId=$(az aks show \ --resource-group $RG_NAME --name $CLUSTER_NAME --output tsv --query id) az resource update --debug --verbose --ids $clusterResourceId结果:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-aks-rg-xxx/providers/Microsoft.ContainerService/managedClusters/myaksclusterxxx", "name": "myaksclusterxxx", "type": "Microsoft.ContainerService/managedClusters", "location": "eastus2", "tags": null, "properties": { ... } }根据 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 命令在虚拟机规模集或可用性集上检查这种情况。
对于虚拟机规模集节点,请使用 az vmss run-command invoke 命令:
重要: 必须指定 VM 规模集的
--instance-id。 在这里,我们演示了查询 AKS 节点资源组中有效实例 ID(例如 0)和可能的 VMSS。 适当地更新值以匹配环境。export NODE_RESOURCE_GROUP=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query nodeResourceGroup -o tsv) export VMSS_NAME=$(az vmss list --resource-group $NODE_RESOURCE_GROUP --query "[0].name" -o tsv) export DNS_IP_ADDRESS="10.0.0.10" export INSTANCE_ID=$(az vmss list-instances --resource-group $NODE_RESOURCE_GROUP --name $VMSS_NAME --query "[0].instanceId" -o tsv) export API_FQDN=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query fqdn -o tsv) az vmss run-command invoke \ --resource-group $NODE_RESOURCE_GROUP \ --name $VMSS_NAME \ --instance-id $INSTANCE_ID \ --command-id RunShellScript \ --output tsv \ --query "value[0].message" \ --scripts "telnet $DNS_IP_ADDRESS 53" az vmss run-command invoke \ --resource-group $NODE_RESOURCE_GROUP \ --name $VMSS_NAME \ --instance-id $INSTANCE_ID \ --command-id RunShellScript \ --output tsv \ --query "value[0].message" \ --scripts "nslookup $API_FQDN $DNS_IP_ADDRESS"对于 VM 可用性集节点,请使用 az vm run-command invoke 命令:
重要: 必须在资源组中的可用性集中指定
--name有效的 VM。 下面是用于运行网络检查的模板。az vm run-command invoke \ --resource-group $RG_NAME \ --name $AVAILABILITY_SET_VM \ --command-id RunShellScript \ --output tsv \ --query "value[0].message" \ --scripts "telnet $DNS_IP_ADDRESS 53" az vm run-command invoke \ --resource-group $RG_NAME \ --name $AVAILABILITY_SET_VM \ --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 的定价层。
详细信息
- 有关常规故障排除步骤,请参阅 节点未就绪故障的基本故障排除。