Share via


Azure Kubernetes Fleet Manager メンバー クラスター間でマルチクラスター レイヤー 4 負荷分散を設定する (プレビュー)

複数のクラスターをまたいでデプロイされたアプリケーションの場合、管理者は多くの場合、受信トラフィックをクラスター間でルーティングしたいと考えます。

このドキュメントに従うと、そのようなマルチクラスター アプリケーションのレイヤー 4 負荷分散を設定できます。

重要

Azure Kubernetes Fleet Manager のプレビュー機能は、セルフサービス、オプトイン ベースで利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Fleet Manager のプレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

  • 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 つずつ個別にデプロイすることもできます。

  1. フリート クラスターに名前空間を作成します。

    KUBECONFIG=fleet kubectl create namespace kuard-demo
    

    出力は次の例のようになります。

    namespace/kuard-demo created
    
  2. 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
    
  3. crp-2.yaml というファイルに次の ClusterResourcePlacement を作成します。 eastus リージョン内のクラスターが選択されていることに注目してください。

    apiVersion: placement.kubernetes-fleet.io/v1beta1
    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
    
  4. ClusterResourcePlacement を適用します。

    KUBECONFIG=fleet kubectl apply -f crp-2.yaml
    

    これに成功した場合の出力は、次の例のようになります。

    clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
    
  5. ClusterResourcePlacement の状態を確認します。

    KUBECONFIG=fleet kubectl get clusterresourceplacements
    

    これに成功した場合の出力は、次の例のようになります。

    NAME            GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
    kuard-demo      1     True        1              True      1            20s
    

MultiClusterService を作成して、複数のメンバー クラスター内のサービス エンドポイント間で負荷分散を行う

  1. 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-CONFLICTfalse) ことがわかります。

    Note

    ServiceExport が伝達されるまでに 1、2 分かかる場合があります。

  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
    
  3. 次のコマンドを実行して、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 アドレスが使用可能になるまでに時間がかかる場合があります。

  4. 外部ロード バランサーの IP アドレスを使用して、次のコマンドを複数回実行します。

    curl <a.b.c.d>:8080 | grep addrs 
    

    要求を処理するポッドの IP が変更されていること、かつこれらのポッドが eastus リージョンのメンバー クラスター aks-member-1aks-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