Istio 服務網格附加元件的一般疑難解答

本文討論使用 kubectlistioctl和其他工具 (的一般策略,) 針對 Microsoft Azure Kubernetes Service (AKS) 的 Istio 服務網格附加元件相關問題進行疑難解答。 本文也提供可能的錯誤訊息清單、發生錯誤的原因,以及解決這些錯誤的建議。

必要條件

疑難解答檢查清單:使用 kubectl

下列疑難解答步驟會使用各種 kubectl 命令來協助您偵錯 Istio 精靈中停滯的 Pod 或失敗 (Istiod) 。

步驟 1:取得 Istiod Pod 記錄

執行下列 kubectl logs 命令來取得 Istiod Pod 記錄:

kubectl logs --selector app=istiod --namespace aks-istio-system

步驟 2: (刪除 Pod) 退回

您可能有很好的理由重新啟動 Pod。 因為 Istiod 是部署,所以只要執行 kubectl delete 命令即可安全地刪除 Pod:

kubectl delete pods <istio-pod> --namespace aks-istio-system

Istio Pod 是由部署所管理,因此 Pod 會在您直接刪除 Istio Pod 之後自動重新建立和重新部署。 因此,刪除 Pod 是重新啟動 Pod 的替代方法。

注意事項

或者,您可以執行下列 kubectl rollout restart 命令,直接重新啟動部署:

kubectl rollout restart deployment <istiod-asm-revision> --namespace aks-istio-system

步驟 3:檢查資源的狀態

如果未排程 Istiod,或 Pod 沒有回應,您可能會想要檢查部署和複本集的狀態。 若要這樣做,請執行 kubectl get 命令:

kubectl get <resource-type> [[--selector app=istiod] | [<resource-name>]]

目前的資源狀態會出現在輸出結尾附近。 輸出也可能顯示與其控制器循環相關聯的事件。

步驟 4:取得自訂資源定義類型

若要 (Istio 使用的 CRD) 檢視自訂資源定義的類型,請執行 kubectl get 命令:

kubectl get crd | grep istio

接下來,執行下列 kubectl get 命令以列出以特定 CRD 為基礎的所有資源名稱:

kubectl get <crd-type> --all-namespaces

步驟 5:檢視 Istiod Pod 的清單

執行下列 kubectl get 命令來檢視 Istiod Pod 的清單:

kubectl get pod --namespace aks-istio-system --output yaml

步驟 6:取得 Envoy 設定的詳細資訊

如果您有 Pod 之間的連線問題,請針對 Envoy 的系統管理埠執行下列 kubectl exec 命令,以取得 Envoy 設定的詳細資訊:

kubectl exec --namespace <pod-namespace> \
    "$(kubectl get pods \
        --namespace <pod-namespace> \
        --selector app=sleep \
        --output jsonpath='{.items[0].metadata.name}')" \
    --container sleep \
-- curl -s localhost:15000/clusters

步驟 7:取得來源和目的地側車的側車記錄

在來源 Pod 的第一次 (執行下列 kubectl logs 命令,以擷取來源和目的地側車的側車記錄,第二次執行目的地 Pod) :

kubectl logs <pod-name> --namespace <pod-namespace> --container istio-proxy

疑難解答檢查清單:使用 istioctl

下列疑難解答步驟說明如何藉由執行各種 istioctl 命令來收集資訊及偵錯網格環境。

警告

某些 istioctl 命令會將要求傳送至所有側車。

注意事項

開始之前,請注意,大部分 istioctl 的命令都需要您知道控制平面修訂。 您可以從 Istiod 部署或 Pod 的後綴取得這項資訊,也可以執行下列 istioctl 標記清單 命令:

istioctl tag list

步驟 1:確定已正確安裝 Istio

若要確認您有正確的 Istio 附加元件安裝,請執行下列 istioctl verify-install 命令:

istioctl verify-install --istioNamespace aks-istio-system --revision <tag>

步驟 2:分析命名空間

若要分析所有命名空間,或分析特定命名空間,請執行下列 istioctl analyze 命令:

istioctl analyze --istioNamespace aks-istio-system \
    --revision <tag> \
    [--all-namespaces | --namespace <namespace-name>] \
    [--failure-threshold {Info | Warning | Error}]

