クラスター外から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)インスタンスを自動的に追加します。
デフォルトでは、ECSインスタンスは最大50個のバックエンドサーバーグループに追加できます。ECSインスタンスをさらに多くのバックエンドサーバーグループに追加するには、Quota Centerコンソールにログインしてアプリケーションを送信して、クォータの増加を申請してください。
デフォルトでは、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インスタンスを使用してアプリケーションを公開する
ACSコンソールまたはkubectlを使用して、アプリケーションを公開するLoadBalancerサービスを作成できます。
方法1: ACSコンソールを使用する
ACSコンソールにログインします。左側のナビゲーションペインで、クラスターをクリックします。
クラスターページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、詳細アクション列のをクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションペインで、 を選択します。
サービスページで、右上隅の作成をクリックします。
サービスの作成ダイアログボックスで、必要なパラメーターを設定します。
パラメーター
説明
例
パラメーター
サービスの名前を入力します。
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つ以上のラベルを追加します。ラベルは、サービスを識別するために使用されます。
なし
OKをクリックします。サービスが作成されると、サービスページに表示されます。
外部IP列に表示されている外部IPアドレスを使用して、アプリケーションにアクセスできます。この例では、外部IPアドレスは39.106.XX.XX:80です。
方法2: 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 5m
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>