📑

オンプレKubernetes環境にMetallbをインストールしてLoadbalanserServiceを利用できるようにする

2022/10/02に公開

Metallbとは

  • オンプレミスKubernetes環境でLoadbalanserTypeのServiceを利用することができるもの
  • 例えば、AWSEKS環境では、LoadbalanserTypeのServiceリソースを作成すると、ELBが作成され、マニフェストファイルの設定がELBの各設定に置き換わるような動きをする
  • L2ModeとBGPModeが利用できるが、大体の環境がL2で問題ないと思われる
    • BGPModeは、家庭内にBGP対応ルータがあればそれと連携することができる(というもののはず)

構成

  • Fedora36
  • kubeadm
  • Master * 1
  • WorkerNode * 3
  • Kubernetes Version 1.24
  • CNI Flannel
  • Metallb v0.13.5

インストール

リファレンスに従ってインストールする
https://metallb.universe.tf/installation/

前提条件

  • サポートされていないCNIがあるので注意が必要
  • もともとCalicoを利用していたが、サポートしていないっぽかったので、flannelで構成することにした
  • サポートしているCNI一覧はこちら

ARP許可

trictARP: false → trueへ変更

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

デプロイ

インストール方法はどれでもかまわない
今回はhelmでデプロイした

helm repo add metallb https://metallb.github.io/metallb
kubectl create namespace metallb-system
helm install metallb metallb/metallb -n metallb-system

IPAddressPool設定

IPAddressPoolを設定する。
Loadbalanserに割り当てうるIPアドレスのレンジを指定するのだが、実際に割あたってほしいIPアドレスレンジを指定する。
例えば、自分の家のLANが192.168.11.0/24で構成されていて、192.168.11.61-70のIPアドレスをLoadbalanserで利用可能にする場合は、以下のような感じになる。
Podのネットワーク(flannelなら10.244.0.0/16の中のネットワーク)を割り当てるわけではないので注意。
※以前のバージョンだとConfigmapで設定していたものらしく、検索だとこちらの記事がよく引っかかるが、それは下記CustomResourceDifinisionへ移行されている。

https://metallb.universe.tf/configuration/

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metallb-system
spec:
  addresses:
  - 192.168.11.61-192.168.11.70
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system
spec:
  ipAddressPools:
  - default

デプロイ

kubectl apply -f ipaddresspool.yaml

動作確認

nginxコンテナとそれに接続されるserviceをデプロイする

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    run: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      run: nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
kubectl apply -f test.yaml

正しくデプロイできると、EXTERNAL-IPにIPAddressPoolで割りふったIPアドレスが割り当たる

kubetl get svc nginx-service
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
nginx-service   LoadBalancer   10.103.108.75   192.168.11.62   80:32291/TCP   7m37s

クラスタ外部からhttp://192.168.11.62へアクセスするとNginxのWelocomeページが表示されているのでOK

参考

https://blog.framinal.life/entry/2020/04/16/022042#MetalLBの構成

https://dockerlabs.collabnix.com/kubernetes/beginners/install/ubuntu/18.04/install-k8s.html

Discussion