マルチクラウドまたはハイブリッド メッシュを設定する
このページでは、次のプラットフォーム用にマルチクラウドまたはハイブリッド メッシュを設定する方法について説明します。
- ハイブリッド: Google Cloud 上の GKE と GKE on VMware(プレビュー)
- ハイブリッド: Google Cloud 上の GKE とベアメタル版 GKE(プレビュー)
- マルチクラウド: Google Cloud 上の GKE と Amazon EKS(プレビュー)
前提条件
- すべてのクラスタが同じフリートのホスト プロジェクトに登録されている必要があります。
- すべての GKE クラスタが同じネットワーク上の共有 VPC 構成に含まれている必要があります。
- クラスタの Kubernetes コントロール プレーン アドレスとゲートウェイ アドレスが、メッシュ内のすべてのクラスタから到達可能である必要があります。GKE クラスタが配置されている Google Cloud プロジェクトで、外部ロード バランシング タイプの作成が許可されている必要があります。アクセスを制限するには、承認済みネットワークと VPC ファイアウォール ルールを使用することをおすすめします。
- GKE 限定公開クラスタを含む限定公開クラスタはサポートされていません。GKE on VMware と ベアメタル版 GKE を含むオンプレミス クラスタを使用する場合、Kubernetes コントロール プレーンのアドレスとゲートウェイのアドレスは、GKE クラスタの Pod から到達可能である必要があります。GKE クラスタのサブネットをオンプレミス クラスタのネットワークに接続するには、CloudVPN を使用することをおすすめします。
- Istio CA を使用する場合は、すべてのクラスタで同じカスタムルート証明書を使用します。
始める前に
このガイドでは、asmcli
ツールを使用して Anthos Service Mesh がインストールされていることを前提としています。asmcli
と構成パッケージ(asmcli install
の実行時に --output_dir で指定したディレクトリに asmcli
がダウンロードするパッケージ)が必要です。詳細については、依存関係のあるツールをインストールしてクラスタを検証するをご覧ください。
メッシュで設定するすべてのクラスタの kubeconfig ファイルにアクセスする必要があります。GKE クラスタの場合、クラスタの新しい kubeconfig ファイルを作成するには、ターミナルの値としてファイルの完全パスを含む KUBECONFIG
env をエクスポートし、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}"
ネットワーク名の環境変数を作成します。
デフォルトでは、GKE クラスタの名前はクラスタ ネットワーク名になります。
export NETWORK_1="PROJECT_ID-CLUSTER_NETWORK"
他のクラスタは
default
を使用します。export NETWORK_2="default"
--network_id
の値が異なる他のクラスタに Anthos Service Mesh をインストールした場合は、同じ値を NETWORK_2 に渡す必要があります。
east-west ゲートウェイをインストールする
CLUSTER_2(マルチクラウドまたはオンプレミス クラスタ)への east-west トラフィック専用のゲートウェイを CLUSTER_1(ご使用の GKE クラスタ)にインストールします。
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_1} \ --revision asm-1157-23 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
このゲートウェイは、デフォルトではインターネット上で一般公開されます。本番環境のシステムでは、外部からの攻撃を防ぐため、追加のアクセス制限(ファイアウォール ルールなど)が必要になる場合があります。
CLUSTER_1 用の east-west トラフィック専用のゲートウェイを CLUSTER_2 にインストールします。
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_2} \ --revision asm-1157-23 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
サービスを公開する
クラスタは別々のネットワーク上にあるため、すべてのサービス(\*.local
)を両方のクラスタの east-west ゲートウェイ上で公開する必要があります。このゲートウェイはインターネットで一般公開されますが、その背後にあるサービスは、信頼できる mTLS 証明書とワークロード ID を持つサービスのみが、両者が同じネットワーク上にあるかのように、アクセスできます。
クラスタのサービスを East-West ゲートウェイ経由で公開する
kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
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
サービスをマルチクラスタ環境にデプロイして、クラスタ間でのロード バランシングが機能することを確認する方法について説明します。
サイドカー インジェクションを有効にする
リビジョン ラベルの値を特定します。この値は、後の手順で使用します。手順は Anthos Service Mesh のタイプ(マネージドまたはクラスタ内)によって異なります。
マネージド
次のコマンドを使用して、リビジョン ラベルを特定します。このラベルは、後の手順で使用します。
kubectl get controlplanerevision -n istio-system
出力は次のようになります。
NAME RECONCILED STALLED AGE asm-managed-rapid True False 89d
出力の
NAME
列にあるリビジョン ラベルの値をメモします。この例での値はasm-managed-rapid
です。次のセクションの手順でリビジョンの値を使用します。クラスタ内
次のコマンドを使用して、リビジョン ラベルを特定します。このラベルは、後の手順で使用します。
kubectl -n istio-system get pods -l app=istiod --show-labels
出力は次のようになります。
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
出力の
LABELS
列で、接頭辞istio.io/rev=
に続くistiod
リビジョン ラベルの値をメモします。この例での値はasm-173-3
です。次のセクションの手順でリビジョンの値を使用します。
HelloWorld サービスをインストールする
各クラスタにサンプルの名前空間とサービス定義を作成します。次のコマンドにある REVISION を、前の手順でメモした
istiod
リビジョン ラベルに置き換えます。for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite done
ここで、REVISION は、以前にメモした
istiod
のリビジョン ラベルです。次のように出力されます。
label "istio-injection" not found. namespace/sample labeled
label "istio-injection" not found.
は無視しても問題ありません両方のクラスタに 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 ...
ロード バランシングされたマルチクラスタの Anthos Service Mesh の検証はこれで完了です。
クリーンアップ
ロード バランシングの確認が完了したら、クラスタから HelloWorld
サービスと Sleep
サービスを削除します。
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}