使用 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.yamldestination-rule-all.yaml)的效果

ZipZip
$ 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 設定,但未來我們希望擴展到此範圍之外。例如,我們可以允許分析器也查看記錄以產生建議。

  • 我在哪裡可以找到如何修正我收到的錯誤的方法?

    設定分析訊息集包含每個訊息的描述以及建議的修正方法。

此資訊對您是否有用?
您是否有任何改進建議?

感謝您的回饋!