- Kubernetes に LoadBalancer はないのか – Service、MetalLB、CNI BGP を分けて考える
LoadBalancer Service、MetalLB、CNI、BGP の責務を確認した記事です。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
Service 公開時の送信元 IP と経路設計を確認した記事です。 - MicroK8s MetalLB speaker が socket permission denied を出す原因 – L2 / 権限 / ホストネットワークを切り分ける
MetalLB speaker が何をしているのかを補助的に確認する記事です。
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 を分けると理解しやすくなります。
| Controller | LoadBalancer Service に対する IP アドレス割り当てを管理する。 |
|---|---|
| Speaker | 各 Node 上で動き、L2 または BGP によって外部ネットワークへ到達性を知らせる。 |
| IPAddressPool | Service に割り当てる外部 IP アドレスの範囲を定義する。 |
| L2Advertisement | IPAddressPool の IP を L2 モードで広告する設定。 |
| BGPPeer | MetalLB が接続する外部 BGP ルーターを定義する。 |
| BGPAdvertisement | IPAddressPool の 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 と衝突させない。 |
| DNS | Service 用の DNS 名を割り当てる場合、IP プールと運用ルールを合わせる。 |
| Firewall | MetalLB の外部 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 ネットワークへ統合する設計です。
| BGPPeer | MetalLB が接続する外部ルーター、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| Service | EXTERNAL-IP が割り当てられているか。 |
|---|---|
| IPAddressPool | 割り当て可能な IP 範囲が正しいか。 |
| L2Advertisement / BGPAdvertisement | IP プールが実際に広告対象になっているか。 |
| 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 と再広告を見る。 |
| 送信元 IP | externalTrafficPolicy、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 の入口設計として扱いやすくなります。
参考情報
- MetalLB Documentation – Installation
- MetalLB Documentation – Configuration
- MetalLB Documentation – Layer 2 mode
- MetalLB Documentation – BGP mode
- Kubernetes に LoadBalancer はないのか – Service、MetalLB、CNI BGP を分けて考える
Service、MetalLB、CNI BGP の役割を分けて確認した概念記事です。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
Service 公開時の送信元 IP と経路設計を切り分ける記事です。 - Kubernetes MetalLB を Helm で導入する – Harbor で Chart を管理する考え方
MetalLB を Helm Chart として管理する場合の運用設計です。 - MicroK8s MetalLB speaker が socket permission denied を出す原因 – L2 / 権限 / ホストネットワークを切り分ける
MetalLB speaker がホストネットワーク側で何をしているのかを見る補助記事です。 - Kubernetes 運用設計ガイド
Kubernetes 系記事の全体導線に戻ります。

