排查 Kubernetes 计算问题

在本文中,你将了解如何排查 Kubernetes 计算中的常见工作负载错误。 常见错误包括训练作业和终结点错误。

推理指南

Kubernetes 计算上的常见 Kubernetes 终结点错误分为两个范围:计算范围群集范围。 计算范围错误与计算目标相关,例如找不到计算目标或无法访问计算目标。 群集范围错误与基础 Kubernetes 群集相关,例如无法访问群集本身或找不到群集。

Kubernetes 计算错误

在使用 Kubernetes 计算创建联机终结点和联机部署以进行实时模型推理时,你可能会遇到以下计算范围内的常见错误类型。 可以按照链接部分操作以获取指南来排查问题:

ERROR: GenericComputeError

错误消息如下所示:

Failed to get compute information.

当系统未能从 Kubernetes 群集获取计算信息时,应会发生此错误。 可检查以下各项来排查问题:

  • 检查 Kubernetes 群集状态。 如果群集未运行,则需要先启动群集。
  • 检查 Kubernetes 群集运行状况。
    • 可查看群集运行状况检查报告是否存在任何问题,例如,群集是否不可访问。
    • 可转到工作区门户来检查计算状态。
  • 检查实例类型信息是否正确。 可在 Kubernetes 计算文档中查看支持的实例类型。
  • 如果适用,请尝试分离计算并将其重新附加到工作区。

注意

若要通过重新附加来排查错误,请保证重新附加时使用与以前拆离的计算完全相同的配置(例如相同的计算名称和命名空间),否则可能会遇到其他错误。

ERROR: ComputeNotFound

错误消息如下所示:

Cannot find Kubernetes compute.

以下情况应会发生此错误:

  • 创建/更新新的联机终结点/部署时,系统找不到计算。
  • 已删除对现有联机终结点/部署的计算。

可检查以下各项来排查问题:

  • 尝试重新创建终结点和部署。
  • 尝试分离计算并将其重新附加到工作区。 请注意有关重新附加的更多注释。

ERROR: ComputeNotAccessible

错误消息如下所示:

The Kubernetes compute is not accessible.

当工作区 MSI(托管标识)无权访问 AKS 群集时,应会发生此错误。 可检查工作区 MSI 是否有权访问 AKS,如果没有,可按照此文档来管理访问和标识。

错误:InvalidComputeInformation

错误消息如下所示:

The compute information is invalid.

将模型部署到 Kubernetes 群集时,存在计算目标验证过程。 当计算信息无效时,会发生此错误。 例如,没有找到计算目标,或者在 Kubernetes 群集中更新了 Azure 机器学习扩展的配置。

可检查以下各项来排查问题:

  • 检查所使用的计算目标是否正确且存在于工作区中。
  • 尝试分离计算并将其重新附加到工作区。 请注意有关重新附加的更多注释。

错误:InvalidComputeNoKubernetesConfiguration

错误消息如下所示:

The compute kubeconfig is invalid.

当系统找不到要连接到群集的任何配置时,应会发生此错误,例如:

  • 对于 Arc-Kubernetes 群集,找不到任何 Azure 中继配置。
  • 对于 AKS 群集,找不到任何 AKS 配置。

若要在群集中重新生成计算连接配置,可以尝试拆离计算并将其重新附加到工作区。 请注意有关重新附加的更多注释。

Kubernetes 群集错误

下面是属于群集范围的错误类型列表,使用 Kubernetes 计算创建联机终结点和联机部署进行实时模型推理时可能遇到的这些错误类型,可按照以下准则进行故障排除:

ERROR: GenericClusterError

错误消息如下所示:

Failed to connect to Kubernetes cluster: <message>

当系统由于未知原因无法连接到 Kubernetes 群集时,应会发生此错误。 可检查以下各项来排查问题:

对于 AKS 群集:

  • 检查 AKS 群集是否已关闭。
    • 如果群集未运行,则需要先启动群集。
  • 使用授权的 IP 范围检查 AKS 群集是否启用了所选网络。
    • 如果 AKS 群集已启用授权 IP 范围,请确保已为 AKS 群集启用所有“Azure 机器学习控制平面 IP 范围”。 有关详细信息,请参阅此文档

对于 AKS 群集或已启用 Azure Arc 的 Kubernetes 群集:

  • 检查是否可通过在群集中运行 kubectl 命令来访问 Kubernetes API 服务器。

ERROR: ClusterNotReachable

错误消息如下所示:

The Kubernetes cluster is not reachable. 

当系统无法连接到群集时,应会发生此错误。 可检查以下各项来排查问题:

对于 AKS 群集:

  • 检查 AKS 群集是否已关闭。
    • 如果群集未运行,则需要先启动群集。

对于 AKS 群集或已启用 Azure Arc 的 Kubernetes 群集:

  • 检查是否可通过在群集中运行 kubectl 命令来访问 Kubernetes API 服务器。

错误:ClusterNotFound

