設定スコープ
サービスメッシュをプログラムするために、Istioコントロールプレーン(Istiod)は、Service
やNode
などのコアKubernetesタイプ、およびGateway
などのIstio独自のタイプを含む、さまざまな構成を読み取ります。これらは、データプレーンに送信されます(詳細については、アーキテクチャ6を参照してください)。
デフォルトでは、コントロールプレーンはすべての名前空間のすべての構成を読み取ります。各プロキシインスタンスも、すべての名前空間の構成を受け取ります。これには、メッシュに登録されていないワークロードに関する情報も含まれます。
このデフォルト設定は、すぐに正しい動作を保証しますが、スケーラビリティのコストが伴います。各構成には、維持および最新の状態に保つためのコスト(主にCPUとメモリ)があります。大規模な環境では、過剰なリソース消費を避けるために、構成スコープを制限することが重要です。
スコープメカニズム
Istioは、さまざまなユースケースに対応するために、構成のスコープを制御するのに役立ついくつかのツールを提供しています。要件に応じて、これらを単独で使用することも、組み合わせて使用することもできます。
Sidecar
は、特定のワークロードが構成のセットをインポートするためのメカニズムを提供します。exportTo
は、構成をワークロードのセットにエクスポートするためのメカニズムを提供します。discoverySelectors
は、Istioが構成のセットを完全に無視できるようにするメカニズムを提供します。
Sidecar
インポート
Sidecar
のegress.hosts
フィールドを使用すると、インポートする構成のリストを指定できます。指定された条件に一致する構成のみが、Sidecar
リソースの影響を受けるサイドカーに表示されます。
例:
exportTo
IstioのVirtualService
、DestinationRule
、およびServiceEntry
は、spec.exportTo
フィールドを提供します。同様に、Service
はnetworking.istio.io/exportTo
アノテーションを使用して構成できます。
ワークロードの所有者がどのような依存関係を持つかを制御できるSidecar
とは異なり、exportTo
は逆の方法で機能し、サービス所有者が独自のサービスの可視性を制御できるようにします。
たとえば、この構成では、details
Service
は、それ自身の名前空間とclient
名前空間でのみ表示されます。
DiscoverySelectors
上記の制御はワークロードまたはサービスオーナーのレベルで動作しますが、DiscoverySelectors
は、構成の可視性に対するメッシュ全体の制御を提供します。ディスカバリーセレクターを使用すると、コントロールプレーンに表示する必要がある名前空間の条件を指定できます。一致しない名前空間は、コントロールプレーンによって完全に無視されます。
これは、インストール中にmeshConfig
の一部として構成できます。例:
よくある質問
特定の構成のコストを理解するにはどうすればよいですか?
構成をスコープダウンするための最良の投資収益率を得るには、各オブジェクトのコストを理解すると役立つ場合があります。残念ながら、簡単な答えはありません。スケーラビリティは、多数の要因に依存します。ただし、いくつかの一般的なガイドラインがあります。
構成の変更は、再計算が必要なため、Istioではコストがかかります。Endpoints
の変更(通常はPodのスケールアップまたはスケールダウンによる)は大幅に最適化されていますが、他のほとんどの構成は非常にコストがかかります。コントローラーがオブジェクトを常に変更している場合(時々、誤って発生します!)、これは特に有害になる可能性があります。どの構成が変更されているかを検出するためのツールを次に示します。
- Istiodは、
Push debounce stable 1 for config Gateway/default/gateway: ..., full=true
のように各変更をログに記録します。これは、default
名前空間のGateway
オブジェクトが変更されたことを示しています。full=false
は、Endpoint
などの最適化された更新を表します。注:Service
とEndpoints
への変更はすべてServiceEntry
として表示されます。 - Istiodは、各変更について
pilot_k8s_cfg_events
およびpilot_k8s_reg_events
メトリクスを公開します。 kubectl get <resource> --watch -oyaml --show-managed-fields
は、オブジェクト(またはオブジェクト)への変更を表示して、何が、誰によって変更されているかを理解するのに役立ちます。
ヘッドレスサービス(HTTPとして宣言されているもの以外)は、インスタンスの数に応じてスケーリングされます。これにより、大規模なヘッドレスサービスはコストがかかり、exportTo
または同等のものを使用して除外するのに適しています。
スコープ外のサービスに接続するとどうなりますか?
スコーピングメカニズムのいずれかを通じて除外されたサービスに接続する場合、データプレーンは宛先に関する情報を何も知らないため、一致しないトラフィックとして扱われます。
ゲートウェイについてはどうですか?
ゲートウェイ7はexportTo
とDiscoverySelectors
を尊重しますが、Sidecar
オブジェクトはゲートウェイに影響を与えません。ただし、サイドカーとは異なり、ゲートウェイにはデフォルトでクラスター全体の構成はありません。代わりに、各構成はゲートウェイに明示的に添付されるため、この問題はほぼ回避されます。
ただし、現在8、データプレーン構成の一部(Envoy用語では「クラスター」)は、明示的に参照されていない場合でも、常にクラスター全体に送信されます。