你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
什么是卡住的工作负载?
卡住的工作负载是指由于节点处于未就绪状态,而无法在 Kubernetes 群集中重新调度到另一个节点的 Pod。 出现这个问题可能有多种原因,包括节点电源故障。
按照设计,如果运行有状态工作负载的节点变为未就绪状态(例如,由于电源故障),则 Kubernetes 不会移动这些有状态工作负载。 有关详细信息,请参阅 Kubernetes 文档。
本指南详细介绍了在由于裸机电源故障导致 Nexus Kubernetes 群集中的工作负载卡住的情况下的故障排除步骤。 本指南还说明了如何重启一个卡住的 Pod,以便它能够在其他节点上重新调度。
先决条件
- 在部署了 Nexus Kubernetes 群集的订阅中查看 Azure 资源的权限
- 在 Nexus Kubernetes 群集中使用
kubectl
命令进行更改(例如删除节点)所需的权限
诊断卡住的工作负载
如果你观察到应用程序没有按预期响应,那么工作负载可能卡在了未就绪节点。 要诊断 Nexus Kubernetes 群集中未就绪节点上卡住的工作负载,请查找以下症状:
要检查 Nexus Kubernetes 群集节点是否未就绪,请在 Nexus Kubernetes 群集中运行以下
kubectl
命令:kubectl get nodes | awk '$2 != "Ready" {print $1, $2}' | column -t
如果命令没有返回结果,则表示所有节点都已就绪。 有时,节点在电源故障发生后需要几分钟才能变为未就绪状态,因此你可能需要在几分钟后再次运行该命令。 如果节点在合理的时间(5-10 分钟)后仍然显示为就绪状态,并且你的应用程序仍然没有响应,则问题可能有所不同,请联系客户支持以获取进一步的帮助。
要列出在未就绪节点上卡住的 Pod,请在 Nexus Kubernetes 群集中运行以下
kubectl
命令:kubectl get nodes -o json | jq -r '.items[] | select(.status.conditions[] | select(.type=="Ready") | .status != "True") | .metadata.name' | xargs -I {} sh -c 'kubectl get pods --all-namespaces --field-selector spec.nodeName={} --no-headers | awk -v node={} "{print \$1, \$2, \$4, node}"' | sort -k1,1 | column -t -N "NAMESPACE,NAME,STATUS,NODE"
此命令返回在未就绪节点上卡住的 Pod(有状态的 Pod 和守护进程集 Pod)。 Pod 状态可能显示
Pending
、Terminating
或Running
。
诊断电源故障
一旦你确认工作负载在未就绪节点上卡住,下一步将帮助你诊断 Nexus Kubernetes 群集节点是否由于一个或多个裸机的电源故障而未就绪。
若要诊断裸机上的电源故障,请查找以下症状:
要列出运行未就绪 Nexus Kubernetes 群集节点的裸机,请在 Nexus Kubernetes 群集中运行以下
kubectl
命令:kubectl get nodes -o json | jq -r '.items[] | select(.status.conditions[] | select(.type=="Ready") | .status != "True") | [.metadata.name, .metadata.labels["topology.kubernetes.io/baremetalmachine"]] | @tsv' | column -t -s $'\t' -N "Node Name,BMM Name"
此命令返回节点的列表以及运行节点的裸机名称。
要列出群集中已关闭电源的裸机,请在群集受管理资源组级别运行以下命令:
az networkcloud baremetalmachine list \ --subscription <subscription-id> \ --resource-group <managed-resource-group> \ --query "[? powerState == 'Off' && detailedStatus != 'Available'].{BMMName: name, ResourceGroup: resourceGroup, PowerState: powerState, DetailedStatus: detailedStatus}" \ -o table
将
<subscription-id>
替换为订阅 ID,将<managed-resource-group>
替换为裸机资源所在的群集的受管理资源组。例如:
az networkcloud baremetalmachine list \ --subscription 00000000-0000-0000-0000-000000000000 \ --resource-group poc02-19cf0b39e1e5-HostedResources-540F8D4E \ --query "[? powerState == 'Off' && detailedStatus != 'Available'].{BMMName: name, ResourceGroup: resourceGroup, PowerState: powerState, DetailedStatus: detailedStatus}" \ -o table
注意:此屏幕截图未显示订阅 ID,因为已在 Azure CLI 会话中使用
az account set --subscription <subscription-id>
命令设置了它。如果命令没有返回结果,请在几分钟后重新运行该命令。 如果在合理的时间(5-10 分钟)后命令仍然没有返回结果,并且你的工作负载仍然卡住,则问题可能有所不同,请联系客户支持以获取进一步的帮助。
将已关闭电源的裸机名称与未就绪节点正在运行的裸机列表进行核对。 如果未就绪节点正在运行的裸机关闭了电源,则问题是由于电源故障导致的。 现在,可以转到下一部分来解决此问题。
警告
Nexus Kubernetes 群集虚拟机 (VM) 放置
本指南需要从 Nexus Kubernetes 群集中删除节点。 此操作可能会影响 Nexus Kubernetes 群集 VM 机架放置。 要了解更多信息,请参阅 Nexus 平台如何调度 Nexus Kubernetes 群集 VM。
主机路径存储
如果 Pod 配置为在节点上使用主机路径存储,那么删除节点也会删除数据。
解决方案
要将卡住的工作负载移动到 Nexus Kubernetes 群集中的其他节点,需要删除由于电源故障而未就绪的 Nexus Kubernetes 群集节点。 在未就绪节点上卡住的工作负载将重新调度到 Nexus Kubernetes 群集中的其他节点。 此外,如果群集中有足够的容量,将自动创建新节点来替换已删除的节点。
从前面的步骤中,记下运行未就绪节点的已关闭电源的裸机名称。
要删除未就绪的节点,请在 Nexus Kubernetes 群集中对每个已关闭电源的裸机运行以下
kubectl
命令:kubectl delete node -l topology.kubernetes.io/baremetalmachine=<powered-off-baremetal-machine-name>
将
<powered-off-baremetal-machine-name>
替换为之前记下的已关闭电源的裸机名称。例如:
kubectl delete node -l topology.kubernetes.io/baremetalmachine=b37100gipc1co01
删除节点后,之前在未就绪节点上卡住的工作负载应该会重新调度到 Nexus Kubernetes 群集中的其他节点。 对之前记下的所有剩余的已关闭电源的裸机运行前面的
kubectl
命令。