错误消息如下所示:

Cannot found Kubernetes cluster. 

当系统找不到 AKS/Arc-Kubernetes 群集时,应会发生此错误。

可检查以下各项来排查问题:

  • 首先,检查 Azure 门户中的群集资源 ID,以验证 Kubernetes 群集资源是否仍然存在且在正常运行。
  • 如果群集存在且正在运行,则可以尝试拆离计算并将其重新附加到工作区。 请注意有关重新附加的更多注释。

错误:ClusterServiceNotFound

错误消息如下所示:

AzureML extension service not found in cluster.

当扩展拥有的入口服务没有足够的后端 Pod 时,就会发生此错误。

您可以:

  • 访问群集并检查 azureml 命名空间下服务 azureml-ingress-nginx-controller 及其后端 Pod 的状态。
  • 如果群集没有任何正在运行的后端 Pod,请通过描述 Pod 来检查原因。 例如,如果 Pod 没有足够的资源来运行,可以删除一些 Pod,为入口 Pod 释放足够的资源。

错误:ClusterUnauthorized

错误消息如下所示:

Request to Kubernetes cluster unauthorized.

此错误只会发生在已启用 TA 的群集中,意味着访问令牌在部署期间已过期。

可以在几分钟后重试。

提示

有关创建/更新 Kubernetes 联机终结点和部署时的常见错误的更多故障排除指南,请参阅如何排查联机终结点问题

标识错误

ERROR: RefreshExtensionIdentityNotSet

安装扩展但未正确分配扩展标识时,会发生此错误。 可以尝试重新安装扩展以修复它。

请注意,此错误仅适用于托管群集

如何检查 sslCertPemFile 和 sslKeyPemFile 是否正确?

为了能够发现任何已知错误,可以使用命令运行证书和密钥的基线检查。 预计第二个命令会返回“RSA 密钥正常”,而不提示输入密码。

openssl x509 -in cert.pem -noout -text
openssl rsa -in key.pem -noout -check

运行命令以验证 sslCertPemFile 和 sslKeyPemFile 是否匹配:

openssl x509 -in cert.pem -noout -modulus | md5sum
openssl rsa -in key.pem -noout -modulus | md5sum

对于 sslCertPemFile,它是公共证书。 它应包含包括以下证书在内的证书链,并且应按服务器证书、中间 CA 证书和根 CA 证书的顺序进行排列:

  • 服务器证书:服务器在 TLS 握手期间向客户端展示。 它包含服务器的公钥、域名和其他信息。 服务器证书由为服务器的身份作担保的中间证书颁发机构 (CA) 签名。
  • 中间 CA 证书:中间 CA 向客户端展示以证明其有权为服务器证书签名。 它包含中间 CA 的公钥、名称和其他信息。 中间 CA 证书由为中间 CA 的身份作担保的根 CA 签名。
  • 根 CA 证书:根 CA 向客户端展示以证明其有权为中间 CA 证书签名。 它包含根 CA 的公钥、名称和其他信息。 根 CA 证书是自签名的,并且被客户端信任。

培训指南

训练作业运行时,可以在工作区门户中检查作业状态。 如遇到某些异常作业状态,例如作业多次重试,或者作业一直处于初始化状态,甚至作业最终失败,可以按照以下指南对问题进行故障排除。

作业重试调试

如果群集中运行的训练作业 Pod 由于节点运行到节点 OOM(内存不足)而终止,则作业将“自动重试”到另一个可用节点。

若要进一步调试作业尝试的根本原因,可以转到工作区门户查看作业重试日志。

  • 每个重试日志都记录在新的日志文件夹中,格式为“retry-<retry number>”(例如:retry-001)。

然后,可以获取重试作业节点映射信息,以确定重试作业在哪个节点上运行。

从 Azure 门户向已启用 Azure Arc 的 Kubernetes 群集添加新扩展的屏幕截图。

可以从 system_logs 文件夹下的 amlarc_cr_bootstrap.log 获取作业节点映射信息。

将在此日志中显示运行作业 Pod 的节点主机名,例如:

++ echo 'Run on node: ask-agentpool-17631869-vmss0000"

“ask-agentpool-17631869-vmss0000”表示在 AKS 群集中运行此作业的节点主机名。 然后,可以访问群集来检查节点状态,以便进一步调查。

作业 Pod 停滞在 Init 状态

如果作业的运行时间超过预期,并且发现作业 Pod 停滞在 Init 状态并出现此警告“Unable to attach or mount volumes: *** failed to get plugin from volumeSpec for volume ***-blobfuse-*** err=no volume plugin matched”,则可能会出现此问题,因为 Azure 机器学习扩展不支持输入数据的下载模式。

若要解决此问题,请更改为输入数据的装载模式。

常见作业失败错误

以下是你在使用 Kubernetes 计算来创建和执行训练作业时可能遇到的常见错误类型的列表,可以按照以下指南进行故障排除:

作业失败。 137

如果错误消息为:

