Metallbの概要とL2モードでの使い方

前提、事前設定

CNI

私の環境ではCNIはCiliumを使っています。MetallbはCalicoを完全サポートしていません。

kube-proxy の strictARP を true に設定

BGPモードで使用する場合には不要かもしれません。

# 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

metallib のデプロイ

私はhelmでデプロイしました。

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

デプロイ前

$ k get pod -A
NAMESPACE     NAME                                READY   STATUS    RESTARTS        AGE
kube-system   cilium-2zpfl                        1/1     Running   2 (3m24s ago)   3d1h
kube-system   cilium-gdzzp                        1/1     Running   7 (3m19s ago)   12d
kube-system   cilium-lq477                        1/1     Running   7 (3m18s ago)   12d
kube-system   cilium-nmk75                        1/1     Running   2 (3m24s ago)   3d1h
kube-system   cilium-operator-f45f4975f-cgzg6     1/1     Running   8 (3m19s ago)   12d
kube-system   cilium-qd4rz                        1/1     Running   5 (3m24s ago)   11d
kube-system   cilium-rjtsm                        1/1     Running   7 (3m17s ago)   12d
kube-system   coredns-76f75df574-2slnx            1/1     Running   1 (3m24s ago)   25h
kube-system   coredns-76f75df574-56zfw            1/1     Running   7 (3m19s ago)   12d
kube-system   etcd-k8s-ctrl1                      1/1     Running   7 (3m18s ago)   12d
kube-system   etcd-k8s-ctrl2                      1/1     Running   7 (3m18s ago)   12d
kube-system   etcd-k8s-ctrl3                      1/1     Running   7 (3m18s ago)   12d
kube-system   kube-apiserver-k8s-ctrl1            1/1     Running   7 (3m19s ago)   12d
kube-system   kube-apiserver-k8s-ctrl2            1/1     Running   7 (3m18s ago)   12d
kube-system   kube-apiserver-k8s-ctrl3            1/1     Running   8 (3m18s ago)   12d
kube-system   kube-controller-manager-k8s-ctrl1   1/1     Running   8 (3m18s ago)   12d
kube-system   kube-controller-manager-k8s-ctrl2   1/1     Running   7 (3m18s ago)   12d
kube-system   kube-controller-manager-k8s-ctrl3   1/1     Running   7 (3m18s ago)   12d
kube-system   kube-proxy-6rvft                    1/1     Running   7 (3m18s ago)   12d
kube-system   kube-proxy-8pv9f                    1/1     Running   7 (3m18s ago)   12d
kube-system   kube-proxy-kp95c                    1/1     Running   7 (3m18s ago)   12d
kube-system   kube-proxy-p4nw4                    1/1     Running   2 (3m24s ago)   3d1h
kube-system   kube-proxy-pkhpd                    1/1     Running   2 (3m24s ago)   3d1h
kube-system   kube-proxy-ww49b                    1/1     Running   5 (3m24s ago)   11d
kube-system   kube-scheduler-k8s-ctrl1            1/1     Running   8 (3m19s ago)   12d
kube-system   kube-scheduler-k8s-ctrl2            1/1     Running   7 (3m19s ago)   12d
kube-system   kube-scheduler-k8s-ctrl3            1/1     Running   7 (3m18s ago)   12d

デプロイ

$ helm install metallb metallb/metallb -n metallb-system
NAME: metallb
LAST DEPLOYED: Fri Jul  5 08:42:34 2024
NAMESPACE: metallb-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MetalLB is now running in the cluster.

Now you can configure it via its CRs. Please refer to the metallb official docs
on how to use the CRs.

デプロイ後

metallb-controller と metallb-speaker のpodが生成されていることがわかります。

$ kubectl get pod -n metallb-system
NAME                                  READY   STATUS    RESTARTS   AGE
metallb-controller-665d96757f-lshr8   1/1     Running   0          69s
metallb-speaker-8dx2c                 4/4     Running   0          69s
metallb-speaker-9g89t                 4/4     Running   0          69s
metallb-speaker-hm6jw                 2/4     Running   0          69s
metallb-speaker-v6fnn                 2/4     Running   0          69s
metallb-speaker-xv626                 2/4     Running   0          69s
metallb-speaker-zclms                 4/4     Running   0          69s

L2モード

設定方法

L2モードの設定適用

K8Sのサブネットが192.168.10.0/24のため、ここでは、192.168.10.61-192.168.10.70 をIPアドレスプールに設定しています。

metallb-l2-config.yaml

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

kubectl apply -f metallb-l2-config.yaml

L2モードの設定削除

もし削除する場合(BGPモードに変更する等)は下記で削除できます。

kubectl delete -f metallb-l2-config.yaml

テスト用nginxのデプロイ

test.yaml

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

kubectl create namespace test
kubectl apply -f test.yaml

テスト用nginxのデプロイ結果

EXTERNAL-IP が払い出されています。

$ kubens test
$ k get svc
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx-service   LoadBalancer   10.102.162.163   192.168.10.61   80:30104/TCP   3m10s

L2モードを確認するという意味では、同一ネットワークからアクセスできることを確認するべきですが、一旦port-forwardで確認してみます。 これを行うと localhost としてアクセスできます。

kubectl port-forward svc/nginx-service 8888:80

1376_01.jpg

テスト用nginxの削除

kubectl delete -f test.yaml
kubectl delete namespace test
Copied title and URL