步驟 3:取得 Proxy 狀態

若要擷取 Proxy 狀態,請執行下列 istioctl proxy-status 命令:

istioctl proxy-status pod/<pod-name> \
    --istioNamespace aks-istio-system \
    --revision <tag> \
    --namespace <pod-namespace>

步驟 4:下載 Proxy 設定

若要下載 Proxy 組態,請執行下列 istioctl proxy-config all 命令:

istioctl proxy-config all <pod-name> \
    --istioNamespace aks-istio-system \
    --namespace <pod-namespace> \
    --output json

注意事項

您可以使用下列其中一個變體,而不是使用 all 命令的 istioctl proxy-config 變體:

步驟 5:檢查插入狀態

若要檢查資源的插入狀態,請執行下列 istioctl 實驗性 check-inject 命令:

istioctl experimental check-inject --istioNamespace aks-istio-system \
    --namespace <pod-namespace> \
    --labels <label-selector> | <pod-name> | deployment/<deployment-name>

步驟 6:取得完整的 Bug 報告

完整的 Bug 報告包含最詳細的資訊。 不過,它在大型叢集上也可能很耗時,因為它包含所有 Pod。 您可以將 Bug 報告限制為特定命名空間。 您也可以將報表限制為特定部署、Pod 或標籤選取器。

若要擷取 Bug 報告,請執行下列 istioctl Bug-report 命令:

istioctl bug-report --istioNamespace aks-istio-system \
    [--include <namespace-1>[, <namespace-2>[, ...]]]

疑難解答檢查清單:其他問題

步驟 1:修正資源使用量問題

如果您在 Envoy 中遇到高記憶體耗用量,請仔細檢查 Envoy 設定以取得 統計數據收集。 如果您要透過 MeshConfig自訂 Istio 計量,請記住,某些計量可以具有高基數,因此會建立較高的記憶體使用量。 MeshConfig 中的其他字段,例如並行,會影響 CPU 使用量,並應謹慎設定。

根據預設,Istio 會將叢集中所有服務的相關信息新增至每個 Envoy 設定。 Sidecar 可以將此新增的範圍限特定命名空間內的工作負載。 如需詳細資訊,請 參閱注意此 Istio Proxy 側車記憶體陷阱

例如,命名空間中的aks-istio-system下列Sidecar定義會將網格aks-istio-system中所有 Proxy 的 Envoy 設定限制為 與該特定應用程式相同命名空間內的其他工作負載。

apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: sidecar-restrict-egress
  namespace: aks-istio-system  # Needs to be deployed in the root namespace.
spec:
  egress:
  - hosts:
    - "./*"
    - "aks-istio-system/*"

您也可以嘗試在 MeshConfig 中使用 Istio discoverySelectors 選項。 選項 discoverySelectors 包含 Kubernetes 選取器的數位,而且可以將 Istiod 的認知限制為特定命名空間 (,而不是叢集) 中的所有命名空間。 如需詳細資訊,請 參閱使用探索選取器來設定 Istio 服務網格的命名空間

步驟 2:修正流量和安全性設定錯誤的問題

若要解決 Istio 使用者經常遇到的常見流量管理和安全性設定錯誤問題,請參閱 Istio 網站上的流量管理問題和安全性問題

如需其他問題的討論連結,例如側車插入、可觀察性和升級,請參閱 Istio 文件網站上的 常見問題

步驟 3:避免 CoreDNS 多載

與 CoreDNS 多載相關的問題可能需要您變更某些 Istio DNS 設定,例如 dnsRefreshRate Istio MeshConfig 定義中的 字段。

步驟 4:修正 Pod 和側車競爭條件

如果您的應用程式 Pod 在 Envoy 側車啟動之前啟動,應用程式可能會沒有回應,或是可能會重新啟動。 如需如何避免這個問題的指示,請參閱 如果 istio-proxy 尚未就緒,Pod 或容器會從網路問題開始。 具體而言,將 下方的 holdApplicationUntilProxyStarts MeshConfig 欄位 defaultConfig 設定為 true ,有助於防止這些競爭狀況。

錯誤訊息

