ディザスタリカバリ機能、信頼性、またはセキュリティの分離を強化するために、クラスター全体にサービスをデプロイできます。 このシナリオでは、すべてのバックエンドサービスがLoadBalancerタイプの場合、複数のServer Load Balancer (SLB) インスタンスが使用されるため、リソースが無駄になります。 cloud-controller-managerコンポーネントを使用して、既存のSLBインスタンスをクラスター内およびクラスター外のエンドポイントにマウントできます。 これにより、単一のSLBインスタンスを使用して異なるクラスターでサービスを公開し、サービスの重みを設定できます。
前提条件
Container Service for Kubernetes (ACK) クラスターのリージョンに、Classic Load Balancer (CLB) インスタンスまたはNetwork Load Balancer (NLB) インスタンスが作成されます。 詳細については、「CLBインスタンスの作成と管理」および「NLBインスタンスの作成と管理」をご参照ください。
cloud-controller-manager v2.0.1以降がインストールされています。 コンポーネントの更新方法の詳細については、「コンポーネントの管理」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
シナリオ1: クラスター内のサービスとクラスター外のエンドポイントへのトラフィックの配布
これを行うには、クラスター内のサービスとクラスター外のエンドポイント (Elastic Compute Service (ECS) インスタンスなど) を同じSLBインスタンスにマウントします。
サービスの作成時にSLBインスタンスを選択します。
コンソールの使用
ACKコンソールでサービスを作成する場合、サービスタイプをServer Load Balancerに設定し、既存の SLB インスタンスを使用 を選択します。 次に、ドロップダウンリストからSLBインスタンスを選択し、既存リスナーの上書き を選択します。
kubectlを使う
kubectlを使用してサービスを作成する場合は、アノテーションを追加してSLBインスタンスのIDを指定します。
apiVersion: v1 種類: サービス メタデータ: アノテーション: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # ${LB_ID} をSLBインスタンスのIDに置き換えます。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"# 値をtrueに設定して、リスナーとvServerグループを自動的に作成します。 ラベル: #... name: #... spec: #...
重要サービスが作成されると、cloud-controller-managerはvServerグループと、vServerグループに関連付けられたリスナーを作成し、SLBインスタンスのサービスポートでリッスンします。
CLBコンソールまたはNLBコンソールにログインします。 クラスター外のエンドポイントをvServerグループに追加します。 詳細については、「CLB vServerグループの作成と管理」および「vServerグループの作成と管理」をご参照ください。
設定が完了したら、vServerグループ内のポッドと外部エンドポイントを見つけて、それらの重みを設定できます。 スケーリングアクティビティがトリガーされると、ポッドは自動的にvServerグループに追加または削除されます。 スケーリングアクティビティは、外部エンドポイントには影響しません。
シナリオ2: 異なるACKクラスターのサービスにトラフィックを分配する
異なるACKクラスターのサービスを同じSLBインスタンスにマウントできます。 SLBインスタンスは、統合されたingressとして機能します。
サービスのバックエンドポッドが変更されたときに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}" # Replace ${YOUR_LB_ID} with the ID of the SLB instance. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:{PORT}" # Replace ${YOUR_VGROUP_ID} with the ID of the vServer group and {PORT} with the port of the Service. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100" # This annotation is optional. This annotation specifies the weights of the backend pods of the Service. Valid values: 1 to 1000. Default value: 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」をご参照ください。