📑
オンプレ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