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

Container Compute Service:既存の SLB インスタンスを使用してアプリケーションを公開する

最終更新日:Jan 27, 2025

Server Load Balancer (SLB) インスタンスによって公開されているサービスにクラスタ外からアクセスするには、SLB インスタンスのドメイン名または <IP:サービスポート> エンドポイントを使用します。クラスタ内からサービスにアクセスするには、<サービス名:サービスポート> エンドポイントを使用します。このトピックでは、NGINX アプリケーションを例として使用し、Alibaba Cloud Container Service for Kubernetes (ACK) クラスタ内のアプリケーションを公開するために既存の SLB インスタンスを使用する LoadBalancer サービスを作成する方法について説明します。

前提条件

SLB コンソールで SLB インスタンスが作成されています。SLB インスタンスは、ACK クラスタと同じリージョンに属しています。このトピックでは、既存のインターネット向け Classic Load Balancer (CLB) インスタンスが使用されます。CLB インスタンスが存在しない場合は、作成してください。詳細については、「CLB インスタンスの作成と管理」をご参照ください。

使用上の注意

SLB インスタンスの再利用に関する制限

  • 既存の SLB インスタンスを使用してアプリケーションを公開する場合は、次の制限事項に注意してください。

    • SLB コンソールを使用して作成された SLB インスタンスは再利用できます。Cloud Controller Manager (CCM) によって自動的に作成された SLB インスタンスと API サーバーの SLB インスタンスは再利用できません。

    • クラスタのイントラネット SLB インスタンスを再利用するには、SLB インスタンスとクラスタが同じ VPC にデプロイされている必要があります。

    • SLB インスタンスのネットワークタイプは、サービスの接続方法と一致している必要があります。

      • サービスが [インターネットアクセス] (service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet") に使用される場合、SLB インスタンスの [ネットワークタイプ][インターネット向け] である必要があります。

      • サービスが [内部アクセス] (service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet") に使用される場合、SLB インスタンスの [ネットワークタイプ][イントラネット向け] である必要があります。

    • SLB インスタンスが複数のサービスを公開する場合、SLB インスタンスは異なるサービスポートでリッスンする必要があります。

    • 既存の SLB インスタンスを使用して異なるクラスタ内の 2 つのサービスを公開する場合は、2 つのサービスの名前が異なり、異なる名前空間にデプロイされていることを確認してください。

  • CCM は、Type=LoadBalancer が構成されているサービスに対してのみ SLB インスタンスを構成します。CCM は、他のタイプのサービスに対しては SLB インスタンスを構成しません。

    重要

    Type=LoadBalancer が構成されているサービスが別のタイプのサービスに変更されると、CCM は関連する SLB インスタンスに追加された構成を削除します。その結果、SLB インスタンスを使用してサービスにアクセスできなくなります。

  • CCM は宣言型 API を使用し、特定の条件が満たされた場合に、公開されているサービスの構成に合わせて SLB インスタンスの構成を自動的に更新します。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" を指定すると、SLB コンソールで更新した SLB 構成が上書きされる可能性があります。

    重要

    SLB コンソールで、CCM によって作成および管理される SLB インスタンスの構成を変更しないでください。変更すると、変更が上書きされ、サービスにアクセスできなくなる可能性があります。

  • サービスの作成後、LoadBalancer サービスに関連付けられている SLB インスタンスを変更することはできません。SLB インスタンスを変更するには、新しいサービスを作成する必要があります。

SLB リソースクォータ

  • CCM は、Type=LoadBalancer 設定のサービスに対して SLB インスタンスを作成します。デフォルトでは、Alibaba Cloud アカウント内に最大 60 個の SLB インスタンスを持つことができます。さらに SLB インスタンスを作成するには、Quota Centerコンソールにログインしてアプリケーションを送信ことでクォータの増加を申請してください。

  • CCM は、サービス構成に基づいて、SLB インスタンスのバックエンドサーバーグループに Elastic Compute Service (ECS) インスタンスを自動的に追加します。

  • CCM は、サービスポートを使用するリスナーを SLB インスタンスに自動的に作成します。デフォルトでは、各 SLB インスタンスは最大 50 個のリスナーをサポートします。各 SLB インスタンスでサポートされるリスナーの数を増やすには、Quota Centerコンソールにログインしてアプリケーションを送信ことでクォータの増加を申請してください。

  • SLB の制限の詳細については、CLB の制限と NLB の制限をご参照ください。

    SLB リソースクォータを照会するには、SLB コンソールのクォータセンターページにアクセスしてください。

手順 1: アプリケーションをデプロイする

次のセクションでは、kubectl コマンドラインツールを使用してアプリケーションをデプロイする方法について説明します。

  1. Cloud Shell で kubectl を使用して ACK クラスタを管理する

  2. my-nginx.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    YAML ファイルの内容を表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx                 # アプリケーション名
      labels:
        app: nginx
    spec:
      replicas: 3                    # レプリケートされたポッドの数
      selector:
        matchLabels:
          app: nginx                 # アプリケーションを公開するために使用されるサービスの selector パラメータで同じ値を指定する必要があります。
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80               # サービスでこのポートを公開します。
  3. 次のコマンドを実行して、my-nginx アプリケーションをデプロイします。

    kubectl apply -f my-nginx.yaml
  4. 次のコマンドを実行して、アプリケーションのステータスを確認します。

    kubectl get deployment my-nginx

    予期される出力:

    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    my-nginx   3/3     3            3           50s

手順 2: 既存の SLB インスタンスを使用してアプリケーションを公開する

ACK コンソールまたは kubectl を使用して、アプリケーションを公開する LoadBalancer サービスを作成できます。

コンソールの使用

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。

  2. [クラスタ] ページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。

  3. [サービス] ページで、左上の [作成] をクリックします。

  4. [サービスの作成] ダイアログボックスで、必須パラメータを設定します。

    パラメータ

    説明

    [名前]

    サービスの名前を入力します。

    my-nginx-svc

    [タイプ]

    サービスのタイプ。このパラメータは、サービスへのアクセス方法を指定します。

    [サービスの作成]:

    • [サービスの種類]: SLB

    • [SLB の種類]: CLB

    • [リソースの選択]: 既存のリソースを使用

    • [既存のリスナーを上書き]: 選択済み

    [バックエンド]

    サービスに関連付けるバックエンドアプリケーションを選択します。サービスをバックエンドアプリケーションに関連付けない場合、エンドポイントオブジェクトは作成されません。サービスをバックエンドアプリケーションに手動で関連付けることができます。詳細については、services-without-selectors をご参照ください。

    [+ワークロードラベルの参照] をクリックし、my-nginx を選択します。

    • [名前]: app

    • [値]: nginx

    [ポートマッピング]

    サービスポートとコンテナポートを指定します。サービスポートは YAML ファイルの port フィールドに対応し、コンテナポートは YAML ファイルの targetPort フィールドに対応します。コンテナポートは、バックエンドポッドで公開されているポートと同じである必要があります。

    • [サービスポート]: 80

    • [コンテナポート]: 80

    • [プロトコル]: TCP

    [注釈]

    SLB インスタンスに 1 つ以上の注釈を追加します。注釈の詳細については、「注釈を使用して CLB インスタンスを構成する」をご参照ください。

    この例では、帯域幅課金方法を指定し、最大帯域幅を 2 Mbit/s に設定して、サービスを通過するトラフィック量を制限するために、2 つの注釈が追加されています。

    課金方法を指定します。

    • [名前]: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type

    • [値]: paybybandwidth

    最大帯域幅を指定します。

    • [名前]: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth

    • [値]: 2

    [ラベル]

    サービスに 1 つ以上のラベルを追加します。ラベルは、サービスを識別するために使用されます。

    なし

  5. [OK] をクリックします。サービスが作成されると、[サービス] ページに表示されます。

  6. [外部 IP] 列に表示されている外部 IP アドレスを使用して、アプリケーションにアクセスできます。この例では、外部 IP アドレスは [39.106.XX.XX:80] です。

    image

kubectl の使用

  1. my-nginx-svc.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id 注釈を修正し、${YOUR_LB_ID}SLB コンソール で作成した SLB インスタンスの実際の ID に置き換えます。

    • 既存の SLB インスタンスを使用する場合、CCM はデフォルトで SLB インスタンスのリスナーを作成したり、SLB インスタンスのリスナーを上書きしたりしません。CCM に新しいリスナーを作成させたり、既存のリスナーを上書きさせたりするには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerstrue に設定します。この例では、新しい SLB インスタンスが作成され、新しいリスナーを作成する必要があります。したがって、この注釈を true に設定します。注釈の詳細については、「注釈を使用して CLB インスタンスを構成する」をご参照ください。

    • 作成したバックエンドアプリケーションにサービスを関連付けるには、selectormy-nginx.yaml ファイルの matchLabels フィールドの値に設定します。この例では、値は app: nginx に設定されています。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID}
        service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
      labels:
        app: nginx
      name: my-nginx-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  2. 次のコマンドを実行して、my-nginx-svc という名前のサービスを作成し、サービスを使用してアプリケーションを公開します。

    kubectl apply -f my-nginx-svc.yaml
  3. 次のコマンドを実行して、LoadBalancer サービスが作成されているかどうかを確認します。

    kubectl get svc my-nginx-svc

    予期される出力:

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    my-nginx-svc   LoadBalancer   172.21.5.82   39.106.XX.XX     80/TCP         5m
  4. curl <YOUR-External-IP> コマンドを実行して、アプリケーションにアクセスします。YOUR-External-IP を、前の出力の EXTERNAL-IP 列に表示されている IP アドレスに置き換えます。

    curl 39.106.XX.XX

    予期される出力:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>