下表包含 (部署附加元件、啟用輸入閘道,以及執行升級) 、發生錯誤的原因,以及解決錯誤的建議之可能錯誤訊息清單。

錯誤 原因 建議
Azure service mesh is not supported in this region 在預覽期間,區域中無法使用此功能 (可在公用雲端中使用,但主權雲端) 則無法使用。 請參閱有關支援區域功能的公開檔。
Missing service mesh mode: {} 您未在受控叢集要求的服務網格設定檔中設定mode屬性。 在 API 要求的 managedClusterServiceMeshProfile 欄位中,將屬性設定modeIstio
Invalid istio ingress mode: {} 在服務網格設定檔中新增輸入時,您為輸入模式設定了無效的值。 將 API 要求中的輸入模式設定為 ExternalInternal
Too many ingresses for type: {}. Only {} ingress gateway are allowed 您嘗試在叢集上建立太多輸入。 Create 叢集上最多一個外部輸入和一個內部輸入。
Istio profile is missing even though Service Mesh mode is Istio 您已啟用 Istio 附加元件,但不提供 Istio 配置檔。 當您啟用 Istio 附加元件時,請指定元件特定 (輸入閘道、外掛程式 CA) Istio 設定檔和特定修訂的資訊。
Istio based Azure service mesh is incompatible with feature %s 您嘗試使用另一個目前與 Istio 附加元件不相容的擴充功能、附加元件或功能 (例如 Open Service Mesh) 。 啟用 Istio 附加元件之前,請先停用其他功能並清除所有對應的資源。
ServiceMeshProfile is missing required parameters: %s for plugin certificate authority 您未提供外掛程式 CA 的所有必要參數。 如需詳細資訊,請提供外掛程式證書頒發機構單位 (CA) 功能 (的所有必要參數,請參閱 使用外掛程式 CA 憑證) 設定以 Istio 為基礎的服務網格附加 元件。
AzureKeyvaultSecretsProvider addon is required for Azure Service Mesh plugin certificate authority feature 在使用外掛程式 CA 之前,您未啟用 AKS Secrets-Store CSI 驅動程式附加元件。 使用外掛程式 CA 功能之前,請先設定 Azure 金鑰保存庫。
'KeyVaultId': '%s' is not a valid Azure keyvault resource identifier. Please make sure that the format matches '/subscriptions//resourceGroups//providers/Microsoft.KeyVault/vaults/' 您使用了無效的 AKS 資源識別碼。 請參閱錯誤訊息中所述的格式,以設定外掛程式 CA 功能的有效 Azure 金鑰保存庫 識別碼。
Kubernetes version is missing in orchestrator profile 您的要求遺失 Kubernetes 版本。 因此,它無法執行版本相容性檢查。 請確定您在 Istio 附加元件升級作業中提供 Kubernetes 版本。
Service mesh revision %s is not compatible with cluster version %s. To find information about mesh-cluster compatibility, use 'az aks mesh get-upgrades' 您嘗試啟用與目前 Kubernetes 叢集版本不相容的 Istio 附加元件修訂。 使用 az aks mesh get-upgrades Azure CLI 命令來瞭解哪些 Istio 附加元件修訂適用於目前的叢集。
Kubernetes version %s not supported. Please upgrade to a supported cluster version first. To find compatibility information, use 'az aks mesh get-upgrades' 您使用的是不支援的 Kubernetes 版本。 升級至支援的 Kubernetes 版本
ServiceMeshProfile revision field must not be empty 您嘗試升級 Istio 附加元件,但未指定修訂。 如需詳細資訊,請 (指定修訂和所有其他參數,請參閱 次要修訂升級) 。
Request exceeds maximum allowed number of revisions (%d) 即使已安裝修訂,您仍 (%d) 嘗試執行升級作業。 在升級至另一個修訂之前,請先完成或復原升級作業
Mesh upgrade is in progress. Please complete or roll back the current upgrade before attempting to retrieve versioning and compatibility information 您嘗試在完成或回復目前的升級作業之前存取修訂和相容性資訊。 先完成或復原目前的升級作業 ,再擷取修訂和相容性資訊。

參考

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以將產品意見反應提交給 Azure 意應見反社群