環境
- K8s v1.31.2
- CNI Flannel
- Master×1の単一ノード
やりたいこと
- MetallbのL2モードをK8s環境に入れたい
作業
①Helmでmetallbをインストール(metallb-systemというnsで実行)
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb
②L2モードの設定を入れる(IPAddressPool,L2Advertisement)
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.10.201-192.168.10.250
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
LBに割り当てるIPはホストのネットワークの範囲。今回は192.168.10.200~192.168.10.250。
他の古いサイトとかではconfigmap
を使用しているが、現在はCRDによる構成設定が可能になったため使用できない。
③サンプルサイトをデプロイ
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27.3
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: nginx
serviceでExternal IPが先ほど指定したIPプールの範囲で割り当てられていることを確認。
④単一ノードのnode.kubernetes.io/exclude-from-external-load-balancers
の削除(環境が単一ノードの場合に限る)
どうやら、単一ノードの場合デフォルトでノードにnode.kubernetes.io/exclude-from-external-load-balancers
というラベルが付いているので
そのラベルのためmetallbはノードからサービスをアドバタイズしない。
解決法
-
node.kubernetes.io/exclude-from-external-load-balancers
ラベルの削除 - MetalLBのスピーカー設定で
--ignore-exclude-lb
フラグを有効にする
今回はラベルの削除を行った。
kubectl label node <ノード名> node.kubernetes.io/exclude-from-external-load-balancers-
これをしないと、ホストからはアクセスできるがホストのlanにあるPCからはアクセスできず、arpコマンドを打っても反応しない。
ラベルを削除したら、PCから先ほどのExternal IPにアクセスをして通信できるか確認。
arp -a
でExternal IPとホストのIPのMACアドレスが同じことを確認したらmetallbのL2モードが正常に動いていることが確認できる。
CNIとの互換性
FlannelはサポートされているがCalicoなどの一部はサポートされていないが一応動くらしい。
お好みで、、