Alibaba Cloud Server Load Balancer (SLB) によって公開された Service は、クラスター外部からは SLB のドメイン名または <IP:サービスポート> を使用してアクセスでき、クラスター内部からは <サービス名:サービスポート> を使用してアクセスできます。このドキュメントでは、Nginx アプリケーションを例に、既存のロードバランサーを使用する Service を利用して ACK クラスター内のアプリケーションを公開する方法について説明します。
前提条件
SLB コンソールで作成した SLB インスタンスが必要です。このインスタンスは、ACK クラスターと同じリージョンにある必要があります。このトピックでは、インターネット向けのクラシックロードバランサー (CLB) インスタンスを例として使用します。CLB インスタンスがない場合は、「CLB インスタンスの作成と管理」をご参照ください。
注意事項
SLB の再利用に関する制限
-
再利用する SLB インスタンスは、次の要件を満たす必要があります。
-
SLB コンソールで手動で作成した SLB インスタンスのみ再利用できます。クラウドコントローラーマネージャー (CCM) によって自動的に作成されたインスタンスや、クラスター API サーバーによって使用されているインスタンスは再利用できません。
-
ACK クラスターでイントラネット SLB インスタンスを再利用するには、SLB インスタンスと ACK クラスターが同じ Virtual Private Cloud (VPC) 内にある必要があります。
-
SLB インスタンスのアドレスタイプは、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 インスタンスを再利用する場合は、各クラスターで名前空間と 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 コンソールで手動で変更した設定が上書きされる可能性があります。重要SLB コンソールで、ACS によって管理される SLB インスタンスの構成を手動で変更しないでください。そうしないと、構成が失われ、サービスにアクセスできなくなる可能性があります。
-
既存の LoadBalancer サービスの SLB インスタンスを変更することはできません。SLB インスタンスを変更したい場合は、新しい Service を作成する必要があります。
SLB のクォータ制限
-
CCM は、
Type=LoadBalancerの Service ごとに SLB インスタンスを 1 つ作成します。デフォルトのクォータは、CLB インスタンス 60 個とネットワークロードバランサー (NLB) インスタンス 60 個です。このクォータを増やすには、Quota Centerコンソールにログインしてアプリケーションを送信してください。 -
CCM は、Service の設定に基づいて、ECS インスタンスまたは Elastic Network Interface (ENI) を SLB のバックエンドサーバーグループにアタッチし、targetPort ごとに個別のサーバーグループを作成します。クォータ制限は次のとおりです。
-
バックエンドサーバー数:CLB インスタンスは最大 200 のバックエンドサーバーをサポートし、NLB インスタンスは最大 400 の ECS、ENI、または IP ベースのサーバーをサポートします。クォータの計算式:バックエンドサーバー数 × targetPorts。クォータを増やすには、事前にQuota Centerコンソールにログインしてアプリケーションを送信してください。
-
インスタンスごとのサーバーグループアタッチメント数:1 つの ECS インスタンスまたは ENI は、最大 50 の CLB バックエンドサーバーグループと 200 の NLB バックエンドサーバーグループにアタッチできます。この制限を増やすには、Quota Centerコンソールにログインしてアプリケーションを送信してください。
-
ローリングアップデート中の追加クォータ:古い Pod が削除される前に新しい Pod が作成されるため、想定を超える追加のクォータが消費される可能性があります。事前に十分なクォータを確保してください。
-
-
CCM は Service のポートに基づいてリスナーを作成します。デフォルトの制限は、CLB または NLB インスタンスごとに 50 リスナーです。リスナーを追加するには、Quota Centerコンソールにログインしてアプリケーションを送信してください。
-
詳細については、「CLB の制限」および「NLB の制限」をご参照ください。
Server Load Balancer クォータ管理で 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:Service を使用したアプリケーションの公開
コンソールまたは kubectl のいずれかを使用して LoadBalancer サービスを作成し、アプリケーションを公開できます。
コンソール
-
ACS コンソールにログインします。 左側のナビゲーションウィンドウで、クラスターリストをクリックします。
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ネットワーク > サービス を選択します。
-
サービス ページで、左上隅にある 作成する をクリックします。
-
サービスの作成 ダイアログボックスで、Service のパラメーターを設定します。
パラメーター
説明
例
名前
Service の名前を入力します。
my-nginx-svc
サービスタイプ
Service のタイプを選択します。これにより、Service へのアクセス方法が決まります。
サービスの作成:
-
サービスタイプ:LoadBalancer
-
SLB タイプ: Classic Load Balancer (CLB)
-
リソースの選択:既存のリソースを使用
-
ポートリスナーを作成する:選択済み
バックエンド
ワークロードを関連付けない場合、Endpoints オブジェクトは作成されませんが、手動でバインドできます。詳細については、「セレクターのないサービス」をご参照ください。
+ 参照ワークロードラベル をクリックし、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 を識別するためのラベルを追加します。
なし
-
-
作成する をクリックします。サービス ページで、新しく作成された 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/alibaba-cloud-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 サービスが作成されたことを確認します。
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>nginx へようこそ!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>nginx へようこそ!</h1> <p>このページが表示されている場合、nginx Web サーバーは正常にインストールされ、 動作しています。追加の構成が必要です。</p> <p>オンラインドキュメントおよびサポートについては、 <a href="http://nginx.org/">nginx.org</a> をご参照ください。<br/> 商用サポートは <a href="http://nginx.com/">nginx.com</a> でご利用いただけます。</p> <p>nginx をご利用いただき、ありがとうございます。</p> </body> </html>