使用 Istioctl Analyze 診斷您的組態
istioctl analyze
是一個診斷工具,可以偵測 Istio 設定中潛在的問題。它可以針對即時叢集或一組本機設定檔執行。它也可以針對兩者的組合執行,讓您在將變更套用至叢集之前就能發現問題。
一分鐘內開始使用
您可以透過執行以下指令來分析您目前的即時 Kubernetes 叢集:
$ istioctl analyze --all-namespaces
就是這樣!它會提供任何適用的建議。
例如,如果您忘記啟用 Istio 注入(一個非常常見的問題),您會收到以下「資訊」訊息:
Info [IST0102] (Namespace default) The namespace is not enabled for Istio injection. Run 'kubectl label namespace default istio-injection=enabled' to enable it, or 'kubectl label namespace default istio-injection=disabled' to explicitly mark it as not needing injection.
修正問題
$ kubectl label namespace default istio-injection=enabled
然後再試一次
$ istioctl analyze --namespace default
✔ No validation issues found when analyzing namespace: default.
分析即時叢集、本機檔案或兩者
分析目前的即時叢集,模擬在 samples/bookinfo/networking
目錄中套用額外 yaml 檔案(如 bookinfo-gateway.yaml
和 destination-rule-all.yaml
)的效果
$ istioctl analyze @samples/bookinfo/networking/bookinfo-gateway.yaml@ @samples/bookinfo/networking/destination-rule-all.yaml@
Error [IST0101] (Gateway default/bookinfo-gateway samples/bookinfo/networking/bookinfo-gateway.yaml:9) Referenced selector not found: "istio=ingressgateway"
Error [IST0101] (VirtualService default/bookinfo samples/bookinfo/networking/bookinfo-gateway.yaml:41) Referenced host not found: "productpage"
Error: Analyzers found issues when analyzing namespace: default.
See https://istio.dev.org.tw/v1.24/docs/reference/config/analysis for more information about causes and resolutions.
分析整個 networking
資料夾
$ istioctl analyze samples/bookinfo/networking/
分析 networking
資料夾中的所有 yaml 檔案
$ istioctl analyze samples/bookinfo/networking/*.yaml
上面的範例是對即時叢集進行分析。該工具也支援對一組本機 Kubernetes yaml 設定檔,或本機檔案和即時叢集的組合進行分析。當分析一組本機檔案時,檔案集應該是完全自包含的。通常,這用於分析打算部署到叢集的整組設定檔。若要使用此功能,只需新增 --use-kube=false
標誌即可。
分析 networking
資料夾中的所有 yaml 檔案
$ istioctl analyze --use-kube=false samples/bookinfo/networking/*.yaml
您可以執行 istioctl analyze --help
以查看完整選項集。
進階
啟用資源狀態的驗證訊息
從 v1.5 開始,可以透過 istiod.enableAnalysis
標誌設定 Istio,使其在主要負責的設定發佈的同時執行設定分析。此分析使用與使用 istioctl analyze
時相同的邏輯和錯誤訊息。分析產生的驗證訊息會寫入受影響 Istio 資源的狀態子資源。
例如,如果您在「ratings」虛擬服務上有一個設定錯誤的閘道,執行 kubectl get virtualservice ratings
會得到類似以下的結果:
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
gateways:
- bogus-gateway
hosts:
- ratings
...
status:
observedGeneration: "1"
validationMessages:
- documentationUrl: https://istio.dev.org.tw/v1.24/docs/reference/config/analysis/ist0101/
level: ERROR
type:
code: IST0101
enableAnalysis
在背景執行,並會保持資源的狀態欄位與其目前的驗證狀態同步。請注意,這不是 istioctl analyze
的替代方案
- 並非所有資源都有自訂狀態欄位(例如 Kubernetes
namespace
資源),因此附加到這些資源的訊息不會顯示驗證訊息。 enableAnalysis
僅適用於 1.5 或更新版本的 Istio,而istioctl analyze
可以與較舊版本搭配使用。- 雖然它很容易看到特定資源的問題,但很難全面了解網格中的驗證狀態。
您可以使用以下指令啟用此功能:
$ istioctl install --set values.global.istiod.enableAnalysis=true
透過 CLI 忽略特定的分析器訊息
有時,您可能會發現隱藏或忽略某些情況下的分析器訊息很有用。例如,假設有一種情況,其中發出了一條關於您沒有權限更新的資源的訊息
$ istioctl analyze -k --namespace frod
Info [IST0102] (Namespace frod) The namespace is not enabled for Istio injection. Run 'kubectl label namespace frod istio-injection=enabled' to enable it, or 'kubectl label namespace frod istio-injection=disabled' to explicitly mark it as not needing injection.
因為您沒有更新命名空間的權限,所以您無法透過註解命名空間來解決該訊息。相反,您可以指示 istioctl analyze
抑制資源上的上述訊息
$ istioctl analyze -k --namespace frod --suppress "IST0102=Namespace frod"
✔ No validation issues found when analyzing namespace: frod.
抑制所使用的語法與 istioctl
中引用資源時使用的語法相同:<kind> <name>.<namespace>
,或者對於叢集範圍的資源(如 Namespace
)僅使用 <kind> <name>
。如果要抑制多個物件,您可以重複 --suppress
引數,或使用萬用字元
$ # Suppress code IST0102 on namespace frod and IST0107 on all pods in namespace baz
$ istioctl analyze -k --all-namespaces --suppress "IST0102=Namespace frod" --suppress "IST0107=Pod *.baz"
透過註解忽略特定的分析器訊息
您也可以使用資源上的註解來忽略特定的分析器訊息。例如,若要忽略資源 deployment/my-deployment
上的程式碼 IST0107 (MisplacedAnnotation
)
$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107
若要忽略資源的多個程式碼,請以逗號分隔每個程式碼
$ kubectl annotate deployment my-deployment galley.istio.io/analyze-suppress=IST0107,IST0002
幫助我們改進此工具
我們正在繼續新增更多分析功能,並且我們很樂意您協助識別更多使用案例。如果您發現一些 Istio 設定「陷阱」,一些給您帶來麻煩的棘手情況,請開啟一個問題並告知我們。我們或許能夠自動標記此問題,以便其他人可以提前發現並避免該問題。
若要執行此操作,請開啟一個問題來描述您的情況。例如
- 查看所有虛擬服務
- 對於每一個服務,查看其閘道清單
- 如果某些閘道不存在,則產生錯誤
我們已經針對此特定情境有一個分析器,所以這只是一個範例來說明您應該提供哪種類型的資訊。
問答
此工具的目標 Istio 版本為何?
與其他
istioctl
工具一樣,我們通常建議使用與叢集中部署的版本相符的下載版本。目前,分析通常是向後相容的,因此您可以例如針對執行舊版 Istio 1.x 版本的叢集執行 1.24 版本的
istioctl analyze
,並預期獲得有用的回饋。對較舊的 Istio 版本沒有意義的分析規則將會略過。如果您決定在執行較舊 Istio 版本的叢集上使用最新的
istioctl
進行分析,我們建議您將其與用於管理已部署 Istio 版本的二進位檔版本分開存放。目前支援哪些分析器?
我們仍在努力記錄分析器。同時,您可以在Istio 原始碼中查看所有分析器。
您也可以查看支援哪些設定分析訊息,以了解目前涵蓋哪些內容。
分析會對我的叢集造成任何損害嗎?
分析永遠不會變更設定狀態。這是一個完全唯讀的操作,永遠不會改變叢集的狀態。
超越設定的分析呢?
目前,分析完全基於 Kubernetes 設定,但未來我們希望擴展到此範圍之外。例如,我們可以允許分析器也查看記錄以產生建議。
我在哪裡可以找到如何修正我收到的錯誤的方法?
設定分析訊息集包含每個訊息的描述以及建議的修正方法。