Azure Kubernetes Fleet Manager メンバー クラスター間でマルチクラスター レイヤー 4 負荷分散を設定する (プレビュー)
複数のクラスターをまたいでデプロイされたアプリケーションの場合、管理者は多くの場合、受信トラフィックをクラスター間でルーティングしたいと考えます。
このドキュメントに従うと、そのようなマルチクラスター アプリケーションのレイヤー 4 負荷分散を設定できます。
重要
Azure Kubernetes Fleet Manager のプレビュー機能は、セルフサービス、オプトイン ベースで利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Fleet Manager のプレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。
前提条件
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
このドキュメントで参照されている
ServiceExport
オブジェクトとMultiClusterService
オブジェクトに関する説明を、この機能の概念的概要でお読みください。1 つのハブ クラスターと複数のメンバー クラスターを持つフリート リソースが存在する必要があります。 このリソースがない場合は、フリート リソースを作成してメンバー クラスターを参加させるクイックスタートに関する記事に従います。
ワークロードがデプロイされている、ターゲットの Azure Kubernetes Service (AKS) クラスターは、同じ仮想ネットワーク、またはピアリングされた仮想ネットワーク上のいずれかに存在する必要があります。
- これらのターゲット クラスターは、フリート リソースにメンバー クラスターとして追加する必要があります。
- これらのターゲット クラスターでは、Azure CNI (Container Networking Interface) ネットワークを使用する必要があります。
「Fleet ハブ クラスターの Kubernetes API にアクセスする」の手順に従って、ハブ クラスターの Kubernetes API にアクセスする必要があります。
次の環境変数を設定し、フリートとすべてのメンバー クラスターの kubeconfig を取得します。
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBER_CLUSTER_1=aks-member-1 export MEMBER_CLUSTER_2=aks-member-2 az fleet get-credentials --resource-group ${GROUP} --name ${FLEET} --file fleet az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_1} --file aks-member-1 az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_2} --file aks-member-2
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
フリート リソースのメンバー クラスター間でワークロードをデプロイする
Note
このハウツー ガイドの手順では、デモンストレーションのみを目的にサンプル アプリケーションを参照しています。 このワークロードは、既存の Deployment オブジェクトと Service オブジェクトのいずれかに置き換えることができます。
これらの手順では、Kubernetes 構成の伝達を使用して、フリート クラスターからメンバー クラスターにサンプル ワークロードをデプロイします。 または、これらの Kubernetes 構成を各メンバー クラスターに 1 つずつ個別にデプロイすることもできます。
フリート クラスターに名前空間を作成します。
KUBECONFIG=fleet kubectl create namespace kuard-demo
出力は次の例のようになります。
namespace/kuard-demo created
Deployment、Service、ServiceExport の各オブジェクトを適用します。
KUBECONFIG=fleet kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-export-service.yaml
上記のファイルの
ServiceExport
の仕様では、メンバー クラスターからフリート リソースにサービスをエクスポートできます。 正常にエクスポートされると、サービスとそのすべてのエンドポイントはフリート クラスターに同期され、その後これらのエンドポイント間でマルチクラスター負荷分散を設定するのに使用できます。 出力は次の例のようになります。deployment.apps/kuard created service/kuard created serviceexport.networking.fleet.azure.com/kuard created
crp-2.yaml
というファイルに次のClusterResourcePlacement
を作成します。eastus
リージョン内のクラスターが選択されていることに注目してください。apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: kuard-demo spec: resourceSelectors: - group: "" version: v1 kind: Namespace name: kuard-demo policy: affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus
ClusterResourcePlacement
を適用します。KUBECONFIG=fleet kubectl apply -f crp-2.yaml
これに成功した場合の出力は、次の例のようになります。
clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
ClusterResourcePlacement
の状態を確認します。KUBECONFIG=fleet kubectl get clusterresourceplacements
これに成功した場合の出力は、次の例のようになります。
NAME GEN SCHEDULED SCHEDULEDGEN APPLIED APPLIEDGEN AGE kuard-demo 1 True 1 True 1 20s
MultiClusterService を作成して、複数のメンバー クラスター内のサービス エンドポイント間で負荷分散を行う
eastus
リージョン内のメンバー クラスターに、サービスが正常にエクスポートされたことを確認します。KUBECONFIG=aks-member-1 kubectl get serviceexport kuard --namespace kuard-demo
出力は次の例のようになります。
NAME IS-VALID IS-CONFLICTED AGE kuard True False 25s
KUBECONFIG=aks-member-2 kubectl get serviceexport kuard --namespace kuard-demo
出力は次の例のようになります。
NAME IS-VALID IS-CONFLICTED AGE kuard True False 55s
サービスのエクスポートが有効であり (
IS-VALID
フィールドがtrue
)、他のエクスポートと競合がない (IS-CONFLICT
がfalse
) ことがわかります。Note
ServiceExport が伝達されるまでに 1、2 分かかる場合があります。
1 つのメンバーに対して
MultiClusterService
を作成し、これらのクラスター内のサービス エンドポイント間で負荷分散を行います。KUBECONFIG=aks-member-1 kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-mcs.yaml
Note
パブリック IP ではなく内部 IP を介してサービスを公開するには、MultiClusterService に注釈を追加します。
apiVersion: networking.fleet.azure.com/v1alpha1 kind: MultiClusterService metadata: name: kuard namespace: kuard-demo annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" ...
出力は次の例のようになります。
multiclusterservice.networking.fleet.azure.com/kuard created
次のコマンドを実行して、MultiClusterService が有効であることを確認します。
KUBECONFIG=aks-member-1 kubectl get multiclusterservice kuard --namespace kuard-demo
出力は次の例のようになるはずです。
NAME SERVICE-IMPORT EXTERNAL-IP IS-VALID AGE kuard kuard <a.b.c.d> True 40s
IS-VALID
フィールドは出力ではtrue
になっているはずです。 出力で外部ロード バランサーの IP アドレス (EXTERNAL-IP
) を確認します。 インポートが完全に処理され、IP アドレスが使用可能になるまでに時間がかかる場合があります。外部ロード バランサーの IP アドレスを使用して、次のコマンドを複数回実行します。
curl <a.b.c.d>:8080 | grep addrs
要求を処理するポッドの IP が変更されていること、かつこれらのポッドが
eastus
リージョンのメンバー クラスターaks-member-1
とaks-member-2
からのものであることに注目してください。 ポッド の IP を確認するには、eastus
リージョンのクラスターで次のコマンドを実行します。KUBECONFIG=aks-member-1 kubectl get pods -n kuard-demo -o wide
KUBECONFIG=aks-member-2 kubectl get pods -n kuard-demo -o wide
Azure Kubernetes Service