異なるネットワークへのプライマリ-リモートインストール
このガイドに従って、cluster1
(プライマリクラスタ)にIstioコントロールプレーンをインストールし、cluster2
(リモートクラスタ)を構成して、cluster1
のコントロールプレーンを使用します。クラスタcluster1
はnetwork1
ネットワーク上にあり、cluster2
はnetwork2
ネットワーク上にあります。つまり、クラスタ境界を越えたポッド間には直接接続がありません。
続行する前に、「始める前に」のステップを完了してください。
この構成では、クラスタcluster1
は両方のクラスタのAPIサーバーをエンドポイントとして監視します。このようにして、コントロールプレーンは両方のクラスタのワークロードのサービスディスカバリを提供できます。
クラスタ境界を越えたサービスワークロードは、東西トラフィック専用のゲートウェイを介して間接的に通信します。各クラスタのゲートウェイは、他のクラスタから到達可能である必要があります。
cluster2
のサービスは、同じ東西ゲートウェイを介してcluster1
のコントロールプレーンに到達します。
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.externalIstiod
がtrue
に設定されていることに注意してください。これにより、cluster1
にインストールされたコントロールプレーンは、他のリモートクラスタの外部コントロールプレーンとしても機能します。この機能が有効になっている場合、istiod
はリーダーシップロックの取得を試み、その結果、適切にアノテーションされたリモートクラスタ(この場合はcluster2
)を管理します。
cluster1
への東西ゲートウェイのインストール
東西トラフィック専用のゲートウェイをcluster1
にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番システムでは、外部からの攻撃を防ぐために、追加のアクセス制限(ファイアウォールルールなど)が必要になる場合があります。利用可能なオプションについては、クラウドベンダーにお問い合わせください。
$ @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
のサービスがサービスディスカバリにアクセスできるようになります。
$ 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
にインストールし、ユーザーサービスを公開します。
$ @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
cluster1
とcluster2
でサービスを公開する
クラスタが別々のネットワーク上にあるため、両方のクラスタの東西ゲートウェイで、すべてのユーザーサービス(*.local)を公開する必要もあります。これらのゲートウェイはインターネット上で公開されていますが、それらの背後にあるサービスは、同じネットワーク上にある場合と同様に、信頼できるmTLS証明書とワークロードIDを持つサービスからのみアクセスできます。
$ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@
おめでとうございます!異なるネットワーク上のプライマリクラスタとリモートクラスタにIstioメッシュを正常にインストールしました!
次のステップ
これで、インストールを確認できます。
クリーンアップ
cluster1
でIstioをアンインストールする$ istioctl uninstall --context="${CTX_CLUSTER1}" -y --purge $ kubectl delete ns istio-system --context="${CTX_CLUSTER1}"
cluster2
でIstioをアンインストールする$ istioctl uninstall --context="${CTX_CLUSTER2}" -y --purge $ kubectl delete ns istio-system --context="${CTX_CLUSTER2}"