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

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

最終更新日:Dec 27, 2024

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

前提条件

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

使用方法

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

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

    • SLBコンソールを使用して作成されたSLBインスタンスは再利用できます。クラウドコントローラーマネージャー(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. CloudShellでkubectlを使用してKubernetesクラスターを管理する

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

    YAMLファイルを表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx                 # アプリケーション名
      labels:
        app: nginx
    spec:
      replicas: 3                    # レプリケートされたPodの数
      selector:
        matchLabels:
          app: nginx                 # アプリケーションを公開するために使用されるサービスのセレクターパラメーターで同じ値を指定する必要があります。
      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インスタンスを使用してアプリケーションを公開する

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

方法1: ACSコンソールを使用する

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

  2. クラスターページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細アクション列のをクリックします。クラスターの詳細ページが表示されます。

  3. 詳細ページの左側のナビゲーションペインで、ネットワーク > サービスを選択します。

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

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

    パラメーター

    説明

    パラメーター

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

    my-nginx-svc

    サービスタイプ

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

    サービスの作成:

    • サービスタイプ: SLB

    • SLBタイプ: CLB

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

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

    バックエンド

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

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

    • 名前: app

    • : nginx

    ポートマッピング

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

    • サービスポート: 80

    • コンテナポート: 80

    • プロトコル: TCP

    アノテーション

    SLBインスタンスに1つ以上のアノテーションを追加します。アノテーションの詳細については、アノテーションを使用してCLBインスタンスを設定するを参照してください。

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

    課金方式を指定します。

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

    • : paybybandwidth

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

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

    • : 2

    ラベル

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

    なし

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

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

    image

方法2: 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>