すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:複数リージョンで ELB を使用してサービスを公開

最終更新日:Mar 27, 2026

ACK Edge クラスターでは、複数のエッジリージョンにわたるコンピューティングリソースをクラウドに接続し、単一の LoadBalancer Service を介して公開できます。このトピックでは、Edge Load Balancer (ELB) インスタンスを使用して、複数のリージョンにデプロイされた Edge Node Service (ENS) ノードプール内の Service を公開する方法について説明します。

仕組み

ACK Edge クラスターのノードプールは、クラウドノードプールまたはエッジノードプールに分類されます。ELB インスタンスはエッジノードプールの負荷分散を処理し、各 ELB インスタンスは単一リージョンにスコープされます。

LoadBalancer Service を作成すると、edge-controller-manager (ECM) は、一致するノードプールごとに PoolService を自動的に作成します。各 PoolService は、そのリージョン内の ELB インスタンスのライフサイクルを管理します。その結果、単一の LoadBalancer Service は、複数のデータセンターのエンドポイント (リージョンごとに 1 つの ELB インスタンス) にマップされます。

次の図は、このアーキテクチャを示しています。ENS ノードプールは 2 つのリージョン (中国 (合肥) と中国 (成都)) にデプロイされており、LoadBalancer Service は個別の ELB インスタンスを介して両方のリージョンでアプリケーションを公開します。

image

前提条件

開始する前に、次のことを確認してください。

  • ターゲットリージョンに ENS ノードプールを持つ ACK Edge クラスター

  • ECM バージョン 2.1.0 以降

  • クラスターに接続するように構成された kubectl CLI

  • (セルフマネージド ELB の場合) 各ターゲットリージョンに既存の ELB インスタンス

注意事項

  • ECM は、type: LoadBalancer を持つ Service に対してのみ ELB インスタンスを構成します。

  • ECM によって管理される ELB インスタンスは、k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id} 形式で命名されます。誤削除を防ぐため、重複する名前は避けてください。

  • ECM によって管理される Elastic IP アドレス (EIP) も同じ命名形式に従います。誤削除を防ぐため、重複する名前は避けてください。

  • 複数の Service で 1 つの ELB インスタンスを共有するには、セルフマネージド EIP と ELB インスタンスを使用し、externalTrafficPolicyCluster に設定します。

  • Elastic Network Interface (ENI) を持たない ENS インスタンスの場合は、エッジネットワークを作成し、ELB インスタンスを使用して公開します。インターネットアクセスを有効にするには、ENS インスタンスに EIP を割り当てるか、NAT を構成します。

  • ENI を持つ ENS インスタンスの場合は、ホストネットワークにルーティングルールを追加します。

    # 10.0.0.3: internal network interface controller; 10.0.0.1: internal gateway address
    ip rule add from 10.0.0.3 lookup 4
    ip route add default via 10.0.0.1 table 4

ELB 管理アプローチの選択

ECM が ELB ライフサイクルを完全に管理するか、既存の ELB インスタンスの制御を維持するかによって、2 つのアプローチが利用可能です。

基準 自動管理 ELB セルフマネージド ELB
EIP 管理 リージョンごとに自動的に作成および削除される 手動。EIP は自動的に作成または削除されません
ELB インスタンスの制御 ECM はインスタンスを自動的に作成および命名します ノードプールごとに既存の ELB インスタンス ID を指定します
複数の Service で 1 つの ELB を共有 サポートされていません サポートされています (externalTrafficPolicy: Cluster が必要)
Service またはノードプール削除時のクリーンアップ ELB インスタンスと EIP は自動的に削除されます ELB インスタンスと EIP は保持されます。手動でのクリーンアップが必要です
使用する場合 ゼロコンフィグレーションの負荷分散が必要な場合 ELB インスタンスを正確に制御する必要がある場合、または複数の Service で 1 つの ELB を共有する場合
重要

自動管理 ELB Service またはそれに関連付けられたノードプールを削除すると、対応する ELB インスタンスと EIP も削除されます。ノードプールセレクターまたはノードプールラベルを更新すると、ノードプールがセレクターに一致しなくなった場合に ELB インスタンスの削除がトリガーされることもあります。

ステップ 1: アプリケーションのデプロイ

ENS ノードプール内のすべてのノードに cube という名前の DaemonSet をデプロイします。

  1. 次の内容で cube.yaml という名前のファイルを作成します。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: cube
      labels:
        app: cube
    spec:
      selector:
        matchLabels:
          app: cube
      template:
        metadata:
          labels:
            app: cube
        spec:
          containers:
          - name: cube
            image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0
            ports:
            - containerPort: 80
  2. マニフェストを適用します。

    kubectl apply -f cube.yaml
  3. DaemonSet が実行中であることを確認します。

    kubectl get ds cube

    期待される出力:

    NAME   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    cube   4         4         4       4            4           <none>          3d1h

ステップ 2: ノードプールへのアノテーションの追加

