クロスラスターデプロイは、災害復旧、信頼性、およびセキュリティ分離を向上させますが、バックエンドごとに LoadBalancer タイプの Service を作成すると、ロードバランサーインスタンスを無駄に消費することになります。Cloud Controller Manager (CCM) コンポーネントを使用すると、クラスター内と外部の両方のエンドポイントを単一の既存のロードバランサーインスタンスに接続し、各エンドポイントの転送ウェイトを設定できます。
前提条件
-
ACK クラスターと同じリージョンに既存の Classic Load Balancer (CLB) または Network Load Balancer (NLB) インスタンスがあること。詳細については、CLB インスタンスの作成と管理およびNLB インスタンスの作成と管理をご参照ください。
-
Cloud Controller Manager コンポーネントがバージョン要件を満たしていることを確認してください。コンポーネントをアップグレードするには、コンポーネントの管理をご参照ください。必要なバージョンはインスタンスタイプによって異なります:
-
CLB インスタンス:v2.0.1 以降。
-
NLB インスタンス:v2.9.1 以降。
-
ユースケース 1:クラスター内 Service と外部エンドポイント
クラスター内 Service と、ECS インスタンスなどの外部エンドポイントの両方を、同じロードバランサーインスタンスにアタッチできます。
-
Classic Load Balancer (CLB) コンソールまたはNetwork Load Balancer (NLB) コンソールで、既存のロードバランサーインスタンスの ID を確認します。
-
Service を作成する際に、既存のロードバランサーインスタンスを再利用します。
コンソールを使用する
Container Service for Kubernetes (ACK) コンソールで Service を作成する際、サービスタイプ を ロードバランサ (LoadBalancer) に設定します。次に、既存のリソースを使用 を選択し、既存のロードバランサーインスタンスを選択して、ポートリスナーを作成する を選択します。
kubectl を使用する
kubectl を使用して Service を作成する際、Annotation を追加してロードバランサーインスタンスの ID を指定します。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # ${LB_ID} を既存のロードバランサーインスタンスの ID に置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # "true" に設定すると、リスナーと仮想サーバーグループが自動的に作成されます。 labels: #... name: #... spec: #...重要Service を作成すると、CCM は対象のロードバランサーインスタンスに仮想サーバーグループとリスナーを自動的に作成します。リスナーはこの仮想サーバーグループをバックエンドとして使用し、Service ポートにトラフィックを転送します。
-
自動的に作成された仮想サーバーグループに外部エンドポイントを追加します。手順については、仮想サーバーグループの作成と管理およびNLB サーバーグループをご参照ください。
設定後、仮想サーバーグループには、クラスター内 Pod と外部エンドポイントの両方が表示され、それぞれに転送ウェイトを設定できます。クラスター内アプリケーションがスケールすると、そのエンドポイントはサーバーグループに自動的に追加または削除され、外部エンドポイントには影響しません。
ユースケース 2:複数クラスター内の Service
異なるクラスターの Service を単一のロードバランサーインスタンスにアタッチして、統一されたエントリーポイントを提供できます。
Pod の変更時にバックエンドエンドポイントが自動的に更新されるようにするには、ロードバランサーを共有するすべての Service が同じリスナーと仮想サーバーグループも共有する必要があります。ロードバランサーインスタンスにリスナーと仮想サーバーグループを手動で作成し、すべての Service で再利用します。リスナーポートは Service ポートと一致する必要があります。
-
異なるクラスター内の Service は同じポートを使用する必要があります。
-
Namespace と Service 名の組み合わせは、クラスター間で一意である必要があります。
-
ロードバランサーインスタンスのリスナーと仮想サーバーグループを作成します。手順については、CLB リスナー、仮想サーバーグループの作成と管理、NLB リスナー、およびNLB サーバーグループをご参照ください。
-
Service を作成する際に、手動で作成した仮想サーバーグループを再利用します。
仮想サーバーグループを再利用するには、Service マニフェストに Annotation を追加して、ロードバランサーインスタンスと仮想サーバーグループの ID を指定します。Service の転送ウェイトも設定できます。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" # ${YOUR_LB_ID} を既存のロードバランサーインスタンスの ID に置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:{PORT}" # ${YOUR_VGROUP_ID} を仮想サーバーグループの ID に、{PORT} を Service のポートに置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100" # オプション。この Service に属する Pod の転送ウェイト。有効な値の範囲は 1 ~ 100 です。デフォルトは 100 です。 labels: #... name: #... spec: #...説明service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-portで複数のポートと仮想サーバーグループの組み合わせを指定する場合は、カンマ (,) で区切ります。例:"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。設定後、ロードバランサーコンソールの仮想サーバーグループで、異なるクラスター内の Service の Pod を表示できます。1 つのクラスター内のアプリケーションがスケールすると、CCM は自動的にその Pod をサーバーグループに追加または削除し、他のクラスターの Pod には影響しません。
重要Service マニフェストの Annotation を使用して転送ウェイトを設定した場合、コンソールでウェイトを調整しないでください。状態の不整合が発生する可能性があります。
関連ドキュメント
-
Annotation 設定の詳細については、Annotation を使用した Classic Load Balancer (CLB) の設定およびAnnotation を使用した Network Load Balancer (NLB) の設定をご参照ください。
-
CCM コンポーネントの変更ログについては、Cloud Controller Manager をご参照ください。