異なるネットワークへのプライマリ-リモートインストール

このガイドに従って、cluster1プライマリクラスタ)にIstioコントロールプレーンをインストールし、cluster2リモートクラスタ)を構成して、cluster1のコントロールプレーンを使用します。クラスタcluster1network1ネットワーク上にあり、cluster2network2ネットワーク上にあります。つまり、クラスタ境界を越えたポッド間には直接接続がありません。

続行する前に、「始める前に」のステップを完了してください。

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

クラスタ境界を越えたサービスワークロードは、東西トラフィック専用のゲートウェイを介して間接的に通信します。各クラスタのゲートウェイは、他のクラスタから到達可能である必要があります。

cluster2のサービスは、同じ東西ゲートウェイを介してcluster1のコントロールプレーンに到達します。

Primary and remote clusters on separate networks
別々のネットワーク上のプライマリクラスタとリモートクラスタ

cluster1のデフォルトネットワークの設定

istio-system名前空間が既に作成されている場合は、そこにクラスタのネットワークを設定する必要があります。

$ kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
  kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

プライマリとして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への東西ゲートウェイのインストール

東西トラフィック専用のゲートウェイを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のコントロールプレーンクラスタの設定

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

$ 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に設定すると、同じ名前空間(この場合はistio-system)で実行されているcluster1上のistiodは、リモートクラスタとして接続された際にcluster2を管理します。

cluster2のデフォルトネットワークの設定

istio-system 名前空間にラベルを追加して、cluster2のネットワークを設定します。

$ kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

リモートとして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/network2
    global:
      remotePilotAddress: ${DISCOVERY_ADDRESS}
EOF

cluster2に構成を適用する

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

cluster1のリモートクラスタとしてcluster2を接続する

リモートクラスタをコントロールプレーンに接続するには、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}"

cluster2に東西ゲートウェイをインストールする

上記でcluster1に行ったように、東西トラフィック専用のゲートウェイをcluster2にインストールし、ユーザーサービスを公開します。

zip
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
    --network network2 | \
    istioctl --context="${CTX_CLUSTER2}" install -y -f -

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

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

cluster1cluster2でサービスを公開する

クラスタが別々のネットワーク上にあるため、両方のクラスタの東西ゲートウェイで、すべてのユーザーサービス(*.local)を公開する必要もあります。これらのゲートウェイはインターネット上で公開されていますが、それらの背後にあるサービスは、同じネットワーク上にある場合と同様に、信頼できるmTLS証明書とワークロードIDを持つサービスからのみアクセスできます。

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

おめでとうございます!異なるネットワーク上のプライマリクラスタとリモートクラスタに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}"
    
この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!