手当たり次第に書くんだ

飽きっぽいのは本能

Kubernetes MetalLB の導入 – LoadBalancer Service をオンプレ環境で成立させる

Kubernetes 外部公開の関連記事

Kubernetes の type: LoadBalancer は、クラウド環境ではクラウドロードバランサーの払い出しと結びついています。

一方で、オンプレミス Kubernetes や自宅ラボでは、同じ LoadBalancer Service を作っても、外部 IP アドレスが自動的に割り当てられるとは限りません。Kubernetes は Service の抽象を持っていますが、その抽象を物理ネットワークや既存ルーターへ接続する実装は、環境側で用意する必要があります。

MetalLB は、この不足部分を埋めるための代表的な実装です。

ただし、MetalLB を「オンプレ Kubernetes にロードバランサーを追加するもの」とだけ理解すると、少し粗くなります。より正確には、MetalLB は LoadBalancer Service に外部 IP を割り当て、その IP への到達性を L2 または BGP で外部ネットワークへ知らせる部品です。

この記事では、MetalLB をオンプレミス Kubernetes で LoadBalancer Service を成立させるためのネットワーク部品として管理します。実際のインストール方法、Manifest、Helm Chart、FRR-K8s / native mode の選択は、導入時点の公式ドキュメントで確認してください。

MetalLB が必要になる理由

Kubernetes の Service は、Pod の入れ替わりを隠蔽し、安定した接続先を提供します。

しかし、Service の種類によって、どこまで外部公開できるかは変わります。

ClusterIPクラスタ内部向けの Service。外部ネットワークから直接使うものではない。
NodePort各 Node のポートを外部へ開ける方式。単純だが、ポート管理や入口設計が粗くなりやすい。
LoadBalancer外部ロードバランサーを前提に Service を公開する方式。外部 IP の払い出しと到達性を担う実装が必要。

クラウド環境では、クラウドコントローラーが LoadBalancer Service を見て、クラウドロードバランサーを作成します。オンプレミス環境では、この役割を自動で担うクラウド基盤がないため、MetalLB のような実装が必要になります。

MetalLB は Service 抽象と外部ネットワークの接続役である

MetalLB は Service を置き換えるものではありません。LoadBalancer Service に外部 IP と到達性を与え、Kubernetes の抽象をオンプレミスのネットワークへ接続します。

MetalLB の基本構成

MetalLB を見るときは、Controller、Speaker、IPAddressPool、Advertisement を分けると理解しやすくなります。

ControllerLoadBalancer Service に対する IP アドレス割り当てを管理する。
Speaker各 Node 上で動き、L2 または BGP によって外部ネットワークへ到達性を知らせる。
IPAddressPoolService に割り当てる外部 IP アドレスの範囲を定義する。
L2AdvertisementIPAddressPool の IP を L2 モードで広告する設定。
BGPPeerMetalLB が接続する外部 BGP ルーターを定義する。
BGPAdvertisementIPAddressPool の IP を BGP で広告する設定。

公式ドキュメントでも、MetalLB はインストールしただけでは設定なしの状態では待機し、IPAddressPool や広告用リソースを作成して初めて Service IP を扱えるようになります。

IPAddressPool はアドレス管理そのものである

IPAddressPool は、MetalLB が LoadBalancer Service に割り当てる外部 IP アドレスの範囲を定義します。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
  namespace: metallb-system
spec:
  addresses:
    - 192.168.10.240-192.168.10.250

ここで重要なのは、この IP 範囲が Kubernetes の中だけの話ではないという点です。

MetalLB が割り当てる IP は、外部ネットワークから実際に到達する IP です。そのため、DHCP 範囲、既存の固定 IP、ルーター、Firewall、DNS、監視設定と衝突しないように管理する必要があります。

DHCP 範囲MetalLB の IP プールと重複させない。
固定 IP既存サーバー、ルーター、NAS、管理機器の IP と衝突させない。
DNSService 用の DNS 名を割り当てる場合、IP プールと運用ルールを合わせる。
FirewallMetalLB の外部 IP への通信をどこまで許可するかを決める。
監視Service IP、Node、Pod のどこを監視対象にするかを分ける。

MetalLB の導入で失敗しやすいのは、Kubernetes の YAML だけを見て、実ネットワーク上のアドレス管理を軽く扱ってしまうことです。LoadBalancer IP は Kubernetes リソースであると同時に、実ネットワーク上の IP アドレスでもあります。

L2 モードは ARP / NDP で到達性を作る

L2 モードは、MetalLB の中でも始めやすい方式です。

L2 モードでは、MetalLB の Speaker が Service IP に対する ARP / NDP に応答し、外部ネットワークから見て「この IP はこの Node の MAC アドレスにいる」と見えるようにします。

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default-l2
  namespace: metallb-system
spec:
  ipAddressPools:
    - default-pool
