Google Cloud の外部でマルチクラスタ メッシュを設定する
このガイドでは、次のプラットフォーム向けにマルチクラスタ メッシュを設定する方法について説明します。
- VMware 用 Google Distributed Cloud(ソフトウェアのみ)の概要
- ベアメタル用 Google Distributed Cloud(ソフトウェアのみ)
- Azure 上の GKE
- GKE on AWS
- 接続クラスタ(Amazon EKS クラスタ、Microsoft AKS クラスタを含む)
このガイドでは 2 つのクラスタを設定する方法について説明しますが、このプロセスを拡張して任意の数のクラスタをメッシュに組み込むこともできます。
始める前に
このガイドでは、asmcli install
を使用して Cloud Service Mesh がインストールされていることを前提としています。asmcli
と、asmcli install
の実行時に --output_dir
で指定したディレクトリに asmcli
がダウンロードする構成パッケージが必要です。設定する必要がある場合は、依存ツールのインストールとクラスタの検証の手順に沿って、次の操作を行います。
メッシュで設定するすべてのクラスタの kubeconfig ファイルにアクセスする必要があります。
環境変数とプレースホルダを設定する
east-west ゲートウェイをインストールするには、次の環境変数が必要です。
プロジェクト番号の環境変数を作成します。次のコマンドで、FLEET_PROJECT_ID をフリート ホスト プロジェクトのプロジェクト ID に置き換えます。
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")
メッシュ ID の環境変数を作成します。
export MESH_ID="proj-${PROJECT_NUMBER}"
クラスタ名の環境変数を、
asmcli
に必要な形式で作成します。export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
このコマンドの出力の
NAME
列にある値を使用して、クラスタのコンテキスト名を取得します。kubectl config get-contexts
環境変数をクラスタ コンテキスト名に設定します。これは、このガイドの多くの手順で使用されます。
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
east-west ゲートウェイをインストールする
次のコマンドで、
CLUSTER_NAME_1
とCLUSTER_NAME_2
をクラスタの名前に置き換えます。PATH_TO_KUBECONFIG_1
とPATH_TO_KUBECONFIG_2
をクラスタの kubeconfig ファイルに置き換えます。
Anthos clusters
Mesh CA または CA サービス
east-west トラフィック専用の cluster1 内のゲートウェイを
$CLUSTER_2
にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番環境のシステムでは、外部からの攻撃を防ぐため、追加のアクセス制限(ファイアウォール ルールなど)が必要になる場合があります。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
$CLUSTER_1
用の east-west トラフィック専用の$CLUSTER_2
内のゲートウェイをインストールします。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Istio CA
east-west トラフィック専用の cluster1 内のゲートウェイを
$CLUSTER_2
にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番環境のシステムでは、外部からの攻撃を防ぐため、追加のアクセス制限(ファイアウォール ルールなど)が必要になる場合があります。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
$CLUSTER_1
用の east-west トラフィック専用の$CLUSTER_2
内のゲートウェイをインストールします。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure、AWS、接続
Mesh CA
east-west トラフィック専用の cluster1 内のゲートウェイを
$CLUSTER_2
にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番環境のシステムでは、外部からの攻撃を防ぐため、追加のアクセス制限(ファイアウォール ルールなど)が必要になる場合があります。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
$CLUSTER_1
用の east-west トラフィック専用の$CLUSTER_2
内のゲートウェイをインストールします。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
east-west トラフィック専用の cluster1 内のゲートウェイを
$CLUSTER_2
にインストールします。デフォルトでは、このゲートウェイはインターネット上で公開されます。本番環境のシステムでは、外部からの攻撃を防ぐため、追加のアクセス制限(ファイアウォール ルールなど)が必要になる場合があります。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
$CLUSTER_1
用の east-west トラフィック専用の$CLUSTER_2
内のゲートウェイをインストールします。asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1232-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
サービスの公開
クラスタは別々のネットワーク上にあるため、すべてのサービス(*.local
)を両方のクラスタの east-west ゲートウェイ上で公開する必要があります。このゲートウェイはインターネットで一般公開されますが、その背後にあるサービスは、信頼できる mTLS 証明書とワークロード ID を持つサービスのみが、両者が同じネットワーク上にあるかのように、アクセスできます。
CLUSTER_NAME_1
用の east-west ゲートウェイ経由でサービスを公開します。kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
CLUSTER_NAME_2
用の east-west ゲートウェイ経由でサービスを公開します。kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
エンドポイント ディスカバリを有効にする
asmcli create-mesh
コマンドを実行して、エンドポイント ディスカバリを有効にします。この例では 2 つのクラスタのみが示されていますが、このコマンドを実行して、GKE Hub サービスの制限の対象となる追加のクラスタでエンドポイントの検出を有効にできます。
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
マルチクラスタ接続を確認する
このセクションでは、サンプルの HelloWorld
サービスと Sleep
サービスをマルチクラスタ環境にデプロイして、クラスタ間でのロード バランシングが機能することを確認する方法について説明します。
サイドカー インジェクションを有効にする
各クラスタにサンプルの名前空間を作成します。
for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample done
作成された名前空間でサイドカー インジェクションを有効にします。
推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを名前空間に適用します。
for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio.io/rev- istio-injection=enabled --overwrite done
デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションがサポートされています。 次の手順を使用します。
次のコマンドを使用して、
istiod
のリビジョン ラベルを探します。kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
リビジョン ラベルを名前空間に適用します。次のコマンドで、
REVISION_LABEL
は前の手順でメモしたistiod
リビジョン ラベルの値です。for CTX in ${CTX_1} ${CTX_2} do kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done
HelloWorld サービスをインストールする
両方のクラスタに HelloWorld サービスを作成します。
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
各クラスタに HelloWorld v1 と v2 をデプロイする
HelloWorld v1
をCLUSTER_1
にデプロイし、v2
をCLUSTER_2
にデプロイします。これは、後でクラスタ間のロード バランシングを確認する際に役立ちます。kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
次のコマンドを使用して、
HelloWorld v1
とv2
が実行されていることを確認します。次のような出力が表示されていることを確認します。kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
スリープ サービスをデプロイする
両方のクラスタに
Sleep
サービスをデプロイします。この Pod は、デモ用の人為的なネットワーク トラフィックを生成します。for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample done
各クラスタで
Sleep
サービスが起動するまで待ちます。次のような出力が表示されていることを確認します。kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
クラスタ間のロード バランシングを確認する
HelloWorld
サービスを数回呼び出し、出力をチェックして v1 と v2 からの交互の返信を確認します。
HelloWorld
サービスを呼び出します。kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
出力は次のようになります。
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
HelloWorld
サービスを再度呼び出します。kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
出力は次のようになります。
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
負荷分散されたマルチクラスタの Cloud Service Mesh の検証はこれで完了です。
クリーンアップ
ロード バランシングの確認が完了したら、クラスタから HelloWorld
サービスと Sleep
サービスを削除します。
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}