このドキュメントでは、MetalLB ロードバランサを使用してバンドル型ロードバランシングを使用するように Anthos clusters on VMware を構成する方法について説明します。
VMware 版 Anthos クラスタでは、MetaLB はレイヤ 2 モードで実行されます。
MetalLB 構成の例
次は、MetaLB ロードバランサを実行するクラスタの構成例です。
上の図は、MetaLB のデプロイを示しています。MetalLB はクラスタノード上で直接実行されます。この例では、管理クラスタとユーザー クラスタが 2 つの個別の VLAN にあり、各クラスタは別々のサブネットにあります。
クラスタ | サブネット |
---|---|
管理クラスタ | 172.16.20.0/24 |
ユーザー クラスタ | 172.16.40.0/24 |
admin-cluster.yaml
次の管理クラスタの構成ファイルの例は、前の図に示す構成を示しています。
MetalLB ロードバランサ
Kubernetes API サーバー用の MetalLB 上の VIP と管理クラスタのアドオン
network: hostConfig: ... ipMode: type: "static" ipBlockFilePath: "config-folder/admin-cluster-ipblock.yaml" ... loadBalancer: kind: "MetalLB" ... vips: controlPlaneVIP: "172.16.20.100" addonsVIP: "172.16.20.101"
admin-cluster-ipblock.yaml
次の IP ブロック ファイルの例は、管理クラスタ内のノードの IP アドレスの指定を示しています。これには、ユーザー クラスタのコントロール プレーン ノードのアドレスと、クラスタのアップグレード中に使用する IP アドレスも含まれます。
blocks: - netmask: "255.255.255.0" gateway: "17.16.20.1" ips: - ip: 172.16.20.50 hostname: admin-vm-1 - ip: 172.16.20.51 hostname: admin-vm-2 - ip: 172.16.20.52 hostname: admin-vm-3 - ip: 172.16.20.53 hostname: admin-vm-4 - ip: 172.16.20.54 hostname: admin-vm-5
user-cluster.yaml
次のユーザー クラスタ構成ファイルの例は、次の構成を示しています。
選択して
LoadBalancer
タイプの Service に割り当てる、MetalLB コントローラのアドレス プール。Ingress VIP はこれらのプールのいずれかにあります。ユーザー クラスタの Kubernetes API サーバー用に指定された VIP と、Ingress プロキシ用に構成した Ingress VIP。ユーザー クラスタのコントロール プレーンは管理クラスタ内のノードで実行されるため、Kubernetes API サーバー VIP は管理クラスタ サブネットにあります。
Metal LB の使用が有効になっているノードプール。Metal LB は、そのノードプールに属するユーザー クラスタ内のノードにデプロイされます。
network: hostConfig: ... ipMode: type: "static" ipBlockFilePath: "config-folder/user-cluster-ipblock.yaml" ... loadBalancer: kind: MetalLB metalLB: addressPools: - name: "address-pool-1" addresses: - "172.16.40.100" - "172.16.40.101-172.16.40.112 avoidBuggyIPs: true ... vips: controlPlaneVIP: "172.16.20.102" ingressVIP: "172.16.40.102" ... nodePools: - name: "node-pool-1" cpus: 4 memoryMB: 8192 replicas: 3 enableLoadBalancer: true
上記の例の構成では、Service に使用できるアドレスのセットを指定します。アプリケーションのデベロッパーがユーザー クラスタに LoadBalancer
タイプの Service を作成すると、MetaLB コントローラがこのプールから IP アドレスを選択します。
user-cluster-ipblock.yaml
次の IP ブロック ファイルの例は、ユーザー クラスタ内のノードの IP アドレスの指定を示しています。これには、クラスタのアップグレード中に使用する IP アドレスが含まれます。
blocks: - netmask: "255.255.255.0" gateway: "17.16.40.1" ips: - ip: 172.16.40.21 hostname: user-vm-1 - ip: 172.16.40.22 hostname: user-vm-2 - ip: 172.16.40.23 hostname: user-vm-3 - ip: 172.16.40.24 hostname: user-vm-4 - ip: 172.16.40.25 hostname: user-vm-5
Metal LB の設定
開放するファイアウォール ポート
MetalLB は Go メンバーリスト ライブラリを使用してリーダー選出を行います。memberlist
ライブラリは、TCP ポート 7946 と UDP ポート 7946 を使用して情報を交換します。すべてのロードバランサ ノードで、受信トラフィックと送信トラフィックにこれらのポートがアクセスできることを確認してください。
新しい管理クラスタで MetalLB を有効にする
管理クラスタ構成ファイルで、loadBalancer.kind
を "MetalLB"
に設定します。
loadBalancer: kind: "MetalLB"
管理クラスタの残りの構成ファイルを入力し、管理クラスタの作成の説明のとおりに管理クラスタを作成します。
アドレスプールを指定する
MetalLB コントローラが Service の IP アドレス管理を行います。そのため、アプリケーション デベロッパーが、ユーザー クラスタに LoadBalancer タイプの Service を作成する場合は、Service の IP アドレスを手動で指定する必要はありません。代わりに、MetalLB コントローラは、クラスタ作成時に指定したアドレスプールから IP アドレスを選択します。
LoadBalancer タイプの Service が、ユーザー クラスタ内で常にアクティブになると思われる数を考えます。次に、ユーザー クラスタ構成ファイルの loadBalancer.metalLB.addressPools
セクションで、これらの Service に対応できる十分な IP アドレスを指定します。
ユーザー クラスタの Ingress VIP は、アドレスプールで指定したアドレス内にある必要があります。これは、Ingress プロキシが LoadBalancer タイプの Service によって公開されるためです。
アプリケーション デベロッパーが LoadBalancer タイプの Service を作成する必要がない場合は、Ingress VIP 以外のアドレスを指定する必要はありません。
アドレスは、CIDR 形式または範囲形式にする必要があります。個別のアドレスを指定する場合は、/32 CIDR を使用します。例:
addresses: - "192.0.2.0/26" - "192.0.2.64-192.0.2.72" - "192.0.2.75/32
クラスタの作成後にプール内のアドレスを調整する必要がある場合は、gkectl update cluster
を使用できます。詳細については、MetaLB の更新をご覧ください。
新しいユーザー クラスタで MetalLB を有効にする
ユーザー クラスタの構成ファイルで、次の操作を行います。
loadBalancer.kind
を"MetalLB"
に設定する。- Service のアドレス プールを 1 つ以上指定します。Ingress VIP がこれらのプールのいずれかに存在する必要があります。
enableLoadBalancer
をクラスタ内の少なくとも 1 つのノードプールのtrue
に設定します。
ユーザー クラスタ構成ファイルの残りの部分を入力し、ユーザー クラスタを作成するの説明のとおりにユーザー クラスタを作成します。
Service アドレスの手動割り当て
MetalLB コントローラが特定のプールの IP アドレスを Service に自動的に割り当てないようにするには、プールの manualAssign
フィールドを true
に設定します。次に、デベロッパーは、LoadBalancer
タイプの Service を作成し、プールからアドレスのいずれか 1 つを手動で指定します。次に例を示します。
loadBalancer: metalLB: addressPools: - name: "my-address-pool-2" addresses: - "192.0.2.73-192.0.2.80" manualAssign: true
バグのある IP アドレスの回避
アドレスプールの avoidBuggyIPs
フィールドを true
に設定すると、末尾が .0 または .255 のプールのアドレスは、MetalLB コントローラでは使用されなくなります。これにより、バグの多いコンシューマ デバイスが、これらの特別な IP アドレスに送信されたトラフィックを誤って破棄するという問題を回避できます。次に例を示します。
loadBalancer: metalLB: addressPools: - name: "my-address-pool-1" - "192.0.2.0/24" avoidBuggyIPs: true
LoadBalancer タイプの Service を作成する
以下は、Deployment と Service の 2 つのマニフェストです。
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello image: gcr.io/google-samples/hello-app:2.0 --- apiVersion: v1 kind: Service metadata: name: my-service spec: type: LoadBalancer selector: greeting: hello ports: - name: metal-lb-example-port protocol: TCP port: 60000 targetPort: 8080
Service マニフェストでは外部 IP アドレスを指定していないことに注意してください。MetalLB コントローラは、ユーザー クラスタの構成ファイルで指定したアドレスプールから外部 IP アドレスを選択します。
マニフェストを my-dep-svc.yaml
という名前のファイルに保存します。次に、Deployment オブジェクトと Service オブジェクトを作成します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-dep-svc.yaml
Service を表示します。
kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get service my-service --output wide
出力には、Service に自動的に割り当てられた外部 IP アドレスが表示されます。例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR my-service LoadBalancer 10.96.2.166 192.0.2.2 60000:31914/TCP 28s
割り当てられた外部 IP アドレスが、ユーザー クラスタの構成ファイルで指定したアドレス プールから取得されたことを確認します。たとえば、192.0.2.2 はこのアドレスプールにあります。
metalLB: addressPools: - name: "address-pool-1" addresses: - "192.0.2.0/24" - "198.51.100.1-198.51.100.3"
Service を呼び出します。
curl EXTERNAL_IP_ADDRESS:60000
出力には、Hello, world!
メッセージが表示されます。
Hello, world! Version: 2.0.0
MetalLB の更新
クラスタを作成したら、ノードプールの MetalLB アドレスプールと enableLoadBalancer
フィールドを更新できます。ユーザー クラスタ構成ファイルで必要な変更を行い、gkectl update cluster
を呼び出します。
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONIFG --config USER_CLUSTER_CONFIG
MetalLB Pod と ConfigMap
MetalLB コントローラが Deployment として実行され、enableLoadBalancer
が true
に設定されたプール内のノードで MetalLB スピーカーが DaemonSet として実行されます。MetalLB コントローラは、Service に割り当てられた IP アドレスを管理します。MetalLB スピーカーはリーダー選出を行い Service VIP を発表します。
すべての MetalLB Pod を表示します。
kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get pods --namespace kube-system --selector app=metallb
MetalLB Pod のログはトラブルシューティングに使用できます。
MetalLB の構成は MetalLB によって認識される形式で ConfigMap に保存されます。ConfigMap を直接変更しないでください。代わりに、前述のように gkectl update cluster
を使用します。トラブルシューティング用の ConfigMap を表示するには:
kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get configmap metallb-config --namespace kube-system
MetalLB を使用するメリット
MetalLB はクラスタノード上で直接実行されるため、追加の VM は不要です。
MetalLB コントローラが Service の IP アドレス管理を行うため、Service ごとに IP アドレスを手動で選択する必要はありません。
異なる Service の MetalLB のアクティブなインスタンスを異なるノードで実行できます。
異なる Service 間で IP アドレスを共有できます。
MetalLB と F5 BIG-IP および Seesaw の比較
VIP は、クラスタノードと同じサブネット内に存在する必要があります。これは Seesaw の要件でもありますが、F5 BIG-IP の要件ではありません。
トラフィックの指標はありません。
ヒットレス フェイルオーバーはありません。既存の接続がフェイルオーバー中にリセットされます。
特定の Service の Pod への外部トラフィックは、MetalLB スピーカーを実行している 1 つのノードを通過します。つまり、通常、クライアント IP アドレスは、Pod で実行されているコンテナには表示されません。