プライマリ-リモートのインストール

このガイドに従って、cluster1プライマリクラスタ)にIstioコントロールプレーンをインストールし、cluster2リモートクラスタ)がcluster1のコントロールプレーンを使用するように構成します。両方のクラスタはnetwork1ネットワーク上に存在し、両方のクラスタ内のポッド間に直接接続があることを意味します。

続行する前に、開始する前にの手順を完了していることを確認してください。

この構成では、クラスタcluster1は両方のクラスタのAPIサーバーのエンドポイントを監視します。これにより、コントロールプレーンは両方のクラスタのワークロードにサービスディスカバリを提供できます。

サービスワークロードは、クラスタ境界を越えて直接(ポッド間)通信します。

cluster2のサービスは、東西トラフィック専用のゲートウェイを介して、cluster1のコントロールプレーンに到達します。

Primary and remote clusters on the same network
同じネットワーク上のプライマリクラスタとリモートクラスタ

cluster1をプライマリとして構成する

cluster1のIstio構成を作成します

$ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster1
      network: network1
      externalIstiod: true
EOF

構成をcluster1に適用します

$ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

values.global.externalIstiodtrueに設定されていることに注意してください。これにより、cluster1にインストールされたコントロールプレーンは、他のリモートクラスタの外部コントロールプレーンとしても機能できます。この機能が有効になっている場合、istiodはリーダーシップロックを取得しようとし、その結果、それにアタッチされる(この場合はcluster2)、適切にアノテーションが付けられたリモートクラスタを管理します。

cluster1にeast-westゲートウェイをインストールする

東西トラフィック専用のゲートウェイをcluster1にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番システムでは、外部からの攻撃を防ぐために追加のアクセス制限(ファイアウォールルールなど)が必要になる場合があります。利用可能なオプションについては、クラウドベンダーに確認してください。

Zip
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network1 | \
    istioctl --context="${CTX_CLUSTER1}" install -y -f -

東西ゲートウェイに外部IPアドレスが割り当てられるのを待ちます

$ kubectl --context="${CTX_CLUSTER1}" get svc istio-eastwestgateway -n istio-system
NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
istio-eastwestgateway   LoadBalancer   10.80.6.124   34.75.71.237   ...       51s

cluster1でコントロールプレーンを公開する

cluster2にインストールする前に、まずcluster1のコントロールプレーンを公開して、cluster2のサービスがサービスディスカバリにアクセスできるようにする必要があります

Zip
$ kubectl apply --context="${CTX_CLUSTER1}" -n istio-system -f \
    @samples/multicluster/expose-istiod.yaml@

cluster2のコントロールプレーンクラスタを設定する

istio-system名前空間にアノテーションを付けることにより、cluster2を管理する外部コントロールプレーンクラスタを特定する必要があります

$ kubectl --context="${CTX_CLUSTER2}" create namespace istio-system
$ kubectl --context="${CTX_CLUSTER2}" annotate namespace istio-system topology.istio.io/controlPlaneClusters=cluster1

topology.istio.io/controlPlaneClusters名前空間のアノテーションをcluster1に設定すると、cluster1の同じ名前空間(この場合はistio-system)で実行されているistiodは、それがリモートクラスタとしてアタッチされたときにcluster2を管理するように指示されます。

cluster2をリモートとして構成する

cluster1の東西ゲートウェイのアドレスを保存します。

$ export DISCOVERY_ADDRESS=$(kubectl \
    --context="${CTX_CLUSTER1}" \
    -n istio-system get svc istio-eastwestgateway \
    -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

次に、cluster2のリモート構成を作成します。

$ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: remote
  values:
    istiodRemote:
      injectionPath: /inject/cluster/cluster2/net/network1
    global:
      remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF

構成をcluster2に適用します

$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

cluster2cluster1のリモートクラスタとしてアタッチする

リモートクラスタをコントロールプレーンにアタッチするために、cluster1のコントロールプレーンにcluster2のAPIサーバーへのアクセス権を付与します。これにより、次のことが行われます

  • コントロールプレーンがcluster2で実行されているワークロードからの接続要求を認証できるようにします。APIサーバーへのアクセスがないと、コントロールプレーンは要求を拒否します。

  • cluster2で実行されているサービスエンドポイントのディスカバリを有効にします。

topology.istio.io/controlPlaneClusters名前空間のアノテーションに含まれているため、cluster1のコントロールプレーンも

  • cluster2のwebhookの証明書をパッチします。

  • cluster2の名前空間にconfigmapを書き込む名前空間コントローラーを起動します。

cluster2へのAPIサーバーアクセスを提供するために、リモートシークレットを生成し、cluster1に適用します

$ istioctl create-remote-secret \
    --context="${CTX_CLUSTER2}" \
    --name=cluster2 | \
    kubectl apply -f - --context="${CTX_CLUSTER1}"

おめでとうございます!プライマリクラスタとリモートクラスタにまたがるIstioメッシュのインストールに成功しました!

次のステップ

これでインストールを確認できます。

クリーンアップ

  1. cluster1のIstioをアンインストールします

    $ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
    
  2. cluster2のIstioをアンインストールします

    $ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge
    $ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"
    
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!