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

Container Compute Service:既存のロードバランサーを使用したアプリケーションの公開

最終更新日:Jun 21, 2026

Alibaba Cloud のServer Load Balancer (SLB) で公開する Service には、クラスター外部からは SLB ドメイン名または <IP:Service Port> を使用して、クラスター内部からは <Service Name:Service Port> を使用してアクセスできます。本記事では、Nginx アプリケーションを例に、既存のロードバランサーを使用する Service で ACS クラスター内のアプリケーションを公開する方法を説明します。

前提条件

SLB コンソールで作成した SLB インスタンスが必要です。このインスタンスは、ACS クラスターと同じリージョンにある必要があります。ここでは、インターネット向けのクラシックロードバランサー (CLB) インスタンスを例として使用します。CLB インスタンスがない場合は、「CLBインスタンスの作成と管理」をご参照ください。

考慮事項

SLB 再利用の制限

  • 再利用する SLB インスタンスは、次の要件を満たす必要があります。

    • SLB コンソールで手動で作成した SLB インスタンスのみ再利用できます。クラウドコントローラーマネージャー (CCM) によって自動的に作成されたインスタンスや、クラスターの API サーバーによって使用されるインスタンスは再利用できません。

    • ACS クラスターでイントラネット SLB インスタンスを再利用するには、SLB インスタンスと ACS クラスターが同じ仮想プライベートクラウド (VPC) 内にある必要があります。

    • SLB インスタンスのアドレスタイプは、Service のアクセスタイプと一致する必要があります。

      • Service が[パブリック]を提供する場合 (アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet" で指定)、SLB インスタンスの[アドレスタイプ]は[インターネット]である必要があります。

      • Service が内部アクセスを提供する場合 (アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet" で指定)、SLB インスタンスの[アドレスタイプ]は[内部ネットワーク]である必要があります。

    • 複数の Service で、同じ SLB インスタンス上の同じリスナーポートを使用することはできません。

    • 複数のクラスター間で SLB インスタンスを再利用する場合は、各クラスターで namespace と Service 名の組み合わせが一意であることを確認してください。

  • CCM は、type: LoadBalancer の Service に対してのみ SLB インスタンスを設定します。

    重要

    type: LoadBalancer の Service を別のタイプに変更すると、CCM は SLB インスタンスに追加した設定を削除します。その結果、Service は SLB インスタンス経由でアクセスできなくなります。

  • CCM は宣言型 API を使用し、特定の条件下で Service の設定に基づいて SLB の設定を自動的に調整します。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" アノテーションが設定されている場合、SLB コンソールで手動で変更した設定が上書きされる可能性があります。

    重要

    ACS によって管理されている SLB インスタンスの設定は、SLB コンソールで手動で変更しないでください。変更すると、設定が失われ、Service にアクセスできなくなる可能性があります。

  • 既存の LoadBalancer Service の SLB インスタンスは変更できません。SLB インスタンスを変更する場合は、新しい Service を作成する必要があります。

SLB のクォータ制限

  • CCM は、Type=LoadBalancer の Service ごとに SLB インスタンスを作成します。デフォルトでは、最大 60 個の CLB インスタンスと 60 個の NLB インスタンスを持つことができます。このクォータを増やすには、Quota Centerコンソールにログインしてアプリケーションを送信

  • CCM は、Service の設定に基づいて、ECS インスタンスまたは Elastic Network Interface (ENI) を SLB インスタンスのバックエンドサーバーグループにアタッチします。また、Service 内の異なる targetPort ごとに個別のサーバーグループを作成します。次のクォータ制限にご注意ください。

    • バックエンドサーバーの数:デフォルトでは、CLB インスタンスには最大 200 台のバックエンドサーバーを、NLB インスタンスには最大 400 台の ECS、ENI、または IP ベースのバックエンドサーバーをアタッチできます。必要なクォータは次のように計算されます:バックエンドサーバーの数 × targetPort の数。クォータを増やすには、事前にQuota Centerコンソールにログインしてアプリケーションを送信

    • インスタンスがサーバーグループにアタッチできる回数:デフォルトでは、同じ ECS インスタンスまたは ENI は、CLB インスタンスの最大 50 の異なるバックエンドサーバーグループ、および NLB インスタンスの最大 200 の異なるバックエンドサーバーグループにアタッチできます。より多くのサーバーグループにアタッチするには、Quota Centerコンソールにログインしてアプリケーションを送信

    • ローリングアップデート中の追加クォータ使用量:ローリングアップデート中、古い Pod が削除される前に新しい Pod が作成されます。これにより、追加のクォータが消費されます。実際の消費量は予想を超える可能性があります。事前に十分なクォータを確保してください。

  • CCM は、Service で定義されたポートに基づいてリスナーを作成します。デフォルトでは、CLB または NLB インスタンスに最大 50 個のリスナーを追加できます。リスナーをさらに追加するには、Quota Centerコンソールにログインしてアプリケーションを送信

  • SLB の制限の詳細については、「CLB の制限」および「NLB の制限」をご参照ください。

    SLB のクォータをクエリするには、「Server Load Balancer クォータ管理」をご参照ください。

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

次の手順では、kubectl を使用してアプリケーションをデプロイする方法を説明します。

  1. Cloud Shell 上の kubectl を使用してクラスターに接続します

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

    YAML 内容の表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx                 # サンプルアプリケーション名
      labels:
        app: nginx
    spec:
      replicas: 3                    # レプリカ数
      selector:
        matchLabels:
          app: nginx                 # アプリケーションを公開するため、Service マニフェストの selector と一致させる必要があります
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80        # Service で公開する必要があるポート
  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:Serviceを使用したアプリケーションの公開

コンソールまたはkubectlのいずれかを使用して、LoadBalancer Service を作成し、アプリケーションを公開できます。

コンソール

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

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

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

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

    パラメーター

    説明

    [名前]

    Service の名前を入力します。

    my-nginx-svc

    [サービスタイプ]

    Service のタイプを選択します。これにより、Service へのアクセス方法が決まります。

    [サービスの作成]:

    • サービスタイプ: LoadBalancer

    • SLB タイプ: クラシックロードバランサー (CLB)

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

    • Overwrite Existing Listeners: 選択済み

    [バックエンド]

    ワークロードを関連付けない場合、Endpoints オブジェクトは作成されませんが、手動でバインドできます。詳細については、「selector のない Service」をご参照ください。

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

    • 名前: app

    • : nginx

    [ポートマッピング]

    サービスポート (Service YAML ファイルの port フィールド) とコンテナポート (Service YAML ファイルの targetPort フィールド) を追加します。コンテナポートは、バックエンド Pod が公開するポートと一致させる必要があります。

    • サービスポート: 80

    • コンテナーポート: 80

    • プロトコル: TCP

    [注釈]

    Service にアノテーションを追加して、ロードバランサーのパラメーターを設定します。詳細については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。

    この例では、Service トラフィックを制御するために、課金方法を帯域幅課金に設定し、帯域幅制限を 2 Mbit/s に設定します。

    課金方法を設定します。

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

    • : paybybandwidth

    帯域幅を設定します。

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

    • : 2

    [タグ]

    Service を識別するためのラベルを追加します。

    なし

  5. 作成する をクリックします。サービス ページで、新しく作成されたサービスを表示できます。

  6. 外部 IP アドレス (External IP) 列の IP アドレス (例:39.106.XX.XX:80) を使用して、サンプルアプリケーションにアクセスします。

    アプリケーションにアクセスすると、Welcome to nginx! ページが表示されます。これは、Nginx サービスがデプロイされ、想定どおりに実行されていることを示します。

kubectl

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

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションの値を更新します。${YOUR_LB_ID} を、SLB コンソールで作成した SLB インスタンスの ID に置き換えます。

    • デフォルトでは、既存の SLB インスタンスを再利用しても、そのリスナーは作成または上書きされません。必要に応じて、service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners アノテーションを true に設定します。この例では、SLB インスタンスは新しく作成され、リスナーが必要なため、値は true に設定されています。詳細については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。

    • selector の値を my-nginx.yaml ファイルの matchLabels の値である app: nginx に設定して、Service をバックエンドアプリケーションに関連付けます。

    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 Service を作成し、アプリケーションを公開します。

    kubectl apply -f my-nginx-svc.yaml
  3. 次のコマンドを実行して、LoadBalancer Service が作成されたことを確認します。

    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 に置き換えます。

    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>