📑
オンプレKubernetes環境にMetallbをインストールしてLoadbalanserServiceを利用できるようにする
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
インストール
リファレンスに従ってインストールする
前提条件
- サポートされていない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へ移行されている。
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