オンプレでk8sを遊んでいてぶつかる問題としてLBが定義でなくてnodePortを使って遊ぶしかない問題。これはこれで問題ないけどnodeの数が増えた際に覚えなければいけない事項が増えて困るので導入してみた。
Metallbで出来ること
MetalLBをKubernetesクラスタにデプロイすると、LoadBalancer Serviceにクラスタ外からアクセス可能な仮想IPアドレスを自動で割り振ってくれます。
AWSやらAzureなど以外では別途LVSとかを用意して負荷分散させる必要が必須だと思ってたのですがこれを使えばパブリッククラウドで使っている使用感でLoadBalancerを定義可能です。
モードという概念
metallbにはL2とBGPというモードがあります
- L2モード
MetalLBがARP(IPv4)とNDP(IPv6)をしゃべって、クライアントに対して仮想IPアドレスを解決してくれる。
- BGPモード
MetalLBがBGPをしゃべって、外部のBGPルータとBGP peeringして仮想IPアドレスへのルーティング情報を伝える。BGPルータが上位に必要になるのでお手軽感は低いがクラウドプロパイダが提供しているロードバランサーのような使い勝手なのはこっち
導入
apply
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
configを以下のように設定しapplyすれば使える
apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.10.150-192.168.10.199