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

Container Service for Kubernetes:複数リージョンの Service を公開するための ELB インスタンスの使用

最終更新日:Dec 23, 2025

Kubernetes クラスターでは、Service を使用して Pod を外部アクセスに公開し、フロントエンドとバックエンドを分離します。これにより、疎結合のマイクロサービス設計が可能になります。ACK Edge クラスターでは、通常、LoadBalancer Service を使用してアプリケーションを公開します。このトピックでは、Edge Load Balancer (ELB) インスタンスを使用して、複数リージョンの Edge Node Service (ENS) ノードプールにデプロイされた Service を公開する方法について説明します。

概要

ACK Edge クラスターのノードプールは、クラウドノードプールとエッジノードプールに分類できます。ACK Edge クラスターでは、LoadBalancer Service を使用して、クラウドノードプールまたはエッジノードプールにデプロイされたアプリケーションを公開できます。

このトピックでは、ELB Service を使用してエッジノードプールにデプロイされたアプリケーションを公開します。次の図では、ACK Edge クラスターのコントロールプレーンが Virtual Private Cloud (VPC) にデプロイされています。異なるネットワークのデータセンターにあるコンピューティングリソースをクラウドに接続し、LoadBalancer Service を使用して異なるリージョンにあるアプリケーションのグループを公開できます。これは、LoadBalancer Service が複数のデータセンターのエンドポイントにマッピングされることを意味します。

この例では、ENS ノードプールが中国 (合肥) と中国 (成都) リージョンに作成されます。ELB インスタンスは、2 つのリージョンのアプリケーションからのリクエストを分散するために使用されます。

image

ACK Edge クラスターでは、カスタムクラスターリソース PoolService を作成できます。edge-controller-manager (ECM) コンポーネントは、作成した LoadBalancer Service に基づいてノードプールによって管理される PoolService を自動的に選択し、同じリージョン内の Server Load Balancer (SLB) インスタンスのライフサイクルを PoolService にバインドできます。

注意事項

  • ECM は、タイプが Type=LoadBalancer の Service に対してのみ SLB インスタンスを構成します。ECM のバージョンは 2.1.0 以降である必要があります。

  • ECM によって管理される ELB インスタンスは、k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id} というフォーマットで命名されます。同じ名前の ELB インスタンスが誤って削除されるのを防ぐため、重複した名前は使用しないでください。

  • ECM によって管理される Elastic IP アドレス (EIP) は、k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id} というフォーマットで命名されます。同じ名前の EIP が誤って削除されるのを防ぐため、重複した名前は使用しないでください。

  • 1 つの ELB インスタンスを共有する複数の Service を作成するには、自己管理型の EIP と ELB インスタンスを選択する必要があります。さらに、外部トラフィックポリシーのタイプは Cluster である必要があります。

  • エッジネットワークを作成し、Elastic Network Interface (ENI) が割り当てられていない ENS インスタンスを作成し、ELB インスタンスを使用して ENS インスタンスを公開することを推奨します。ENS インスタンスのインターネットアクセスを有効にするには、ENS インスタンスに EIP を割り当てるか、NAT を設定します。

  • ENI が割り当てられた ENS インスタンスを作成する場合も、ELB インスタンスが必要です。この場合、ENS インスタンスのホストネットワークにルーティングルールを追加する必要があります。

    # この例では、10.0.0.3 は内部ネットワークインターフェースコントローラーを示し、10.0.0.1 は内部ゲートウェイアドレスを示します。
    ip rule add from 10.0.0.3 lookup 4
    ip route add default via 10.0.0.1 table 4

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

この例では、cube という名前のアプリケーションが ENS ノードプールの各ノードにデプロイされます。

  1. 次の YAML ファイルは DaemonSet を作成します。

    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. アプリケーションのステータスを照会します。

    kubectl get ds cube

    期待される出力:

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

ステップ 2:すべてのノードプールへの属性アノテーションと Service ラベルの追加

