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

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

最終更新日:Oct 29, 2024

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

概要

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

このトピックでは、ELBサービスを使用して、エッジノードプールにデプロイされたアプリケーションを公開します。 次の図では、ACK Edgeクラスターの制御プレーンが仮想プライベートクラウド (VPC) にデプロイされています。 さまざまなネットワークのデータセンターのコンピューティングリソースをクラウドに接続し、LoadBalancerサービスを使用してさまざまなリージョンのアプリケーショングループを公開できます。 つまり、LoadBalancerサービスは複数のデータセンターのエンドポイントにマッピングされます。

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

image

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

注意事項

  • ECMは、タイプがType=LoadBalancerのサービスに対してのみ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インスタンスを共有する複数のサービスを作成するには、セルフマネージドEIPとELBインスタンスを選択する必要があります。 また、外部トラフィックポリシーのタイプはクラスターである必要があります。

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

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

    # In this example, 10.0.0.3 indicates the internal network interface controller, and 10.0.0.1 indicates the internal gateway address.
    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ファイルはDeamonSetを作成します。

    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 #Expose the port.

  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: すべてのノードプールに属性注釈とサービスラベルを追加する

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

  1. 次のコマンドを実行して、ネットワークIDを追加します。

    kubectl annotate np np-chengdu alibabacloud.com/ens-network-id=n-xxx 

    に注釈を付ける

  2. 次のコマンドを実行して、ENSノードID (VPC ID) を追加します。

    kubectl annotate np np-chengdu alibabacloud.com/ens-region-id=cn-xxx-xxx

    に注釈を付ける

  3. 次のコマンドを実行してvSwitch IDを追加します。

    kubectl annotate np np-chengdu alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxx

    に注釈を付ける

  4. 次のコマンドを実行して、サービスラベルを追加します。

    kubectl label nodepool np-chengdu k8s-svc=cube

ステップ3: マルチリージョンELBサービスを使用してアプリケーションを公開する

重要
  • サービスを作成するときに、サービスタイプをtype: LoadBalancerに設定します。

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

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

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

自動的に作成されたマルチリージョンELBサービスを使用してアプリケーションを公開する

重要

次の操作では、自動的に作成されたELBインスタンスとEIPが削除されます。 作業は慎重に行ってください。

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

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

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

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

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

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool            #Enable the Service topology feature.
        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. 次のコマンドを実行してcube-svcという名前のサービスをデプロイし、サービスを使用してアプリケーションを公開します。

    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. 次のコマンドを実行して、アプリケーションにアクセスします。

    説明

    <YOUR-External-IP> を、前の手順で返されたEXTERNAL-IPに置き換えます。

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

既存のマルチリージョンELBサービスを使用してアプリケーションを公開する

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

    apiVersion: v1
    種類: サービス
    メタデータ:
      名前: cube-svc
      ラベル:
        アプリ: キューブ
      アノテーション:
        openyurt.io/topologyKeys: openyurt.io/nodepool# サービストポロジ機能を有効にします。
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube# ENSノードプールを選択します。 
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"# サービスを自己管理型ロードバランサーにマウントします。
    仕様:
      セレクタ:
        アプリ: キューブ
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ポート:
      -name: キューブ
        ポート: 80
        protocol: TCP
        targetPort: 80 
  2. 次のコマンドを実行してcube-svcという名前のサービスをデプロイし、サービスを使用してアプリケーションを公開します。

    kubectl apply -f cube-svc.yaml
  3. 次のコマンドを実行して、自動的に作成されたPoolServicesを照会します。

    kubectl get ps

    期待される出力:

    名前の年齢
    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

    期待される出力:

    名タイプCLUSTER-IP EXTERNAL-IPポート年齢
    cube-svc LoadBalancer 192.168.xxx.xxx 39.106.XX.XX、144.121.XX.XX 80:30081/TCP 5m 
  6. 次のコマンドを実行して、アプリケーションにアクセスします。

    説明

    <YOUR-External-IP> を、前の手順で返されたEXTERNAL-IPに置き換えます。

    curl http:// <あなたの外部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インスタンスは自動的に削除できません。

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

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

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

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

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

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

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

リスナー

  • 作成: リスナーは、サービスの仕様ポートに基づいて自動的に追加されます。

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

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

  • 作成: リスナーは、サービスの仕様ポートに基づいて自動的に追加されます。

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

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

EIP属性

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

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

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

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

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

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

関連ドキュメント