手動負荷分散を構成する

このページでは、手動負荷分散を使用する際の負荷分散要件について説明します。バンドル型負荷分散の場合、GDCV for Bare Metal がクラスタノードにロードバランサをデプロイし、コントロール プレーンとデータプレーンのトラフィックを制御しますが、手動ロード バランシングの場合は、独自の負荷分散ソリューションを構成してこれらのトラフィックのロード バランシングを行います。

ベアメタル クラスタを作成する前に、コントロール プレーン用に外部ロードバランサを設定する必要があります。コントロール プレーンの外部ロードバランサはデータプレーンのトラフィックにも使用できます。また、データプレーン用に別のロードバランサを設定することもできます。たとえば、データプレーンのトラフィック用に MetalLB などのクラスタ内ロードバランサを使用できます。

このページでは、負荷分散の要件だけでなく、F5 BIG-IP を使用して手動負荷分散を構成する方法についても説明します。

前提条件

以降のセクションでは、手動ロード バランシングを構成するための前提条件について説明します。

必要な IP アドレス

クラスタを作成する前に、VIP を計画する必要があります。すべてのクラスタにコントロール プレーンの VIP が必要です。すべてのユーザー クラスタで、Ingress サービス用に別の VIP を用意する必要があります。

これらの VIP は、ロードバランサからルーティング可能な任意の IPv4 サブネットに含めることができます。コントロール プレーンの VIP は、すべてのクラスタノードから到達可能で、bmctl を実行する管理ワークステーションからも到達可能でなければなりません。

クラスタを作成すると、クラスタ構成ファイルで指定した VIP を使用して、Ingress サービスがデプロイされます。この IP アドレスの負荷分散はクラスタの作成後に構成できます。

コントロール プレーン ノードとして使用するノードの IP アドレスを確認しておく必要があります。

コントロール プレーンの外部ロードバランサの要件

コントロール プレーンのロードバランサは、クラスタを作成する前に構成する必要があります。コントロール プレーンのロードバランサは、次の要件を満たす必要があります。

  • コントロール プレーンの VIP の仮想サービス(フロントエンド)。コントロール プレーンのデフォルト リスニング ポートは 443 です。ただし、別のポートを指定すると、クラスタ構成ファイルの loadBalancer.ports.controlPlaneLBPort フィールドでそのポートが仮想サービスに使用されます。
  • クラスタのコントロール プレーンのすべての IP アドレスを含むバックエンド グループ。コントロール プレーンがリッスンするバックエンド ポートは 6444 です。
  • バックエンド ノードをモニタリングするヘルスチェック。ヘルスチェックでは HTTPS を使用し、ポート 6444 で /readyz エンドポイントをチェックする必要があります。ヘルスチェックで、このエンドポイントがステータス コード 200 を返し、ノードが正常な状態であることを確認する必要があります。

外部ロードバランサが正しく構成されていないと、クラスタのブートストラップが失敗する可能性があります。プリフライト チェックで、外部ロードバランサが正しく構成されていることを確認します。たとえば、ロードバランサが /readyz エンドポイントをチェックしていることを確認します。

障害が発生したノードへの接続をリセットする(推奨)

上述の要件に加えて、バックエンド ノードの障害を検出したときにクライアント接続をリセットするようにロードバランサを構成することをおすすめします。この構成がないと、サーバー インスタンスが停止したときに Kubernetes API サーバーのクライアントが数分間応答不能になり、Kubernetes コントロール プレーンが不安定になる可能性があります。

  • F5 BIG-IP でこの設定を行うには、バックエンド プールの構成ページで Action On Service Down を使用します。
  • HAProxy でこの設定を行うには、バックエンド サーバー構成で on-Marked-down shutdown-sessions を使用します。
  • 別のロードバランサを使用している場合は、そのドキュメントを参照して同等の設定を確認してください。

クラスタを構成する

GKE on Bare Metal クラスタを作成する前に、bmctl でクラスタ構成ファイルを作成します。このファイルを編集して、クラスタで手動ロード バランシングを有効にします。

  1. loadBalancer.mode フィールドを manual に設定します。
  2. loadBalancer.vips.controlPlaneVIP フィールドに、ロードバランサで構成した VIP を設定します。
  3. loadBalancer.addressPools セクションを削除するか、コメントアウトします。

構成ファイルの編集が完了したら(負荷分散以外のフィールドを含む)、プリフライト チェックを実行し、コントロール プレーンの VIP がロードバランサに正しく構成されていることを確認します。

