Istioctl Analyze を使用した構成の診断

istioctl analyze は、Istio構成の潜在的な問題を検出できる診断ツールです。ライブクラスタまたはローカル構成ファイルのセットに対して実行できます。また、両方の組み合わせに対して実行することもでき、クラスタに変更を適用する前に問題を検出できます。

1分以内に始める

現在のライブ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ディレクトリにあるbookinfo-gateway.yamlおよびdestination-rule-all.yamlのような追加の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.dokyumento.jp/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以降、Istioは、istiod.enableAnalysisフラグを介して、主に責任を負う構成配布と並行して構成分析を実行するように設定できます。この分析では、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.dokyumento.jp/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経由での特定のanalyzerメッセージの無視

場合によっては、特定の場合にアナライザーメッセージを非表示または無視すると便利な場合があります。たとえば、更新する権限がないリソースに関するメッセージが発行される状況を想像してください。

$ 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"

アノテーション経由での特定のanalyzerメッセージの無視

リソースのアノテーションを使用して、特定のアナライザーメッセージを無視することもできます。たとえば、リソース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構成の「落とし穴」、つまり問題を引き起こした難しい状況を発見した場合は、問題をオープンしてお知らせください。他の人が最初に問題を検出して回避できるように、この問題を自動的にフラグ付けできる可能性があります。

これを行うには、問題をオープンして、シナリオを説明してください。例:

  • すべての仮想サービスを確認します。
  • それぞれについて、ゲートウェイのリストを確認します。
  • 一部のゲートウェイが存在しない場合は、エラーを生成します。

この特定のシナリオについてはすでにアナライザーがあるため、これは提供する必要がある情報の種類を示すための例にすぎません。

Q&A

  • このツールはどのIstioリリースをターゲットにしていますか?

    他のistioctlツールと同様に、一般的に、クラスタにデプロイされたバージョンと一致するダウンロードバージョンを使用することをお勧めします。

    当面の間、分析は一般的に下位互換性があるため、たとえば、古いIstio 1.xバージョンを実行しているクラスタに対してistioctl analyzeの1.24バージョンを実行して、有益なフィードバックを得ることができます。古いIstioリリースでは意味のない分析ルールはスキップされます。

    古いIstioバージョンを実行しているクラスタで分析目的で最新のistioctlを使用する場合は、デプロイされたIstioリリースを管理するために使用するバイナリのバージョンとは別のフォルダに保管することをお勧めします。

  • 現在、どのようなアナライザーがサポートされていますか?

    アナライザーのドキュメント化はまだ進行中です。それまでの間、Istioソースですべてのアナライザーを確認できます。

    構成分析メッセージで、現在カバーされている内容を確認することもできます。

  • 分析によってクラスタに有害な影響を与える可能性はありますか?

    分析によって構成状態が変更されることはありません。これは完全に読み取り専用の操作であり、クラスタの状態を改変することはありません。

  • 構成を超える分析はどうですか?

    現在、分析は完全にKubernetes構成に基づいています。しかし、将来的にはそれを超えて拡張したいと考えています。たとえば、アナライザーがログも調べて推奨事項を生成できるようにする可能性があります。

  • 取得しているエラーを修正する方法はどこで確認できますか?

    構成分析メッセージのセットには、各メッセージの説明と推奨される修正方法が含まれています。

この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!