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) インスタンスを自動的に追加します。
デフォルトでは、1 つの ECS インスタンスを最大 50 個のバックエンドサーバーグループに追加できます。ECS インスタンスをさらに多くのバックエンドサーバーグループに追加するには、Quota Centerコンソールにログインしてアプリケーションを送信ことでクォータの増加を申請してください。
デフォルトでは、1 つの SLB インスタンスに最大 200 台のバックエンドサーバーを追加できます。SLB インスタンスにさらに多くのバックエンドサーバーを追加するには、Quota Centerコンソールにログインしてアプリケーションを送信ことでクォータの増加を申請してください。
CCM は、サービスポートを使用するリスナーを SLB インスタンスに自動的に作成します。デフォルトでは、各 SLB インスタンスは最大 50 個のリスナーをサポートします。各 SLB インスタンスでサポートされるリスナーの数を増やすには、Quota Centerコンソールにログインしてアプリケーションを送信ことでクォータの増加を申請してください。
SLB の制限の詳細については、CLB の制限と NLB の制限をご参照ください。
SLB リソースクォータを照会するには、SLB コンソールのクォータセンターページにアクセスしてください。
手順 1: アプリケーションをデプロイする
次のセクションでは、kubectl コマンドラインツールを使用してアプリケーションをデプロイする方法について説明します。
my-nginx.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
次のコマンドを実行して、my-nginx アプリケーションをデプロイします。
kubectl apply -f my-nginx.yaml次のコマンドを実行して、アプリケーションのステータスを確認します。
kubectl get deployment my-nginx予期される出力:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 50s
手順 2: 既存の SLB インスタンスを使用してアプリケーションを公開する
ACK コンソールまたは kubectl を使用して、アプリケーションを公開する LoadBalancer サービスを作成できます。
コンソールの使用
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。
[サービス] ページで、左上の [作成] をクリックします。
[サービスの作成] ダイアログボックスで、必須パラメータを設定します。
パラメータ
説明
例
[名前]
サービスの名前を入力します。
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 つ以上のラベルを追加します。ラベルは、サービスを識別するために使用されます。
なし
[OK] をクリックします。サービスが作成されると、[サービス] ページに表示されます。
[外部 IP] 列に表示されている外部 IP アドレスを使用して、アプリケーションにアクセスできます。この例では、外部 IP アドレスは [39.106.XX.XX:80] です。

kubectl の使用
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-listenersをtrueに設定します。この例では、新しい SLB インスタンスが作成され、新しいリスナーを作成する必要があります。したがって、この注釈をtrueに設定します。注釈の詳細については、「注釈を使用して CLB インスタンスを構成する」をご参照ください。作成したバックエンドアプリケーションにサービスを関連付けるには、
selectorをmy-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次のコマンドを実行して、my-nginx-svc という名前のサービスを作成し、サービスを使用してアプリケーションを公開します。
kubectl apply -f my-nginx-svc.yaml次のコマンドを実行して、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 5mcurl <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>