bmctl check preflight -c CLUSTER_NAME

CLUSTER_NAME はクラスタの名前で置き換えます。

ユーザー クラスタで LoadBalancer Service をサポートする

Kubernetes LoadBalancer サービスをサポートするようにロード バランシングを構成する必要があります。手動ロード バランシングモードの場合、GDCV for Bare Metal はロードバランサを自動的にプロビジョニングしないため、ロードバランサをプロビジョニングしてサービスを参照するように構成するまで、LoadBalancer サービスは機能しません。

また、GDCV for Bare Metal は、LoadBalancer サービスを使用して、すべてのユーザー クラスタに自動的に Ingress サービスをデプロイします。外部からアクセスできるようにするには、この LoadBalancer サービスを参照するようにロードバランサを構成する必要があります。

LoadBalancer サービスをサポートするには、次の方法があります。

  • クラスタで LoadBalancer サービスごとにロードバランサを手動で構成する。F5 BIG-IP の使用例については、LoadBalancer サービスのサポートの構成をご覧ください。
  • LoadBalancer サービスの作成時に、クラスタにロードバランサ コントローラをインストールして、外部ロードバランサを構成する。
  • MetalLB などのクラスタ内負荷分散ソリューションをインストールする。

F5 BIG-IP による手動負荷分散

このセクションでは、外部ロードバランサとして F5 BIG-IP を使用した手動負荷分散の構成方法を説明します。別のロードバランサを使用している場合は、そのロードバランサのドキュメントをご覧ください。

コントロール プレーンのロードバランサを構成する

クラスタを作成する前に、コントロール プレーンのロードバランサを構成する必要があります。これらの手順を行った後、クラスタを構成して作成できます。

クラスタのパーティションを作成する

クラスタごとに独自のパーティションが必要です。BIG-IP 構成ユーティリティを使用してパーティションを作成します。

  1. [System] > [Users] > [Partition List] の順に移動します。
  2. [作成] をクリックします。
  3. パーティションの名前を入力します。
  4. [Finished] をクリックします。

以降の手順では、このパーティションにオブジェクトを作成します。各タスクの UI の右上にあるプルダウン メニューで、このパーティションが選択されていることを確認してください。選択されていないと、このパーティションにオブジェクトが作成されません。

モニターを作成する

コントロール プレーン ノードでヘルスチェックを実行するモニターを作成します。

  1. [Local Traffic] > [Monitors] の順に移動します。
  2. [作成] をクリックします。
  3. モニターの名前を入力します(例: https_readyz)。
  4. [Type] を [HTTPS] に設定します。
  5. [Send String] に「GET /readyz HTTP/1.1\r\nHost: \r\nConnection: close」と入力します。
  6. [Receive String] に「HTTP/1.1 200」と入力します。
  7. [Finished] をクリックします。

ノードの作成

コントロール プレーン ノードを参照するノードを作成します。クラスタに、複数のコントロール プレーン ノードを使用する高可用性(HA)コントロール プレーンがある場合は、各コントロール プレーン ノードにノード オブジェクトを作成します。

  1. [Local Traffic] > [Nodes] > [Node List] の順に移動します。
  2. [Create] をクリックします。
  3. ノードの名前を入力します。
  4. [Address] フィールドにノードの IP アドレスを入力します。
  5. [Finished] をクリックします。

バックエンド プールを作成する

コントロール プレーン ノードのプールを作成します。

  1. [Local Traffic] > [Pools] > [Pool List] の順に移動します。
  2. [Create] をクリックします。
  3. [Configuration] プルダウンで [Advanced] を選択します。
  4. プールの名前を入力します。
  5. 先ほど作成したヘルスモニターを選択します。
  6. [Action On Service Down] を [Reject] に設定します(この設定については、障害が発生したノードへの接続のリセットをご覧ください)。
  7. プールにコントロール プレーン ノードを追加します。クラスタに複数のコントロール プレーン ノードがある場合は、ノードごとに次の手順を繰り返します。
    1. [New Members] セクションで [Node List] をクリックし、前に作成したコントロール プレーン ノードを選択します。
    2. [Service Port] フィールドに「6444」と入力します。
    3. [Add] をクリックします。

仮想サーバーを作成する

