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


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

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

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

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

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

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 に限定されます。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 に追加できます。

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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Operators Installed Operators に移動します。
  3. Red Hat OpenShift Service Mesh Operator をクリックします。
  4. Istio Service Mesh Control Plane をクリックします。
  5. コントロールプレーンの名前をクリックします。
  6. YAML をクリックします。
  7. YAML ファイルを変更して、ServiceMeshControlPlane リソースの spec.meshConfig フィールドに検出セレクターが含まれるようにします。

    注記

    Istiod サービスが検出できる namespace を設定する場合は、他のメッシュには公開すべきではない機密サービスが含まれる可能性のある namespace を除外します。

    以下の例では、Istiod サービスは istio-discovery: enabled のラベルが付いた namespace、または infohttpbin、または istio-system の名前を持つ namespace を検出します。

    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: In
            values:
            - info
            - httpbin
            - istio-system
    1
    メッシュがラベル istio-discovery:enabled を含む namespace を検出するようにします。
    2
    メッシュが namespace infohttpbin、および istio-system を検出するようにします。

    namespace が検出セレクターのいずれかに一致する場合、メッシュは namespace を検出します。メッシュは、どの検出セレクターにも一致しない namespace を除外します。

  8. ファイルを保存します。
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 ロールを持つユーザーとしてログインします。

手順

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

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

    注記

    Istiod サービスが検出できる namespace を設定する場合は、他のメッシュには公開すべきではない機密サービスが含まれる可能性のある namespace を除外します。

    以下の例では、Istiod サービスは istio-discovery: enabled のラベルが付いた namespace、または infohttpbin、または istio-system の名前を持つ namespace を検出します。

    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: In
            values:
            - info
            - httpbin
            - istio-system
    1
    メッシュがラベル istio-discovery:enabled を含む namespace を検出するようにします。
    2
    メッシュが namespace infohttpbin、および istio-system を検出するようにします。

    namespace が検出セレクターのいずれかに一致する場合、メッシュは namespace を検出します。メッシュは、どの検出セレクターにも一致しない namespace を除外します。

  4. ファイルを保存して、エディターを終了します。
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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Operators Installed 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. ファイルを保存します。
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 ロールを持つユーザーとしてログインします。

手順

  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. ファイルを保存して、エディターを終了します。
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 ロールを持つユーザーとしてログインします。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Workloads Deployments に移動します。
  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. ファイルを保存します。
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 ロールを持つユーザーとしてログインします。

手順

  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. ファイルを保存します。

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

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

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

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

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.