Kubernetes のネットワーク設計では、「Kubernetes には LoadBalancer がないので MetalLB を入れる」という説明が出てくることがあります。言いたいことは分かりますが、この表現は少し雑です。
Kubernetes には Service という負荷分散の抽象があり、Service の公開方式として type: LoadBalancer も存在します。問題は、Kubernetes がそれ単体で物理ネットワーク上のロードバランサやクラウドロードバランサを自動的に用意するわけではない、という点です。
つまり、「LoadBalancer がない」のではありません。Kubernetes には LoadBalancer Service という抽象はあります。ただし、オンプレ環境では、その抽象に対して外部 IP を払い出し、外部ネットワークから到達できるようにする実装を別途用意する必要があります。ここを分けて考えないと、Service、MetalLB、CNI、BGP が一つの話として混ざります。
Kubernetes にあるのは Service の抽象である
Kubernetes の Service は、Pod 群に対して安定した名前、IP、ポートを提供するためのリソースです。Pod は作り直されるたびに IP が変わりますが、Service を挟むことで、利用者は背後の Pod の増減や入れ替わりを直接意識しなくて済みます。
Service には ClusterIP、NodePort、LoadBalancer などの公開方式があります。LoadBalancer は、外部ロードバランサを前提に Service を公開する方式です。クラウド環境であれば、クラウドコントローラが外部ロードバランサを作成し、Service に外部 IP やホスト名を割り当てるのが一般的です。
apiVersion: v1
kind: Service
metadata:
name: example
spec:
type: LoadBalancer
selector:
app: example
ports:
- name: http
port: 80
targetPort: 8080この YAML の type: LoadBalancer は、「Kubernetes に外部公開用のロードバランサを要求する」という宣言です。しかし、その要求に誰が応答するかは環境によって変わります。AWS、Azure、Google Cloud のような環境ではクラウド側のロードバランサが作られます。オンプレでは、その役割を担う仕組みを自分で用意する必要があります。
MetalLB はオンプレで LoadBalancer Service を成立させる実装である
MetalLB は、オンプレ Kubernetes で type: LoadBalancer の Service に外部 IP を割り当て、外部ネットワークからその IP に到達できるようにするための実装です。
MetalLB は、単に IP アドレスを配るだけではありません。L2 モードであれば、特定ノードがその IP を受け持つように振る舞います。BGP モードであれば、外部ルーターに対して Service の外部 IP への経路を広告します。どちらも、Kubernetes の Service 抽象をオンプレのネットワークに接続するための方法です。
そのため、MetalLB を「Kubernetes に LoadBalancer を追加するもの」とだけ言うと少し浅くなります。より正確には、MetalLB は LoadBalancer Service に対して、オンプレ環境で必要になる外部 IP の割り当てと到達性を提供する部品です。
CNI は Pod ネットワークの土台である
CNI は、Pod にネットワークを与えるための仕組みです。Calico、Cilium、Flannel、Kube-OVN などは、それぞれ異なる設計思想で Pod ネットワーク、NetworkPolicy、経路制御、データプレーンを実装します。
ここで重要なのは、CNI は Service の外部公開そのものだけを担当するものではない、という点です。CNI は Pod 間通信やノード間経路、NetworkPolicy、場合によっては kube-proxy 代替や eBPF データプレーンまで担当します。
一方で、Calico や Cilium のように BGP 機能を持つ CNI もあります。この場合、Pod CIDR や Service IP、LoadBalancer IP の経路広告まで CNI 側で扱えることがあります。すると、MetalLB の BGP と CNI の BGP のどちらで外部到達性を作るのか、という設計判断が必要になります。
BGP はロードバランサではなく経路広告である
BGP はロードバランサではありません。BGP は、どの IP プレフィックスにどの経路で到達するかを外部ネットワークへ伝えるための経路制御プロトコルです。
MetalLB の BGP モードや CNI の BGP 機能は、外部ネットワークに対して「この Service IP または Pod ネットワークには、このノード経由で到達できる」と知らせるために使われます。
そのため、BGP を使ったからといって、それだけでアプリケーションレベルのロードバランシングが完成するわけではありません。BGP は到達性を作ります。実際にどの Pod に流すか、ノードでどのように振り分けるか、送信元アドレスを維持するか、障害時にどのように経路を引っ込めるかは、Service、kube-proxy 代替、CNI、MetalLB、外部ルーターの組み合わせで決まります。
Service、MetalLB、CNI BGP を分ける
| 要素 | 役割 | 注意点 |
|---|---|---|
| Service | Pod 群に対する安定した到達点を作る Kubernetes の抽象 | Service 自体は外部ネットワーク機器ではない |
| type: LoadBalancer | 外部向けロードバランサを要求する Service の公開方式 | 外部 IP の払い出しと到達性は実装側が必要 |
| MetalLB | オンプレ環境で LoadBalancer Service に外部 IP を割り当て、L2 または BGP で到達性を作る実装 | クラウド LB そのものではなく、Kubernetes と外部ネットワークをつなぐ部品 |
| CNI | Pod ネットワーク、NetworkPolicy、経路、データプレーンを担当する領域 | CNI の BGP 機能と MetalLB の BGP 機能は役割が重なる場合がある |
| BGP | 外部ネットワークに経路を伝えるための経路制御プロトコル | BGP はロードバランサではなく、到達性を作る手段 |
このように分けると、「Kubernetes に LoadBalancer はない」という表現がどこでずれているかが見えます。Kubernetes には LoadBalancer Service という抽象があります。ないのは、オンプレ環境でそれを現実のネットワークに接続する外部ロードバランサ実装です。
MetalLB はその実装の一つです。CNI BGP は、Pod ネットワークや Service 到達性を外部ネットワークへ広告する別の設計要素です。BGP はそのための経路制御の手段です。
オンプレ Kubernetes で設計すべきこと
オンプレ Kubernetes では、次の点を明確にしておく必要があります。
- Service の外部 IP を誰が払い出すのか
- その IP への到達性を L2 で作るのか、BGP で作るのか
- MetalLB と CNI の BGP 機能をどちらが担当するのか
- 外部ルーターはどの経路を受け取るのか
- 送信元アドレスを維持する必要があるのか
- ノード障害時に経路や ARP/NDP の収束をどう扱うのか
ここを曖昧にしたまま MetalLB や CNI を入れると、動いているように見えても、障害時や経路変更時に説明できない構成になります。特に BGP を使う場合は、Kubernetes 内部だけではなく、外部ルーター側の設計も含めて考える必要があります。
まとめ
Kubernetes に LoadBalancer がない、という言い方は正確ではありません。Kubernetes には Service の公開方式として type: LoadBalancer があります。
ただし、Kubernetes が単体で外部ロードバランサや物理ネットワーク上の到達性を作ってくれるわけではありません。クラウド環境ではクラウド側のロードバランサがその役割を担い、オンプレ環境では MetalLB や CNI の BGP 機能などを組み合わせて設計します。
Service は Kubernetes の抽象、MetalLB はオンプレで LoadBalancer Service を成立させる実装、CNI は Pod ネットワークの土台、BGP は経路広告の手段です。この4つを分けて考えると、Kubernetes の外部公開設計はかなり見通しがよくなります。
参考情報
- Kubernetes Documentation – Service type LoadBalancer
- MetalLB Documentation – Concepts
- Cilium Documentation – BGP Control Plane
参考書籍
書籍
Kubernetes の Service、ネットワーク、リソース設計を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
関連する記事
- Kubernetes MetalLB の導入 – LoadBalancer Service をオンプレ環境で成立させる
MetalLB を使ってオンプレ環境で LoadBalancer Service を成立させる手順記事です。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
Service 公開時の送信元アドレスと経路設計を切り分ける記事です。 - Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
CNI、kube-proxy 代替、DualStack を設計目線で整理する記事です。 - MicroK8s MetalLB speaker が socket permission denied を出す原因 – L2 / 権限 / ホストネットワークを切り分ける
MetalLB の speaker がホストネットワーク側で何をしているのかを見る補助記事です。



