すべてのプロダクト
Search
ドキュメントセンター

:リモートコントロールプレーンとマネージドコントロールプレーンのワークロード間の相互アクセス

最終更新日:Jan 13, 2025

このトピックでは、ASMリモートコントロールプレーン機能を使用した後に、クラスター間の相互アクセスを実現する方法について説明します。

重要
  • このトピックでは、ASM リモートコントロールプレーンを使用したプッシュレイテンシの削減で説明されている cluster-1 と cluster-2 を引き続き使用します。 cluster-1 はクラウド上の ACK クラスター(ASM マネージドコントロールプレーンによって管理)を表し、cluster-2 は非 ACK クラスター(ASM リモートコントロールプレーンによって管理)を表します。 ASM リモートコントロールプレーンを使用したプッシュレイテンシの削減のすべての手順を完了していることを確認してください。

  • このトピックの手順では、kubeconfig を複数回切り替える必要があります。 cluster-1 と cluster-2 の kubeconfig を同じ構成ファイルに構成し、kubectl config use-context を使用して切り替えることをお勧めします。 また、kubecm または kubectx を使用して、複数のクラスターの kubeconfig を管理することもできます。

ステップ 1:cluster-1 から cluster-2 にアクセスする

  1. クラスターネットワークと East-West ゲートウェイを構成します。 詳細については、ASM East-West ゲートウェイを使用したマルチクラスタークロスネットワーク相互接続の実現をご参照ください。

  2. cluster-1 の kubeconfig を使用して、httpbin アプリケーションと sleep アプリケーションをデプロイします。 具体的なデプロイ手順については、httpbin アプリケーションのデプロイをご参照ください。

  3. 両方のクラスターに httpbin アプリケーションと sleep アプリケーションがあります。 ASM は、両方のクラスターの httpbin サービスを 1 つのサービスとして扱います。 cluster-1 の sleep を使用して httpbin にアクセスすると、リクエストは両方のクラスターの httpbin ワークロードに均等に分散されます。

  4. テストのために、次のコマンドを実行して cluster-1 の httpbin サービスを 0 にスケールインします。

    kubectl scale deployment httpbin --replicas 0
  5. 次のコマンドを実行して、cluster-1 の sleep から httpbin サービスにアクセスします。

    kubectl exec deployment/sleep -it -- curl httpbin:8000/status/418

    期待される出力:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`

    アクセスがまだ成功していることがわかります。 リクエストは cluster-2 の httpbin サービスによって処理され、cluster-1 と cluster-2 間の通信は mTLS を使用して暗号化されます。

ステップ 2:cluster-2 から cluster-1 へのアクセスをテストする

説明

このセクションの手順は、istiocli ツールに依存します。 インストールされている istiocli のバージョンが ASM のバージョンと互換性があることを確認してください。

デフォルトでは、リモートコントロールプレーンによって管理されるワークロードは、マネージドコントロールプレーンによって管理されるサービスを検出しません。 このセクションでは、cluster-2 から cluster-1 のサービスにアクセスする方法について説明します。

  1. 次の内容で role.yaml を作成します。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        app: istio-reader
      name: istio-reader-clusterrole-istio-system
    rules:
    - apiGroups:  // API グループ
      - config.istio.io
      - security.istio.io
      - networking.istio.io
      - authentication.istio.io
      - rbac.istio.io
      - telemetry.istio.io
      - extensions.istio.io
      resources:  // リソース
      - '*'
      verbs:  // 動詞
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - endpoints
      - pods
      - services
      - nodes
      - replicationcontrollers
      - namespaces
      - secrets
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.istio.io
      resources:
      - workloadentries
      verbs:
      - get
      - watch
      - list
    - apiGroups:
      - networking.x-k8s.io
      - gateway.networking.k8s.io
      resources:
      - gateways
      - gatewayclasses
      verbs:
      - get
      - watch
      - list
    - apiGroups:
      - apiextensions.k8s.io
      resources:
      - customresourcedefinitions
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - discovery.k8s.io
      resources:
      - endpointslices
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - multicluster.x-k8s.io
      resources:
      - serviceexports
      verbs:
      - get
      - list
      - watch
      - create
      - delete
    - apiGroups:
      - multicluster.x-k8s.io
      resources:
      - serviceimports
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - apps
      resources:
      - replicasets
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - authentication.k8s.io
      resources:
      - tokenreviews
      verbs:
      - create
    - apiGroups:
      - authorization.k8s.io
      resources:
      - subjectaccessreviews
      verbs:
      - create
    - apiGroups: [""]
      resources: ["configmaps"]
      verbs: ["create", "get", "list", "watch", "update"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        app: istio-reader
      name: istio-reader-clusterrole-istio-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: istio-reader-clusterrole-istio-system
    subjects:
    - kind: ServiceAccount
      name: istio-reader-service-account
      namespace: istio-system
  2. 作業ディレクトリを展開した istio フォルダに切り替え、次のコマンドを実行して cluster-1 に ClusterRoleClusterRoleBinding を作成します。これにより、cluster-2 のリモートコントロールプレーンは ClusterRole を介して cluster-1 からサービス情報を取得できます。

    bin/istioctl create-remote-secret \
    --context=cluster-1 \
    --name=${cluster-1 ID} | \
    kubectl apply -f role.yaml --context=cluster-2
    説明

    この手順を完了すると、cluster-2 の istio-system ネームスペースにシークレットが生成されます。 シークレットには、cluster-1 への接続に使用される証明書が含まれています。 このシークレットは適切に保管する必要があります。

  3. コンテキストを cluster-1 に切り替え、次のコマンドを実行して httpbin サービスのレプリカ数を 1 に変更します。

    kubectl scale deployment httpbin --replicas 1
  4. コンテキストを cluster-2 に切り替え、次のコマンドを実行して httpbin サービスのレプリカ数を 0 に変更します。

    kubectl scale deployment httpbin --replicas 0
  5. 次のコマンドを実行して、cluster-2 から httpbin サービスへのアクセスをテストします。

    kubectl exec deploy/sleep -it -- curl httpbin:8000/status/418

    期待される出力:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`

    アクセスが成功していることがわかります。