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 或失敗。
步驟 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
注意
您可以使用下列其中一個變體,而不是使用 all
命令的 istioctl proxy-config
variant:
步驟 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 要求中的輸入模式設定為 External 或 Internal 。 |
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 |
您嘗試在完成或回復目前的升級作業之前,先存取修訂和相容性資訊。 | 先完成或復原目前的升級作業 ,再擷取修訂和相容性資訊。 |
參考資料
如需 Istio 偵錯的一般秘訣,請參閱 Istio 診斷工具
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。