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 を使用してアプリケーションをデプロイする方法を説明します。
-
次の内容で 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:Serviceを使用したアプリケーションの公開
コンソールまたはkubectlのいずれかを使用して、LoadBalancer Service を作成し、アプリケーションを公開できます。
コンソール
-
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、ネットワーク > サービス を選択します。
-
サービス ページで、左上隅の 作成する をクリックします。
-
サービスの作成 ダイアログボックスで、サービスのパラメーターを設定します。
パラメーター
説明
例
[名前]
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 を識別するためのラベルを追加します。
なし
-
-
作成する をクリックします。サービス ページで、新しく作成されたサービスを表示できます。
-
外部 IP アドレス (External IP) 列の IP アドレス (例:39.106.XX.XX:80) を使用して、サンプルアプリケーションにアクセスします。
アプリケーションにアクセスすると、Welcome to nginx! ページが表示されます。これは、Nginx サービスがデプロイされ、想定どおりに実行されていることを示します。
kubectl
-
次の内容で 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 -
-
次のコマンドを実行して my-nginx-svc Service を作成し、アプリケーションを公開します。
kubectl apply -f my-nginx-svc.yaml -
次のコマンドを実行して、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 -
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>