2.5.2. マルチテナントデプロイメントモデル
Red Hat OpenShift Service Mesh は、デフォルトでマルチテナント用に設定された ServiceMeshControlPlane をインストールします。Red Hat OpenShift Service Mesh は、マルチテナント Operator を使用して Service Mesh コントロールプレーンのライフサイクルを管理します。メッシュ内では、テナントに namespace が使用されます。
Red Hat OpenShift Service Mesh は、ServiceMeshControlPlane リソースを使用してメッシュのインストールを管理します。メッシュのインストールのスコープは、デフォルトではこのリソースが含まれる namespace に制限されています。別の namespace をメッシュに追加するには、ServiceMeshMemberRoll および ServiceMeshMember リソースを使用します。namespace は単一のメッシュにのみ組み込むことができ、複数のメッシュを単一の OpenShift クラスターにインストールできます。
通常の Service Mesh デプロイメントでは、単一の Service Mesh コントロールプレーンを使用してメッシュ内のサービス間の通信を設定します。Red Hat OpenShift Service Mesh は “ソフトマルチテナンシー” をサポートしています。つまり、テナントごとに 1 つのコントロールプレーンと 1 つのメッシュが存在し、クラスター内に複数の独立したコントロールプレーンが存在することができます。マルチテナントのデプロイメントでは、Service Mesh にアクセスできるプロジェクトを指定し、Service Mesh を他のコントロールプレーンインスタンスから分離します。
クラスター管理者はすべての Istio コントロールプレーンを制御して、可視化できますが、テナント管理者は特定の Service Mesh、Kiali、および Jaeger インスタンスしか制御できません。
指定の namespace または namespace 設定だけにワークロードをデプロイするチームパーミッションを付与できます。Service Mesh 管理者が mesh-user ロールを付与していると、ユーザーは ServiceMeshMember リソースを作成して namespace を ServiceMeshMemberRoll に追加できます。
2.5.2.1. クラスター全体のメッシュへの移行について リンクのコピーリンクがクリップボードにコピーされました!
クラスター全体のメッシュでは、1 つの ServiceMeshControlPlane (SMCP) がクラスター全体のすべての namespace を監視します。Red Hat OpenShift Service Mesh バージョン 2.5 以降を使用すると、既存のクラスターをマルチテナントメッシュからクラスター全体のメッシュに移行できます。
クラスターに複数の SMCP が必要な場合、クラスター全体のメッシュに移行できません。
デフォルトでは、クラスター全体のメッシュはクラスターを構成するすべての namespace を検出します。ただし、限られた namespace セットにアクセスするようにメッシュを設定できます。デフォルトでは、namespace はサイドカーインジェクションを受け取りません。どの namespace がサイドカーインジェクションを受け取るかを指定する必要があります。
同様に、どの Pod がサイドカーインジェクションを受け取るかを指定する必要があります。サイドカーインジェクションを受け取る namespace に存在する Pod は、サイドカーインジェクションを継承しません。サイドカーインジェクションを namespace と Pod に適用するのは別の操作です。
クラスター全体のメッシュに移行するときに Istio のバージョンを変更した場合は、アプリケーションを再起動する必要があります。同じ Istio バージョンを使用する場合、アプリケーションプロキシーはクラスター全体のメッシュの新規 SMCP に接続し、マルチテナントメッシュの場合と同じように動作します。
2.5.2.1.1. Web コンソールを使用してクラスター全体のメッシュに namespace を含めたり除外したりする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform Web コンソールを使用して、クラスター全体のメッシュの ServiceMeshControlPlane リソースに検出セレクターを追加できます。ディスカバリーセレクターはコントロールプレーンが検出できる namespace を定義します。コントロールプレーンは、メッシュから namespace を除外する検出セレクターのいずれにも一致しない namespace を無視します。
コントロールプレーンの namespace に Ingress または Egress ゲートウェイをインストールする場合は、コントロールプレーンの namespace を検出セレクターに含める必要があります。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlaneリソースがデプロイされている。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform Web コンソールにログインします。
-
Ecosystem
Installed Operators に移動します。 - Red Hat OpenShift Service Mesh Operator をクリックします。
- Istio Service Mesh Control Plane をクリックします。
- コントロールプレーンの名前をクリックします。
- YAML をクリックします。
YAML ファイルを変更して、
ServiceMeshControlPlaneリソースのspec.meshConfigフィールドに検出セレクターが含まれるようにします。注記Istiodサービスが検出できる namespace を設定する場合は、他のメッシュには公開すべきではない機密サービスが含まれる可能性のある namespace を除外します。次の例では、
Istiodサービスは、istio-discovery: enabledというラベルが付いた名前空間、またはbookinfo、httpbin、istio-systemという名前を持つ名前空間を検出します。apiVersion: maistra.io/v2 kind: ServiceMeshControlPlane metadata: name: basic spec: mode: ClusterWide meshConfig: discoverySelectors: - matchLabels: istio-discovery: enabled1 - matchExpressions: - key: kubernetes.io/metadata.name2 operator: In values: - bookinfo - httpbin - istio-system- ファイルを保存します。
2.5.2.1.2. CLI を使用したクラスター全体のメッシュへの namespace の組み込みと除外 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform CLI を使用して、クラスター全体のメッシュの ServiceMeshControlPlane リソースに検出セレクターを追加できます。ディスカバリーセレクターはコントロールプレーンが検出できる namespace を定義します。コントロールプレーンは、メッシュから namespace を除外する検出セレクターのいずれにも一致しない namespace を無視します。
コントロールプレーンの namespace に Ingress または Egress ゲートウェイをインストールする場合は、コントロールプレーンの namespace を検出セレクターに含める必要があります。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlaneリソースがデプロイされている。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform CLI にログインします。
次のコマンドを実行して、
ServiceMeshControlPlaneリソースを YAML ファイルとして開きます。$ oc -n istio-system edit smcp <name>1 - 1
<name>は、ServiceMeshControlPlaneリソースの名前を表します。
YAML ファイルを変更して、
ServiceMeshControlPlaneリソースのspec.meshConfigフィールドに検出セレクターが含まれるようにします。注記Istiodサービスが検出できる namespace を設定する場合は、他のメッシュには公開すべきではない機密サービスが含まれる可能性のある namespace を除外します。次の例では、
Istiodサービスは、istio-discovery: enabledというラベルが付いた名前空間、またはbookinfo、httpbin、istio-systemという名前を持つ名前空間を検出します。apiVersion: maistra.io/v2 kind: ServiceMeshControlPlane metadata: name: basic spec: mode: ClusterWide meshConfig: discoverySelectors: - matchLabels: istio-discovery: enabled1 - matchExpressions: - key: kubernetes.io/metadata.name2 operator: In values: - bookinfo - httpbin - istio-system- ファイルを保存して、エディターを終了します。
2.5.2.1.3. Web コンソールを使用して、クラスター全体のメッシュでサイドカーインジェクションの対象とする namespace を定義する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Red Hat OpenShift Service Mesh Operator はメンバーセレクターを使用して、サイドカーインジェクションの対象とする namespace を特定します。ServiceMeshMemberRoll リソースで定義されている istio-injection=enabled ラベルと一致しない namespace は、サイドカーインジェクションの対象にはなりません。
検出セレクターを使用してメッシュが検出できる namespace を決定しても、サイドカーインジェクションには影響しません。namespace の検出とサイドカーインジェクションの設定は別の操作です。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlanaeリソースをmode: ClusterWideアノテーションが指定してデプロイした。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform Web コンソールにログインします。
-
Ecosystem
Installed Operators に移動します。 - Red Hat OpenShift Service Mesh Operator をクリックします。
- Istio Service Mesh Member Roll をクリックします。
-
ServiceMeshMemberRollリソースをクリックします。 - YAML をクリックします。
injectラベルと一致するメンバーセレクターを追加して、ServiceMeshMemberRollリソースのspec.memberSelectorsフィールドを変更します。次の例では、istio-injection: enabledを使用します。apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default spec: memberSelectors: - matchLabels: istio-injection: enabled1 - 1
- namespace がサイドカーインジェクションを確実に受け取るようにします。
- ファイルを保存します。
2.5.2.1.4. CLI を使用して、クラスター全体のメッシュでサイドカーインジェクションを受け取る namespace を定義する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Red Hat OpenShift Service Mesh Operator はメンバーセレクターを使用して、サイドカーインジェクションの対象とする namespace を特定します。ServiceMeshMemberRoll リソースで定義されている istio-injection=enabled ラベルと一致しない namespace は、サイドカーインジェクションの対象にはなりません。
検出セレクターを使用してメッシュが検出できる namespace を決定しても、サイドカーインジェクションには影響しません。namespace の検出とサイドカーインジェクションの設定は別の操作です。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlanaeリソースをmode: ClusterWideアノテーションが指定してデプロイした。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform CLI にログインします。
ServiceMeshMemberRollリソースを編集します。$ oc edit smmr -n <controlplane-namespace>injectラベルと一致するメンバーセレクターを追加して、ServiceMeshMemberRollリソースのspec.memberSelectorsフィールドを変更します。次の例では、istio-injection: enabledを使用します。apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default spec: memberSelectors: - matchLabels: istio-injection: enabled1 - 1
- namespace がサイドカーインジェクションを確実に受け取るようにします。
- ファイルを保存して、エディターを終了します。
2.5.2.1.5. Web コンソールを使用してクラスター全体のメッシュから個々の Pod を除外する リンクのコピーリンクがクリップボードにコピーされました!
Pod に sidecar.istio.io/inject: true アノテーションが適用されており、Pod が ServiceMeshMemberRoll リソースで定義されているラベルセレクターまたはメンバーリストのいずれかに一致する namespace に存在する場合、Pod はサイドカーインジェクションを受け取ります。
Pod に sidecar.istio.io/inject アノテーションが適用されていない場合、サイドカーインジェクションを受け取ることができません。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlaneリソースをmode: ClusterWideアノテーションが指定してデプロイした。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform Web コンソールにログインします。
-
Workloads
Deployments に移動します。 - デプロイメントの名前をクリックします。
- YAML をクリックします。
次の例に示すように、YAML ファイルを変更して、サイドカーインジェクションを受け取るアプリケーションと受け取らないアプリケーションを 1 つずつデプロイします。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: annotations: sidecar.istio.io/inject: 'true'1 labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-without-sidecar spec: selector: matchLabels: app: nginx-without-sidecar template: metadata: labels: app: nginx-without-sidecar2 spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80- ファイルを保存します。
2.5.2.1.6. CLI を使用してクラスター全体のメッシュから個々の Pod を除外する リンクのコピーリンクがクリップボードにコピーされました!
Pod に sidecar.istio.io/inject: true アノテーションが適用されており、Pod が ServiceMeshMemberRoll リソースで定義されているラベルセレクターまたはメンバーリストのいずれかに一致する namespace に存在する場合、Pod はサイドカーインジェクションを受け取ります。
Pod に sidecar.istio.io/inject アノテーションが適用されていない場合、サイドカーインジェクションを受け取ることができません。
前提条件
- Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlaneリソースをmode: ClusterWideアノテーションが指定してデプロイした。 -
cluster-adminロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-adminロールを持つユーザーとしてログインします。
手順
- OpenShift Container Platform CLI にログインします。
次のコマンドを実行して、デプロイメントを編集します。
$ oc edit deployment -n <namespace> <deploymentName>次の例に示すように、YAML ファイルを変更して、サイドカーインジェクションを受け取るアプリケーションと受け取らないアプリケーションを 1 つずつデプロイします。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: annotations: sidecar.istio.io/inject: 'true'1 labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-without-sidecar spec: selector: matchLabels: app: nginx-without-sidecar template: metadata: labels: app: nginx-without-sidecar2 spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80- ファイルを保存します。