向いている環境小規模なオンプレミス環境、自宅ラボ、単一 L2 セグメントの検証環境。
利点BGP ルーターを用意しなくても始められる。構成が分かりやすい。
注意点同一 L2 セグメントでの動作が前提になりやすい。Node 障害時の切り替わりや ARP / NDP の収束を見る必要がある。

L2 モードは簡単ですが、何も考えなくてよいわけではありません。どの Node が Service IP を受け持っているのか、Node 障害時にどれくらいで切り替わるのか、上位スイッチや端末の ARP キャッシュがどう影響するのかは確認しておくべきです。

BGP モードは外部ルーターとの設計になる

BGP モードでは、MetalLB が外部ルーターと BGP ピアを張り、LoadBalancer IP への経路を広告します。

これは、Kubernetes の Service IP を既存の L3 ネットワークへ統合する設計です。

BGPPeerMetalLB が接続する外部ルーター、AS 番号、ピアアドレスを定義する。
BGPAdvertisementどの IPAddressPool を BGP で広告するかを定義する。
外部ルーターMetalLB から受け取った経路を、どの範囲へ流すかを制御する。
経路ポリシーprefix filter、route-map、local preference、ECMP などを設計する。

BGP モードは柔軟ですが、Kubernetes だけで完結しません。外部ルーター側の設定、経路フィルタ、AS 番号、障害時の経路 withdraw、ECMP の扱いまで含めて設計する必要があります。

小規模環境では L2 モードで始め、本格的に冗長化や L3 経路制御をしたくなった段階で BGP モードを検討する方が、理解しやすいと思います。

Service LoadBalancer の確認ポイント

MetalLB が動作している状態で type: LoadBalancer の Service を作成すると、EXTERNAL-IP に IPAddressPool から IP が割り当てられます。

kubectl get service -A
kubectl get ipaddresspool -n metallb-system
kubectl get l2advertisement -n metallb-system
kubectl get pods -n metallb-system -o wide
ServiceEXTERNAL-IP が割り当てられているか。
IPAddressPool割り当て可能な IP 範囲が正しいか。
L2Advertisement / BGPAdvertisementIP プールが実際に広告対象になっているか。
Speaker各 Node 上で動作しているか。権限や host network 周りで失敗していないか。
外部ネットワークARP / NDP、BGP 経路、Firewall、ルーター側の到達性が成立しているか。

Service に外部 IP が付いたからといって、外部から必ず疎通できるとは限りません。Kubernetes 側の割り当て、MetalLB の広告、Node のネットワーク、上位ネットワーク、Firewall を分けて確認します。

運用上の注意点

MetalLB は便利ですが、Kubernetes の外側にあるネットワーク設計を不要にするものではありません。

アドレス管理MetalLB 用の IP 範囲を明確に分離し、DHCP や既存固定 IP と重複させない。
障害時の切り替わりL2 モードでは ARP / NDP の収束、BGP モードでは経路 withdraw と再広告を見る。
送信元 IPexternalTrafficPolicy、Node 経由、Pod 配置によってアプリケーションから見える送信元が変わる。
監視Service IP だけでなく、Speaker、Controller、Node、外部ルーターの状態も見る。
変更管理IPAddressPool の変更は外部公開 IP に直結するため、レビューと切り戻し手順を用意する。

MetalLB は Kubernetes とネットワークの境界にあります。そのため、Kubernetes 管理者だけでなく、ネットワーク側の設計者にも影響します。IP アドレス、VLAN、ルーター、Firewall、DNS、監視のどこに責任があるのかを曖昧にしないことが重要です。

MetalLB の導入はネットワーク設計である

MetalLB を入れること自体より、どの IP を払い出し、どの方式で広告し、障害時にどのように切り替わるかを説明できる状態にすることが重要です。

参考
書籍
参考書籍

Kubernetes 完全ガイド 第 2 版

Kubernetes の Service、Ingress、ネットワーク、運用設計を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

まとめ

MetalLB は、オンプレミス Kubernetes で LoadBalancer Service を成立させるための重要な部品です。

ただし、MetalLB を入れればクラウドロードバランサーと同じものがそのまま得られる、という理解は雑です。MetalLB の役割は、Kubernetes の Service に外部 IP を割り当て、その到達性を L2 または BGP で外部ネットワークへ知らせることです。

つまり、MetalLB の本質は、Kubernetes と物理ネットワークの境界をどう接続するかにあります。

小規模環境では L2 モードで仕組みを理解し、必要に応じて BGP、冗長化、経路制御、監視へ広げる。そう考えると、MetalLB の導入は単なる手順ではなく、オンプレミス Kubernetes の入口設計として扱いやすくなります。

参考情報

関連する記事
Kubernetes MetalLB の導入 – LoadBalancer Service をオンプレ環境で成立させる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る