1.4. サービスメッシュのデプロイメントモデル

Red Hat OpenShift Service Mesh は、さまざまなデプロイメントモデルを複数サポートし、ビジネス要件に最も適合するように、各種方法を組み合わせることができます。

Istio では、テナントはデプロイされたワークロードで共通のアクセスおよび権限を共有するユーザーのグループです。テナントを使用して、異なるチーム間で一定レベルの分離を確保できます。Istio.io またはサービスリソースの NetworkPoliciesAuthorizationPolicies、および exportTo アノテーションを使用して、異なるテナントへのアクセスを分離できます。

1.4.1. クラスター全体 (シングルテナント) メッシュデプロイメントモデル

クラスター全体のデプロイメントには、クラスター全体のリソースを監視する Service Mesh Control Plane が含まれます。クラスター全体のリソースのモニタリングは、コントロールプレーンがすべての namespace にわたって単一のクエリーを使用して Istio および Kubernetes リソースを監視するという点で、Istio の機能によく似ています。その結果、クラスター全体のデプロイメントにより、API サーバーに送信されるリクエストの数が減少します。

Istio と同様に、クラスター全体のメッシュには、デフォルトで istio-injection=enabled namespace ラベルが付いた namespace が含まれます。このラベルを変更するには、ServiceMeshMemberRoll リソースの spec.labelSelectors フィールドを変更します。

1.4.2. マルチテナントデプロイメントモデル

Red Hat OpenShift Service Mesh は、デフォルトでマルチテナントとして設定される ServiceMeshControlPlane をインストールします。Red Hat OpenShift Service Mesh はマルチテナント Operator を使用して、Service Mesh コントロールプレーンのライフサイクルを管理します。メッシュ内では、テナントに namespace が使用されます。

Red Hat OpenShift Service Mesh は ServiceMeshControlPlane リソースを使用してメッシュインストールを管理します。メッシュのインストールのスコープはデフォルトでは、リソースを含む namespace に限定されます。ServiceMeshMemberRoll および ServiceMeshMember リソースを使用して、別の namespace をメッシュに追加します。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 に追加できます。

1.4.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 に接続し、マルチテナントメッシュの場合と同じように動作します。

1.4.2.1.1. Web コンソールを使用してクラスター全体のメッシュに namespace を含めたり除外したりする

デフォルトでは、Red Hat OpenShift Service Mesh Operator は検出セレクターを使用して、メッシュを設定する namespace を識別します。ServiceMeshMemberRoll リソースで定義されたラベルを含まない namespace は、検出セレクターによって照合されず、メッシュから除外されます。

前提条件

  • Red Hat OpenShift Service Mesh Operator がインストールされている。
  • ServiceMeshControlPlane リソースがデプロイされている。
  • cluster-admin ロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-admin ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. OperatorsInstalled Operators に移動します。
  3. Red Hat OpenShift Service Mesh Operator をクリックします。
  4. Istio Service Mesh Control Plane をクリックします。
  5. コントロールプレーンの名前をクリックします。
  6. YAML をクリックします。
  7. ServiceMeshMemberRoll リソースの spec.discoverySelectors フィールドに検出セレクターが含まれるように YAML ファイルを変更します。次の例では、istio-discovery: Enabled を使用します。

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    metadata:
      name: basic
    spec:
      mode: ClusterWide
      meshConfig:
        discoverySelectors:
        - matchLabels:
            istio-discovery: enabled 1
        - matchExpressions:
          - key: kubernetes.io/metadata.name 2
            operator: NotIn
            values:
            - info
            - httpbin
    1
    メッシュがラベル istio-discovery:enabled を含む namespace を検出するようにします。メッシュは、ラベルが含まれない namespace を検出しません。
    2
    メッシュが infohttpbin の namespace を検出しないようにします。
  8. ファイルを保存します。
1.4.2.1.2. CLI を使用したクラスター全体のメッシュへの namespace の組み込みと除外

デフォルトでは、Red Hat OpenShift Service Mesh Operator は検出セレクターを使用して、メッシュを設定する namespace を識別します。ServiceMeshMemberRoll リソースで定義されたラベルを含まない namespace は、検出セレクターによって照合されず、メッシュから除外されます。