Azure Machine Learning Kubernetes job failed. 137:PodPattern matched: {"containers":[{"name":"training-identity-sidecar","message":"Updating certificates in /etc/ssl/certs...\n1 added, 0 removed; done.\nRunning hooks in /etc/ca-certificates/update.d...\ndone.\n * Serving Flask app 'msi-endpoint-server' (lazy loading)\n * Environment: production\n   WARNING: This is a development server. Do not use it in a production deployment.\n   Use a production WSGI server instead.\n * Debug mode: off\n * Running on http://127.0.0.1:12342/ (Press CTRL+C to quit)\n","code":137}]}

检查代理设置,并检查 127.0.0.1 是否在使用 az connectedk8s connect 遵循此网络配置 时,已添加到 proxy-skip-range。

作业失败。 E45004

如果错误消息为:

Azure Machine Learning Kubernetes job failed. E45004:"Training feature is not enabled, please enable it when install the extension."

在安装 Azure 机器学习扩展时,请检查是否已设置 enableTraining=True。 有关详细信息,请参阅在 AKS 或 Arc Kubernetes 群集上部署 Azure 机器学习扩展

作业失败。 400

如果错误消息为:

Azure Machine Learning Kubernetes job failed. 400:{"Msg":"Encountered an error when attempting to connect to the Azure Machine Learning token service","Code":400}

可以按照专用链接故障排除部分检查网络设置。

提供帐户密钥或 SAS 令牌

如果需要访问用于 Docker 映像的 Azure 容器注册表 (ACR),以及访问用于训练数据的存储帐户,则当未使用托管标识指定计算时,应会出现此问题。

若要从 Docker 映像的 Kubernetes 计算群集访问 Azure 容器注册表 (ACR),或访问用于训练数据的存储帐户,需要附加已启用系统分配或用户分配的托管标识的 Kubernetes 计算。

在上述训练方案中,此计算标识是 Kubernetes 计算用作凭据以在绑定到工作区的 ARM 资源与 Kubernetes 计算群集之间进行通信所必需的。 因此,如果没有此标识,训练作业失败并报告缺少帐户密钥或 sas 令牌。 以访问存储帐户为例,如果没有为 Kubernetes 计算指定托管标识,作业失败并显示以下错误消息:

Unable to mount data store workspaceblobstore. Give either an account key or SAS token

这是因为 Kubernetes 计算中的训练作业无法访问没有任何凭据的机器学习工作区默认存储帐户。

若要缓解此问题,可以在计算附加步骤中将托管标识分配给计算,也可以在附加托管标识后将其分配给计算。 有关详细信息,请参阅将托管标识分配给计算目标

AzureBlob 授权失败

如果需要访问 AzureBlob 以在 Kubernetes 计算上的训练作业中上传或下载数据,则作业会失败并显示以下错误消息:

Unable to upload project files to working directory in AzureBlob because the authorization failed. 

这是因为当作业尝试上传项目文件到 AzureBlob 时授权失败。 可检查以下各项来排查问题:

  • 确保存储帐户已启用“允许受信任服务列表中的 Azure 服务访问此存储帐户”的例外,并且工作区位于资源实例列表中。
  • 确保工作区具有系统分配的托管标识。

我们可以使用以下方法来检查专用链接设置,方法是登录到 Kubernetes 群集中的一个 Pod,然后检查相关的网络设置。

  • 在 Azure 门户中找到工作区 ID,或通过在命令行中运行 az ml workspace show 来获取此 ID。

  • 通过 kubectl get po -n azureml -l azuremlappname=azureml-fe 显示所有 azureml-fe pod 运行。

  • 登录到其中任何一个以运行 kubectl exec -it -n azureml {scorin_fe_pod_name} bash

  • 如果群集不使用代理,请运行 nslookup {workspace_id}.workspace.{region}.api.ml.azure.cn。 如果正确设置了从 VNet 到工作区的专用链接,则应通过 DNSLookup 工具响应 VNet 中的内部 IP。

  • 如果群集使用代理,可以尝试 curl 工作区

curl https://{workspace_id}.workspace.chinaeast2.api.ml.azure.cn/metric/v2.0/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.MachineLearningServices/workspaces/{workspace_name}/api/2.0/prometheus/post -X POST -x {proxy_address} -d {} -v -k

使用专用链接正确设置代理和工作区时,会观察到尝试连接到内部 IP 的情况。 如果未提供令牌,则此情况下预期将返回包含 HTTP 401 状态代码的响应。

其他已知问题

Kubernetes 计算更新未生效

目前,CLI v2 和 SDK v2 不允许更新现有 Kubernetes 计算的任何配置。 例如,更改命名空间将不会生效。

工作区或资源组名称以“-”结尾

在 Kubernetes 计算中创建工作负载(例如部署、终结点或作业)时,“InternalServerError”失败的一个常见原因是工作区或资源组名称的末尾有特殊字符,如“-”。

后续步骤