對 Kubernetes 計算進行疑難排解
在本文中,您將瞭解如何針對 Kubernetes 計算上的常見工作負載錯誤進行疑難排解。 常見的錯誤包括定型作業和端點錯誤。
推斷指南
Kubernetes 計算上常見的 Kubernetes 端點錯誤分為兩個範圍:計算範圍 和叢集範圍。 計算範圍錯誤與計算目標相關,例如找不到計算目標,或無法存取計算目標。 叢集範圍錯誤與基礎 Kubernetes 叢集相關,例如無法連線到叢集本身,或找不到叢集。
Kubernetes 計算錯誤
以下是計算範圍中常見的錯誤類型,您在使用 Kubernetes 計算來建立在線端點和線上部署以進行即時模型推斷時可能會遇到的錯誤類型。 您可以遵循連結的區段來取得指導方針,以發生問題:
- 錯誤:GenericComputeError
- 錯誤:ComputeNotFound
- 錯誤:ComputeNotAccessible
- 錯誤:InvalidComputeInformation
- 錯誤:InvalidComputeNoKubernetesConfiguration
錯誤:GenericComputeError
錯誤訊息如下:
Failed to get compute information.
當系統無法從 Kubernetes 叢集取得計算資訊時,應該會發生此錯誤。 您可以檢查下列項目以針對問題進行疑難排解:
- 檢查 Kubernetes 叢集狀態。 如果叢集未執行,您必須先啟動叢集。
- 檢查 Kubernetes 叢集健康情況。
- 您可以檢視叢集健康情況檢查報告是否有任何問題,例如,如果無法連線到叢集。
- 您可以移至工作區入口網站來檢查計算狀態。
- 檢查執行個體類型是否正確。 您可以在 Kubernetes 計算文件中檢查支援的執行個體類型。
- 如果適用的話,請嘗試中斷連結並重新附加計算至工作區。
注意
若要透過重新附加來疑難排解錯誤,請保證重新附加時所使用的設定同於先前中斷連結的計算設定,例如相同的計算名稱和命名空間,否則,您可能會遇到其他錯誤。
錯誤:ComputeNotFound
錯誤訊息如下:
Cannot find Kubernetes compute.
當下列情況發生時,應該會發生此錯誤:
- 當建立/更新新的線上端點/部署時,系統找不到計算。
- 已移除現有在線端點/部署的計算。
您可以檢查下列項目以針對問題進行疑難排解:
- 嘗試重新建立端點和部署。
- 嘗試中斷連結並重新附加計算至工作區。 請留意重新附加的更多注意事項。
錯誤:ComputeNotAccessible
錯誤訊息如下:
The Kubernetes compute is not accessible.
工作區 MSI (受控識別) 無法存取 AKS 叢集時,應該會發生此錯誤。 您可以檢查工作區 MSI 是否具有 AKS 的存取權,如果沒有,您可以遵循此文件來管理存取和身分識別。
錯誤:InvalidComputeInformation
錯誤訊息如下:
The compute information is invalid.
將模型部署至 Kubernetes 叢集時,會有計算目標驗證流程。 計算資訊無效時,應該會發生此錯誤。 例如,找不到計算目標,或已在 Kubernetes 叢集中更新 Azure Machine Learning 擴充功能的設定。
您可以檢查下列項目以針對問題進行疑難排解:
- 檢查您使用的計算目標是否正確且存在於工作區中。
- 嘗試中斷連結並重新附加計算至工作區。 請留意重新附加的更多注意事項。
錯誤:InvalidComputeNoKubernetesConfiguration
錯誤訊息如下:
The compute kubeconfig is invalid.
當系統找不到連線到叢集的任何組態時,應該會發生此錯誤,例如:
- 針對 Arc-Kubernetes 叢集,找不到 Azure 轉送設定。
- 針對 AKS 叢集,找不到 AKS 設定。
若要重建叢集中的計算連線設定,您可以嘗試中斷連結並重新連結計算至工作區。 請留意重新附加的更多注意事項。
Kubernetes 叢集錯誤
以下是使用 Kubernetes 計算來建立在線端點和線上部署以進行即時模型推斷時,叢集範圍的錯誤類型清單,您可以遵循指導方針來產生問題:
- 錯誤:GenericClusterError
- 錯誤:ClusterNotReachable
- 錯誤:ClusterNotFound
- 錯誤: ClusterServiceNotFound
- 錯誤: ClusterUnauthorized
錯誤:GenericClusterError
錯誤訊息如下:
Failed to connect to Kubernetes cluster: <message>
當系統因為未知原因而無法連線到 Kubernetes 叢集時,應該會發生此錯誤。 您可以檢查下列項目以針對問題進行疑難排解:
針對 AKS 叢集:
- 檢查 AKS 叢集是否已關閉。
- 如果叢集未執行,您必須先啟動叢集。
- 使用授權的 IP 範圍,檢查 AKS 叢集是否已啟用選取的網路。
- 如果 AKS 叢集已啟用授權的 IP 範圍,請確定已針對 AKS 叢集啟用所有 Azure Machine Learning 控制平面 IP 範圍。 如需詳細資訊,請參閱這份文件。
針對 AKS 叢集或已啟用 Azure Arc 的 Kubernetes 叢集:
- 檢查 Kubernetes API 伺服器是否可透過在叢集中執行
kubectl
命令來存取。
錯誤:ClusterNotReachable
錯誤訊息如下:
The Kubernetes cluster is not reachable.
當系統無法連線到叢集時,應該會發生此錯誤。 您可以檢查下列項目以針對問題進行疑難排解:
針對 AKS 叢集:
- 檢查 AKS 叢集是否已關閉。
- 如果叢集未執行,您必須先啟動叢集。
針對 AKS 叢集或已啟用 Azure Arc 的 Kubernetes 叢集:
- 檢查 Kubernetes API 伺服器是否可透過在叢集中執行
kubectl
命令來存取。
錯誤:ClusterNotFound
錯誤訊息如下:
Cannot found Kubernetes cluster.
當系統找不到 AKS/Arc-Kubernetes 叢集時,應該會發生此錯誤。
您可以檢查下列項目以針對問題進行疑難排解:
- 首先,檢查 Azure 入口網站中的叢集資源識別碼,以確認 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 key ok」,而不會提示您輸入密碼。
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)。
然後,您可以取得重試作業節點對應資訊,以找出重試作業執行所在的節點。
您可以從 [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 Machine Learning 擴充功能不支援輸入資料的下載模式。
若要解決此問題,請變更為輸入資料的掛接模式。
常見的作業失敗錯誤
以下是使用 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}]}
檢查您的 Proxy 設定,並檢查在使用 az connectedk8s connect
時是否已將 127.0.0.1 新增至 proxy-skip-range,方法是遵循此網路設定。
工作失敗。 E45004
如果錯誤訊息為:
Azure Machine Learning Kubernetes job failed. E45004:"Training feature is not enabled, please enable it when install the extension."
檢查您是否已在執行 Azure Machine Learning 擴充功能安裝時設定 enableTraining=True
。 如需詳細資訊,請參閱在 AKS 或 Arc Kubernetes 叢集上部署 Azure Machine Learning 擴充功能
工作失敗。 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}
您可以遵循 Private Link 疑難排解一節來檢查您的網路設定。
授予帳戶金鑰或 SAS 權杖
如果您需要存取適用於 Docker 映像的 Azure Container Registry (ACR),以及存取記憶體帳戶以取得定型資料,則未使用受控識別指定計算時,應該會發生此問題。
若要從適用於 Docker 映像的 Kubernetes 計算叢集存取 Azure Container Registry (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 入口網站中尋找工作區識別碼,或在命令行中執行
az ml workspace show
來取得此識別碼。顯示由
kubectl get po -n azureml -l azuremlappname=azureml-fe
執行的所有 azureml-fe Pod。登入其中任何一個會執行
kubectl exec -it -n azureml {scorin_fe_pod_name} bash
。如果叢集不使用 Proxy,請執行
nslookup {workspace_id}.workspace.{region}.api.azureml.ms
。 如果您已正確設定從 VNet 到工作區的私人連結,則 VNet 中的內部 IP 應該透過 DNSLookup 工具回應。如果叢集使用 Proxy,您可以嘗試
curl
工作區
curl https://{workspace_id}.workspace.westcentralus.api.azureml.ms/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
使用私人連結正確設定 Proxy 和工作區時,您應該會看到嘗試連線到內部 IP。 如果未提供權杖,此案例中預期會有 HTTP 401 狀態程式碼的回應。
其他已知問題
Kubernetes 計算更新不會生效
此時,CLI v2 和 SDK v2 不允許更新現有 Kubernetes 計算的任何設定。 例如,變更命名空間不會生效。
工作區或資源群組名稱結尾為 '-'
在 Kubernetes 計算中建立部署、端點或作業等工作負載時,"InternalServerError" 失敗的常見原因,是工作區或資源群組名稱結尾有類似 '-' 的特殊字元。