エッジにあるすべての ENS ノードプールに属性アノテーションと Service ラベルを追加する必要があります。この例では、中国 (合肥) および中国 (成都) リージョンの ENS ノードプールに対して次の操作を実行します。

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

    kubectl get nodepool
  2. ネットワーク ID を追加します。

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-network-id=n-xxx 
  3. ENS ノード ID (VPC 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. Service ラベルを追加します。

    kubectl label nodepool np-xxx k8s-svc=cube

ステップ 3:複数リージョンの ELB Service を使用したアプリケーションの公開

重要
  • Service を作成するときは、Service タイプを type: LoadBalancer に設定します。

  • ELB Service を作成するには、LoadBalancer タイプを loadBalancerClass: alibabacloud.com/elb に設定する必要があります。

既存の ELB インスタンスを使用してアプリケーションを公開できます。利用可能な ELB インスタンスがない場合は、自動的に作成された ELB インスタンスを使用してアプリケーションを公開できます。

ELB の更新ポリシーは、アプリケーションを公開するために使用するメソッドによって異なります。詳細については、「ELB の更新ポリシー」をご参照ください。

自動作成された複数リージョンの ELB Service を使用したアプリケーションの公開

重要

次の操作は、自動的に作成された ELB インスタンスと EIP を削除します。注意して進めてください。

  • ELB Service を削除すると、すべてのノードプールに対応する ELB インスタンスが削除されます。

  • ノードプールを削除すると、対応する ELB インスタンスも削除されます。

  • Service のノードプールセレクターを更新すると、セレクターに一致しないノードプールに対応する ELB インスタンスも削除されます。

  • ノードプールのラベルを更新すると、ノードプールが Service のノードプールセレクターに一致しなくなる可能性があります。その結果、ノードプールに対応する ELB インスタンスが削除されます。

  1. cube-svc.yaml という名前のファイルを作成し、次の YAML コンテンツをファイルに追加します。

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool            # Service トポロジー機能を有効にします。
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube  # ENS ノードプールを選択します。
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80
  2. cube-svc という名前の Service をデプロイし、その Service を使用してアプリケーションを公開します。

    kubectl apply -f cube-svc.yaml
  3. cube-svc Service が作成されたことを確認します。

    kubectl get 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
  4. アプリケーションにアクセスします。

    説明

    前の手順で返された EXTERNAL-IP<YOUR-External-IP> に置き換えてください。

    curl http://<YOUR-External-IP>:80  

既存の複数リージョンの ELB Service を使用したアプリケーションの公開

  1. cube-svc という名前のファイルを作成し、次の YAML コンテンツをファイルに追加します。

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool             # Service トポロジー機能を有効にします。
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube   # ENS ノードプールを選択します。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true" # Service を自己管理のロードバランサーにマウントします。
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80
  2. cube-svc という名前の Service をデプロイし、その Service を使用してアプリケーションを公開します。

    kubectl apply -f cube-svc.yaml
  3. 自動的に作成された PoolService を照会します。

    kubectl get ps 

    期待される出力:

    NAME                             AGE
    cube-svc-np-heifei               32s
    cube-svc-np-chengdu              32s
  4. 各リージョンの PoolService に既存の ELB インスタンスを指定します。

    この例では、中国 (合肥) および中国 (成都) リージョンの各 PoolService に既存の ELB インスタンスが指定されます。

    • 中国 (合肥) リージョンのノードプールに既存の ELB インスタンスを指定します。

      kubectl annotate ps cube-svc-np-heifei  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
    • 中国 (成都) リージョンのノードプールに、既存の ELB インスタンスを指定します。

      kubectl annotate ps cube-svc-np-chengdu service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
  5. cube-svc Service が作成されたことを確認します。

    kubectl get 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. アプリケーションにアクセスします。

    説明

    前の手順で返された EXTERNAL-IP<YOUR-External-IP> に置き換えてください。

    curl http://<YOUR-External-IP>:80

ELB の更新ポリシー

リソースオブジェクト

ユーザー管理の ELB インスタンス (手動で作成された ELB インスタンス)

ECM 管理の ELB インスタンス (自動で作成された ELB インスタンス)

ELB 属性

  • 作成:ノードプールセレクターと ELB インスタンス ID を指定する必要があります。次のアノテーションを追加します。

    • service.openyurt.io/nodepool-labelselector

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user

  • 更新:ELB インスタンスの属性は更新できません。

  • 削除:ELB インスタンスは自動的にリリースできません。

  • 作成:ノードプールセレクターを指定する必要があります。次のアノテーションを追加します。

    service.openyurt.io/nodepool-labelselector

  • 更新:ELB インスタンスの属性は更新できません。

  • 削除:ELB インスタンスは自動的に削除できません。

バックエンドサーバーグループ

  • 作成:バックエンドサーバーグループは、Service と Pod のステータスに基づいて更新されます。

  • 更新:ローカルモードでは、バックエンドサーバーが動的に追加または削除されます。

  • 削除:ELB インスタンスのバックエンドサーバーグループは自動的に削除できません。手動で削除する必要があります。

  • 作成:バックエンドサーバーグループは、Service と Pod のステータスに基づいて更新されます。

  • 更新:ローカルモードでは、バックエンドサーバーが動的に追加または削除されます。

  • 削除:すべてのバックエンドサーバーグループは自動的に削除されます。

リスナー

  • 作成:リスナーは、Service の spec.Ports に基づいて自動的に追加されます。

  • 更新:リスナーは、Service のポートの変更に基づいて自動的に追加、更新、削除されます。

  • 削除:リスニングポートは自動的に削除されません。手動で削除する必要があります。

  • 作成:リスナーは、Service の spec.Ports に基づいて自動的に追加されます。

  • 更新:リスナーは、Service のポートの変更に基づいて自動的に追加、更新、削除されます。

  • 削除:すべてのリスナーは自動的に削除されます。

EIP 属性

  • 作成:EIP は自動的に作成できません。EIP を手動で管理する必要があります。

  • 更新:EIP の属性は更新できません。

  • 削除:EIP は自動的に削除できません。

  • 作成:EIP は ELB インスタンスのリージョンで自動的に作成されます。

  • 更新:EIP の帯域幅は増減できます。

  • 削除:EIP は自動的に削除できます。

関連ドキュメント