各 ENS ノードプールにネットワークアノテーションと Service ラベルを追加します。この例では、中国 (合肥) および中国 (成都) のノードプールに対して、各リージョンで繰り返します。

  1. ノードプール名を取得します。

    kubectl get nodepool
  2. ネットワーク ID アノテーションを追加します。

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-network-id=n-xxx
  3. リージョン ID アノテーションを追加します。

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-region-id=cn-xxx-xxx
  4. vSwitch ID アノテーションを追加します。

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxx
  5. LoadBalancer Service がこのノードプールを選択できるように Service ラベルを追加します。

    kubectl label nodepool np-xxx k8s-svc=cube

ステップ 3: マルチリージョン ELB Service でアプリケーションを公開

2 つのオプションがあります。既存の ELB インスタンスがない場合は、オプション A を使用します。既存の ELB インスタンスがあり、それらを制御する必要がある場合は、オプション B を使用します。

オプション A:自動管理 ELB

ECM は、一致する各リージョンで ELB インスタンスと EIP を自動的に作成および管理します。

  1. 次の内容で cube-svc.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           # Enable Service topology
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube # Select ENS node pools
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80
  2. マニフェストを適用します。

    kubectl apply -f cube-svc.yaml
  3. サービスが作成され、外部 IP が割り当てられていることを確認します。

    kubectl get svc cube-svc

    期待される出力:

    NAME       TYPE           CLUSTER-IP        EXTERNAL-IP                    PORT(S)        AGE
    cube-svc   LoadBalancer   192.168.xxx.xxx   39.106.XX.XX,144.121.XX.XX     80:30081/TCP   5m

    EXTERNAL-IP フィールドには、リージョンごとに 1 つの IP がカンマ区切りでリストされます。

  4. アプリケーションへのアクセスを確認します。

    curl http://<EXTERNAL-IP>:80

    前のステップで取得した IP アドレスのいずれかで <EXTERNAL-IP> を置き換えます。

オプション B:自己管理 ELB

ノードプールごとに独自の ELB インスタンスを指定します。ECM は PoolService を自動的に作成しますが、ELB インスタンスのライフサイクルは管理しません。

  1. 次の内容で cube-svc.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool                                    # Enable Service topology
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube                          # Select ENS node pools
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"     # Use self-managed ELB
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80
  2. マニフェストを適用します。

    kubectl apply -f cube-svc.yaml
  3. 各ノードプールに対して PoolService が作成されていることを確認します。

    kubectl get ps

    期待される出力:

    NAME                    AGE
    cube-svc-np-heifei      32s
    cube-svc-np-chengdu     32s

    各 PoolService は 1 つのノードプールに対応します。この時点では、ELB インスタンスはまだアタッチされていません。

  4. 既存の ELB インスタンスを各 PoolService にバインドします。

    • 中国 (合肥) ノードプール:

      kubectl annotate ps cube-svc-np-heifei service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
    • 中国 (成都) ノードプール:

      kubectl annotate ps cube-svc-np-chengdu service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
  5. サービスに外部 IP が割り当てられていることを確認します。

    kubectl get svc cube-svc

    期待される出力:

    NAME       TYPE           CLUSTER-IP        EXTERNAL-IP                    PORT(S)        AGE
    cube-svc   LoadBalancer   192.168.xxx.xxx   39.106.XX.XX,144.121.XX.XX     80:30081/TCP   5m
  6. アプリケーションへのアクセスを確認します。

    curl http://<EXTERNAL-IP>:80

    前のステップで取得した IP アドレスのいずれかで <EXTERNAL-IP> を置き換えます。

ELB 更新ポリシー

次の表は、自動管理 ELB インスタンスとセルフマネージド ELB インスタンスのどちらを使用するかに基づいて、ELB リソースがどのように管理されるかを示しています。

リソース セルフマネージド ELB 自動管理 ELB
ELB 属性 作成: service.openyurt.io/nodepool-labelselectorservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user を使用して、ノードプールセレクターと ELB インスタンス ID を指定します。更新: 属性は更新できません。削除: ELB インスタンスは自動的にリリースされません。 作成: service.openyurt.io/nodepool-labelselector を使用してノードプールセレクターを指定します。更新: 属性は更新できません。削除: ELB インスタンスは自動的に削除されません。
バックエンドサーバーグループ 作成: Service と Pod のステータスに基づいて更新されます。更新: バックエンドサーバーは動的に追加または削除されます (ローカルモード)。削除: バックエンドサーバーグループは自動的に削除されません。手動での削除が必要です。 作成: Service と Pod のステータスに基づいて更新されます。更新: バックエンドサーバーは動的に追加または削除されます (ローカルモード)。削除: すべてのバックエンドサーバーグループは自動的に削除されます。
リスナー 作成: spec.ports に基づいて自動的に追加されます。更新: ポートの変更に基づいて自動的に追加、更新、削除されます。削除: リスナーは自動的に削除されません。手動での削除が必要です。 作成: spec.ports に基づいて自動的に追加されます。更新: ポートの変更に基づいて自動的に追加、更新、削除されます。削除: すべてのリスナーは自動的に削除されます。
EIP 属性 作成: EIP は自動的に作成されません。手動での管理が必要です。更新: EIP 属性は更新できません。削除: EIP は自動的に削除されません。 作成: EIP は各リージョンで自動的に作成されます。更新: EIP 帯域幅は増減できます。削除: EIP は自動的に削除されます。

次のステップ