Istio 服務網格附加元件的一般疑難解答
本文討論使用 kubectl
、 istioctl
和其他工具 (的一般策略,) 針對 Microsoft Azure Kubernetes Service (AKS) 的 Istio 服務網格附加元件相關問題進行疑難解答。 本文也提供可能的錯誤訊息清單、發生錯誤的原因,以及解決這些錯誤的建議。
必要條件
Kubernetes kubectl 工具,或連線到叢集的類似工具
注意: 若要使用 Azure CLI 安裝 kubectl,請執行 az aks install-cli 命令。
Istio istioctl 命令行工具
用戶端 URL (cURL) 工具
疑難解答檢查清單:使用 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 要求的 managedCluster ServiceMeshProfile 欄位中,將屬性設定mode 為 Istio 。 |
Invalid istio ingress mode: {} |
在服務網格設定檔中新增輸入時,您為輸入模式設定了無效的值。 | 將 API 要求中的輸入模式設定為 External 或 Internal 。 |
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 |
您嘗試在完成或回復目前的升級作業之前存取修訂和相容性資訊。 | 先完成或復原目前的升級作業 ,再擷取修訂和相容性資訊。 |
參考
如需有關 Istio 偵錯的一般秘訣,請參閱 Istio 診斷工具
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以將產品意見反應提交給 Azure 意應見反社群。