前提条件

  • Red Hat OpenShift Service Mesh Operator がインストールされている。
  • ServiceMeshControlPlane リソースがデプロイされている。
  • cluster-admin ロールを持つユーザーとしてログインしている。Red Hat OpenShift Dedicated を使用する場合は、dedicated-admin ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform CLI にログインします。
  2. 次のコマンドを実行して、ServiceMeshControlPlane リソースを YAML ファイルとして開きます。

    $ oc -n istio-system edit smcp <name> 1
    1
    <name> は、ServiceMeshControlPlane リソースの名前を表します。
  3. ServiceMeshMemberRoll リソースの spec.discoverySelectors フィールドに検出セレクターが含まれるように YAML ファイルを変更します。次の例では、istio-discovery: Enabled を使用します。

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    metadata:
      name: basic
    spec:
      mode: ClusterWide
      meshConfig:
        discoverySelectors:
        - matchLabels:
            istio-discovery: enabled 1
        - matchExpressions:
          - key: kubernetes.io/metadata.name 2
            operator: NotIn
            values:
            - info
            - httpbin
    1
    メッシュがラベル istio-discovery:enabled を含む namespace を検出するようにします。メッシュは、ラベルが含まれない namespace を検出しません。
    2
    メッシュが infohttpbin の namespace を検出しないようにします。
  4. ファイルを保存して、エディターを終了します。
1.4.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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. OperatorsInstalled Operators に移動します。
  3. Red Hat OpenShift Service Mesh Operator をクリックします。
  4. Istio Service Mesh Member Roll をクリックします。
  5. ServiceMeshMemberRoll リソースをクリックします。
  6. YAML をクリックします。
  7. inject ラベルと一致するメンバーセレクターを追加して、ServiceMeshMemberRoll リソースの spec.memberSelectors フィールドを変更します。次の例では、istio-injection: Enabled を使用します。

    apiVersion: maistra.io/v1
    kind: ServiceMeshMemberRoll
    metadata:
      name: default
    spec:
      memberSelectors:
      - matchLabels:
          istio-injection: enabled 1
    1
    namespace がサイドカーインジェクションを確実に受け取るようにします。
  8. ファイルを保存します。
1.4.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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform CLI にログインします。
  2. ServiceMeshMemberRoll リソースを編集します。

    $ oc edit smmr -n <controlplane-namespace>
  3. inject ラベルと一致するメンバーセレクターを追加して、ServiceMeshMemberRoll リソースの spec.memberSelectors フィールドを変更します。次の例では、istio-injection: Enabled を使用します。

    apiVersion: maistra.io/v1
    kind: ServiceMeshMemberRoll
    metadata:
      name: default
    spec:
      memberSelectors:
      - matchLabels:
          istio-injection: enabled 1
    1
    namespace がサイドカーインジェクションを確実に受け取るようにします。
  4. ファイルを保存して、エディターを終了します。
1.4.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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. WorkloadsDeployments に移動します。
  3. デプロイメントの名前をクリックします。
  4. YAML をクリックします。
  5. 次の例に示すように、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-sidecar 2
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    1
    この Pod には、sidecar.istio.io/inject アノテーションが適用されているため、サイドカーインジェクションを受け取ります。
    2
    この Pod にはアノテーションがないため、サイドカーインジェクションを受け取りません。
  6. ファイルを保存します。
1.4.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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform CLI にログインします。
  2. 次のコマンドを実行して、デプロイメントを編集します。

    $ oc edit deployment -n <namespace> <deploymentName>
  3. 次の例に示すように、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-sidecar 2
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    1
    この Pod には、sidecar.istio.io/inject アノテーションが適用されているため、サイドカーインジェクションを受け取ります。
    2
    この Pod にはアノテーションがないため、サイドカーインジェクションを受け取りません。
  4. ファイルを保存します。

1.4.3. マルチテーマまたはフェデレーションされたデプロイメントモデル

フェデレーション は、個別の管理ドメインで管理される個別のメッシュ間でサービスとワークロードを共有できるデプロイメントモデルです。

Istio マルチクラスターモデルでは、メッシュ間だで高いレベルの信頼が必要なだけでなく、個々のメッシュが存在するすべての Kubernetes API サーバーへのリモートアクセスも必要です。Red Hat OpenShift Service Mesh のフェデレーションは、メッシュ間の最小限の信頼を前提とする Service Mesh のマルチクラスター実装に対して独自のアプローチを採用しています。

フェデレーションされたメッシュ は、単一のメッシュとして動作させるメッシュのグループです。各メッシュのサービスは、独自のサービスにできます。たとえば、別のメッシュからサービスをインポートすることでサービスを追加するメッシュは、メッシュ全体で同じサービスにさらにワークロードを追加し、高可用性を提供することや、その両方を組み合わせることができます。フェデレーションされたメッシュに参加するすべてのメッシュは個別に管理されたままなので、フェデレーション内の他のメッシュとの間でエクスポートやインポートされるサービスを明示的に設定する必要があります。証明書の生成、メトリクス、トレース収集などのサポート機能は、それぞれのメッシュのローカルで機能します。