ディザスタリカバリ機能、信頼性、またはセキュリティ分離を強化するために、複数のクラスタにサービスをデプロイできます。このシナリオでは、すべてのバックエンド サービスが LoadBalancer タイプの場合、複数の Server Load Balancer (SLB) インスタンスが使用され、リソースの浪費につながります。 cloud-controller-manager コンポーネントを使用して、既存の SLB インスタンスをクラスタ内およびクラスタ外のエンドポイントにマウントできます。これにより、単一の SLB インスタンスで異なるクラスタのサービスを公開し、サービスの重みを設定できます。
前提条件
Classic Load Balancer (CLB) インスタンス または Network Load Balancer (NLB) インスタンス が、Container Service for Kubernetes (ACK) クラスタのリージョンに作成されています。
Cloud Controller Manager コンポーネントはクラスターにインストールされており、次のバージョン要件を満たしています。更新するには、「コンポーネントを管理する」をご参照ください。
CLB インスタンス: v2.0.1 以降
NLB インスタンス: v2.9.1 以降
kubectl クライアントは ACK クラスタに接続されています。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。
シナリオ 1: クラスタ内のサービスとクラスタ外のエンドポイントへのトラフィックを分散する
これを行うには、クラスタ内のサービスと、Elastic Compute Service (ECS) インスタンスなどのクラスタ外のエンドポイントを、同じ SLB インスタンスにマウントします。
サービスを作成するときに、SLB インスタンスを選択します。
コンソールの使用
ACK コンソール でサービスを作成する際に、[サービスの種類] を [SLB] に設定し、[既存のリソースを使用] を選択します。次に、ドロップダウン リストから SLB インスタンスを選択し、既存リスナーの上書き を選択します。
kubectl の使用
kubectl を使用してサービスを作成する場合は、アノテーションを追加して SLB インスタンスの ID を指定します。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # SLB インスタンスの ID で ${LB_ID} を置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 値を true に設定して、リスナーと vServer グループを自動的に作成します。 labels: #... name: #... spec: #...重要サービスが作成されると、cloud-controller-manager は vServer グループと、vServer グループに関連付けられ、サービス ポートでリッスンするリスナーを SLB インスタンスに作成します。
[CLB コンソール] または [NLB コンソール] にログオンします。クラスター外のエンドポイントを vServer グループに追加します。詳細については、「CLB vServer グループを作成および管理する」および「vServer グループを作成および管理する」をご参照ください。
構成が完了すると、vServer グループでポッドと外部エンドポイントを見つけ、重みを設定できます。スケーリングアクティビティがトリガーされると、ポッドは vServer グループに自動的に追加または削除されます。スケーリングアクティビティは、外部エンドポイントには影響しません。
シナリオ 2: 異なる ACK クラスタのサービスにトラフィックを分散する
異なる ACK クラスタのサービスを同じ SLB インスタンスにマウントできます。 SLB インスタンスは、統合イングレスとして機能します。
サービスのバックエンド ポッドが変更されたときに SLB インスタンスのエンドポイントを自動的に更新するには、サービスが SLB インスタンスの同じリスナーと vServer グループを使用するように構成する必要があります。これを行うには、SLB インスタンスのリスナーと vServer グループを手動で作成し、vServer グループとサービス ポートでリッスンするリスナーを再利用するようにサービスを構成する必要があります。
異なる ACK クラスタのサービスは、同じポートを使用する必要があります。
同じ名前空間にデプロイされている場合、サービスは異なる名前を持つ必要があります。
[CLB コンソール] または [NLB コンソール] にログインし、SLB インスタンスのリスナーと vServer グループを作成します。詳細については、「CLB リスナー」、「CLB vServer グループの作成と管理」、「NLB リスナー」、および「サーバーグループの作成と管理」をご参照ください。
サービスを作成するときに、手動で作成した vServer グループを再利用します。
これを行うには、サービスにアノテーションを追加して、SLB インスタンスと vServer グループの ID を指定します。サービスの重みを設定することもできます。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" # ${YOUR_LB_ID} を SLB インスタンスの ID に置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:{PORT}" # ${YOUR_VGROUP_ID} を vServer グループの ID に、{PORT} をサービスのポートに置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100" # このアノテーションはオプションです。このアノテーションは、サービスのバックエンド ポッドの重みを指定します。有効な値: 1 ~ 1000。デフォルト値: 100。 labels: #... name: #... spec: #...説明service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-portを複数のポートと vServer グループのマッピングに設定する場合は、マッピングをコンマ (,) で区切ります。例: "${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。構成が完了すると、SLB コンソール の vServer グループでサービスのポッドを見つけることができます。アプリケーションがスケーリングされると、ポッドはアプリケーションの vServer グループに自動的に追加または削除されます。他のアプリケーションに属するポッドは影響を受けません。
重要対応するアノテーションを追加してサービスの重みを設定した場合は、コンソールで重みを変更しないでください。変更はサービスに同期されないためです。
参照
アノテーションの詳細については、「アノテーションを使用して CLB インスタンスを構成する」および「アノテーションを使用して NLB インスタンスを構成する」をご参照ください。
cloud-controller-manager コンポーネントのリリースノートの詳細については、「Cloud Controller Manager」をご参照ください。