共用方式為


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

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

必要條件

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

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

步驟 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 是重新啟動 Pod 的替代方法。

注意

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

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 所使用的自訂資源定義類型,請執行 kubectl get 命令:

kubectl get crd | grep istio

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

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

步驟 5:檢視 Istiod Pod 清單

若要檢視 Istiod Pod 清單,請執行下列 kubectl get 命令:

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:取得來源和目的地側車的側車記錄

執行下列 kubectl logs 命令兩次來擷取來源和目的地 Sidecars 的 Sidecar 記錄(來源 Pod 第一次,第二次用於目的地 Pod):

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

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

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

所有 istioctl 命令都必須與 --istioNamespace aks-istio-system 旗標一起執行,以指向 Istio 的 AKS 附加元件安裝。

警告

某些 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

步驟 5:檢查插入狀態

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

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

步驟 6:取得完整的錯誤報告

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

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

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

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

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

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

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

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

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 側車啟動之前啟動,應用程式可能會變得沒有回應,或可能會重新啟動。 如需如何避免此問題的指示,請參閱 Pod 或容器從網路問題開始,如果 istio-proxy 尚未就緒。 具體來說,將 holdApplicationUntilProxyStarts [MeshConfig] 字段 defaultConfig 設定為 , true 有助於防止這些競爭條件。

步驟 5:針對輸出流量使用 HTTP Proxy 時設定服務專案

如果您的叢集使用 HTTP Proxy 進行輸出因特網存取,則必須設定服務專案。 如需詳細資訊,請參閱Azure Kubernetes 服務中的 HTTP Proxy 支援

錯誤訊息

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

錯誤 原因 建議
Azure service mesh is not supported in this region 此功能在預覽期間無法在區域中使用(可在公用雲端中使用,但不適用於主權雲端)。 請參閱有關所支持區域功能的公開檔。
Missing service mesh mode: {} 您未在受控叢集要求的服務網格設定檔中設定mode屬性。 API 要求的 ServiceMeshProfile 欄位中 managedCluster ,將 mode 屬性設定為 Istio
Invalid istio ingress mode: {} 您在服務網格設定檔中新增輸入時,為輸入模式設定了無效的值。 將 API 要求中的輸入模式設定為 ExternalInternal
Too many ingresses for type: {}. Only {} ingress gateway are allowed 您嘗試在叢集上建立太多輸入。 在叢集上最多建立一個外部輸入和一個內部輸入。
Istio profile is missing even though Service Mesh mode is Istio 您未提供 Istio 設定檔,即可啟用 Istio 附加元件。 當您啟用 Istio 附加元件時,請指定 Istio 配置檔和特定修訂的元件特定(輸入閘道、外掛程式 CA)資訊。
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 秘密存放區 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 意見反應社群提交產品意見反應。