ディスカバリーセレクターを使用してIstioサービスメッシュのネームスペースを設定する
ディスカバリーセレクターの使用方法と、Sidecarリソースとの関係について説明します。
ユーザーがサービスをIstioサービスメッシュで実行するように移行すると、コントロールプレーンがデフォルトでクラスター内のすべてのネームスペースからすべてのKubernetesリソースを監視および処理することに驚くことがよくあります。これは、ネームスペースとデプロイメントが多数存在する非常に大規模なクラスター、またはリソースの変更が急速に行われる中規模のクラスター(たとえば、Sparkジョブ)では問題になる可能性があります。
コミュニティとSolo.ioの大規模顧客の両方で、Istioコントロールプレーンがこれらのネームスペースのリソースのみを処理するように、メッシュの一部であるネームスペースのセットを動的に制限する方法が必要です。ネームスペースを制限する機能により、Istiodはより少ないリソースと関連する変更を監視してサイドカーにプッシュできるため、コントロールプレーンとデータプレーンの全体的なパフォーマンスが向上します。
背景
デフォルトでは、Istioはクラスター内のすべてのネームスペース、サービス、エンドポイント、およびPodを監視します。たとえば、Kubernetesクラスターでは、`default`ネームスペースに`sleep`サービスを、`ns-x`ネームスペースに`httpbin`サービスをデプロイしました。 `sleep`サービスはメッシュに追加しましたが、`httpbin`サービスをメッシュに追加したり、メッシュ内のサービスを`httpbin`サービスと対話させたりする予定はありません。
`istioctl proxy-config endpoint`コマンドを使用して、`sleep`デプロイメントのすべてのエンドポイントを表示します
`ns-x`ネームスペースの`httpbin`サービスエンドポイントが、検出されたエンドポイントのリストに含まれていることに注意してください。サービスが少数の場合、これは問題にならない可能性があります。ただし、Istioサービスメッシュで実行されているサービスと対話しないサービスが数百ある場合、Istioコントロールプレーンがこれらのサービスを監視して、メッシュ内のサービスのサイドカーに情報を送信することは望ましくないでしょう。
ディスカバリーセレクターの紹介
Istio 1.10以降、MeshConfigに新しい`discoverySelectors`オプションが導入されました。これは、Kubernetesのセレクターの配列です。正確なタイプはこちらで定義されている`[]LabelSelector`であり、単純なセレクターとセットベースのセレクターの両方が可能です。これらのセレクターは、ネームスペースのラベルに適用されます。
さまざまなユースケースを表現するために、各ラベルセレクターを設定できます。以下はその例です。
- 任意のラベル名/値。たとえば、`istio-discovery=enabled`ラベルが付いたすべてのネームスペース
- ORセマンティクスを持つセットベースのセレクターを使用したネームスペースラベルのリスト。たとえば、`istio-discovery=enabled`または`region=us-east1`ラベルが付いたすべてのネームスペース
- ネームスペースの包含または除外。たとえば、`istio-discovery=enabled`ラベルと`app`キーが`helloworld`に等しいラベルが付いたすべてのネームスペース
注:`discoverySelectors`はセキュリティ境界ではありません。 `discoverySelectors`を設定した場合でも、Istiodはすべてのネームスペースにアクセスできます。
ディスカバリーセレクターの動作
サービスメッシュの一部として含めるネームスペースがわかっている場合、メッシュ管理者は、インストール時またはインストール後に、目的のディスカバリーセレクターをIstioのMeshConfigリソースに追加することで、`discoverySelectors`を設定できます。たとえば、`istio-discovery=enabled`ラベルが付いたネームスペースのみを検出するようにIstioを設定できます。
前の例を使用して、`default`ネームスペースに`istio-discovery=enabled`ラベルを付けましょう。
$ kubectl label namespace default istio-discovery=enabled
`discoverySelectors`を含むyamlを`istioctl`を使用して適用し、Istioインストールを更新します. 安定した環境への影響を避けるため、Istioインストールには別のリビジョンを使用することをお勧めします.
$ istioctl install --skip-confirmation -f - <<EOF apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: istio-system spec: # You may override parts of meshconfig by uncommenting the following lines. meshConfig: discoverySelectors: - matchLabels: istio-discovery: enabled EOF
`sleep`デプロイメントのエンドポイント設定を表示します
ディスカバリーセレクターを使用したSleepデプロイメントのエンドポイント 今回は、`ns-x`ネームスペースの`httpbin`サービスが、`default`ネームスペースにない他の多くのサービスとともに、検出されたエンドポイントのリストに含まれていないことに注意してください。 `sleep`デプロイメントのルート(またはクラスターまたはリスナー)情報を表示すると、返される設定がはるかに少ないことにも気付くでしょう
ディスカバリーセレクターを使用したSleepデプロイメントのルート
`matchLabels`を使用してANDセマンティクスで複数のラベルを設定したり、`matchLabels`セットを使用して複数のラベル間でORセマンティクスを設定したりできます。異なるラベルセットを持つネームスペースにサービスまたはPodをデプロイする場合でも、組織内の複数のアプリケーションチームが異なるラベル付け規則を使用する場合でも、`discoverySelectors`は必要な柔軟性を提供します。さらに、ドキュメントに従って、`matchLabels`と`matchExpressions`を一緒に使用できます。セレクターのセマンティクスの詳細については、Kubernetesセレクターのドキュメントを参照してください。
ディスカバリーセレクターとSidecarリソース
`discoverySelectors`設定により、ユーザーはメッシュの一部であるネームスペースのセットを動的に制限できます。 Sidecarリソースは、サイドカー設定の可視性とサイドカープロキシにプッシュされる内容も制御します。それらの違いは何ですか?
- `discoverySelectors`設定は、Istioコントロールプレーンが監視および処理するものを宣言します。 `discoverySelectors`設定がない場合、Istioコントロールプレーンは、所有しているサイドカーリソースに関係なく、クラスター内のすべてのネームスペース/サービス/エンドポイント/ Podを監視および処理します。
- `discoverySelectors`は、メッシュ管理者によってメッシュ全体に対してグローバルに設定されます。 Sidecarリソースは、MeshConfigルートネームスペースでメッシュ管理者によってグローバルに設定することもできますが、通常はサービス所有者によってネームスペースごとに設定されます。
`discoverySelectors`はSidecarリソースと一緒に使用できます。 `discoverySelectors`を使用して、Istioコントロールプレーンが監視および処理するネームスペースをメッシュワイドレベルで設定できます。 Istioサービスメッシュのこれらのネームスペースでは、グローバルまたはネームスペースごとにSidecarリソースを作成して、サイドカープロキシにプッシュされる内容をさらに制御できます。以下の図に示すように、`ns-y`ネームスペースに`Bookinfo`サービスをメッシュに追加してみましょう。 `discoverySelectors`を使用すると、`default`と`ns-y`ネームスペースがメッシュの一部であると定義できます。 `sleep`サービスが`default`ネームスペース以外を認識しないようにするにはどうすればよいでしょうか? `default`ネームスペースのSidecarリソースを追加することにより、`sleep`サイドカーが現在のネームスペースとその他の必要なネームスペースに関連付けられたクラスター/ルート/リスナー/エンドポイントのみを表示するように効果的に設定できます。
まとめ
ディスカバリーセレクターは、Istioコントロールプレーンが特定のネームスペースのみを監視および処理するように調整するための強力な設定です。 Kubernetesクラスター内のすべてのネームスペースをサービスメッシュの一部にしたくない場合、またはKubernetesクラスター内に複数のIstioサービスメッシュがある場合は、この設定を検討し、Istio slackまたはGitHubでフィードバックをお寄せください。