コントロール プレーンに仮想サーバーを作成します。

  1. [Local Traffic] > [Virtual Servers] > [Virtual Server List] の順に移動します。
  2. [Create] をクリックします。
  3. 仮想サーバーの名前を入力します。
  4. [Type] を [Standard] に設定します。
  5. すべてのソースからのトラフィックを許可するには、[Source Address] フィールドに「0.0.0.0/0」と入力します。
  6. [Destination Address] に、コントロール プレーンの VIP を入力します。
  7. [Service Port] に、コントロール プレーン ポートを入力します。デフォルトは 443 ですが、これは構成可能です。ただし、loadBalancer.ports.controlPlaneLBPort のクラスタ構成で行った構成と一致する必要があります。
  8. [Source Address Translation] フィールドで [Auto Map] を選択します。
  9. [Default Pool] で、前に作成したプールを選択します。
  10. [Finished] をクリックします。

LoadBalancer Service のサポートを構成する

手動ロード バランシングモードの場合、GDCV for Bare Metal は LoadBalancer サービスをサポートするためにロードバランサを自動的にプロビジョニングしません。 詳細については、ユーザー クラスタでの LoadBalancer サービスのサポートをご覧ください。

このセクションでは、LoadBalancer サービスに F5 BIG-IP ロードバランサを手動で構成する方法について説明します。公開する LoadBalancer サービスごとに、これらの手順を繰り返します。

前提条件

LoadBalancer サービスを構成するには、ロードバランサを介して公開する VIP、サービスで公開するポート、Kubernetes の LoadBalancer サービスが使用する NodePort を把握しておく必要があります。

クラスタに LoadBalancer サービスをデプロイしたら、LoadBalancer サービスで使用される NodePort を確認します。サービスのポートを表示するには、次のコマンドを実行します。

kubectl --kubeconfig KUBECONFIG get service SERVICE_NAME -oyaml

次のように置き換えます。

  • KUBECONFIG は、使用する kubeconfig ファイルのパスに置き換えます。
  • SERVICE_NAME は、LoadBalancer サービスの名前に置き換えます。

kubctl get service の出力に ports セクションが含まれます。各ポートエントリに、サービスのポートで公開された nodePort が表示されます。この nodePort が、ロードバランサのバックエンドを参照するように構成するポートです。次のサンプル出力は、ports セクションの構造を示しています。

spec:
  clusterIP: 172.26.232.107
  externalTrafficPolicy: Cluster
  loadBalancerIP: 21.0.101.77
  ports:
  - name: status-port
    nodePort: 30281
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http
    nodePort: 30124
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 31858
    port: 443
    protocol: TCP
    targetPort: 443

HTTP トラフィック用と HTTPS トラフィック用のポートがあります。ロードバランサを介して、これらのポートの一方または両方を公開できます。

すべてのクラスタで自動的にデプロイされる Ingress サービスを公開すると、LoadBalancer サービスは istio-ingress という名前で、gke-system 名前空間に配置されます。ポートを探すには、次のコマンドを実行します。

kubectl --kubeconfig KUBECONFIG -n gke-system get service istio-ingress -oyaml

Ingress サービスが、loadBalancerIP (初期クラスタ構成の loadBalancer.vips.ingressVIP フィールドに指定された IP)で構成されます。この VIP を公開して、外部ロードバランサで Ingress サービスを公開する必要があります。

バックエンド プールを作成する

  1. [Local Traffic] > [Pools] > [Pool List] の順に移動します。
  2. [Create] をクリックします。
  3. プールの名前を入力します。
  4. ヘルスモニターとして tcp を選択します。
  5. ワーカーノードをノードプールに追加します。ノードごとに上述の手順を繰り返します。Kubernetes NodePorts はクラスタ内の任意のノードでアクセス可能であるため、コントロール プレーンとワーカーノードを追加できます。
    1. [New Members] セクションで [Node List] をクリックし、前に作成したコントロール プレーン ノードのいずれかを選択します。
    2. [Service Port] フィールドに、サービスの NodePort 値を入力します。
    3. [Add] をクリックします。

仮想サーバーを作成する

  1. [Local Traffic] > [Virtual Servers] > [Virtual Server List] の順に移動します。
  2. [Create] をクリックします。
  3. 仮想サーバーの名前を入力します。
  4. [Type] を [Standard] に設定します。
  5. すべてのソースからのトラフィックを許可するには、[Source Address] フィールドに「0.0.0.0/0」と入力します。
  6. ロードバランサ サービスの VIP を [Destination Address] に入力します。
  7. サービスポートとして、ロードバランサ サービスに公開されているポートを入力します。
  8. [Source Address Translation] フィールドで [Auto Map] を選択します。
  9. [Default Pool] で、前に作成したプールを選択します。
  10. [Finished] をクリックします。