본문 바로가기
DevOps/Kubernetes

[Kubernetes] MetalLB 설치

by Yoon_estar 2025. 3. 20.
728x90

🚀 MetalLB 설치

아래 명령어를 실행하여 MetalLB를 설치합니다. 

# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml

 

🚀 strictARP 설정 변경

1️⃣ 파일 직접 수정하는 방법

# kubectl edit configmap -n kube-system kube-proxy

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true  # false -> true로 변경

 

2️⃣ 명령어로 수정하는 방법

kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

 

🚀 Worker 노드에만 MetalLB 배포

Control Plane 노드에서 MetalLB가 실행될 경우 CrashLoopBackOff 오류가 발생할 수 있습니다. 이를 방지하기 위해 Worker 노드에만 실행되도록 설정합니다.
 

1️⃣ Worker 노드에 Label 추가

# kubectl label node kube-worker-204 node-role.kubernetes.io/worker=
# kubectl label node kube-worker-205 node-role.kubernetes.io/worker=

2️⃣ MetalLB Speaker DaemonSet 수정

아래 명령어로 직접 수정이 불가능한 경우가 있습니다. 따라서 설정을 YAML 파일로 저장한 후 수정 적용하는 것이 좋습니다. 

# kubectl edit daemonset -n metallb-system speaker

 

3️⃣ YAML 파일로 수정 후 적용(아래와 같이 nodeSelector 항목을 추가합니다.)

# kubectl get daemonset -n metallb-system speaker -o yaml > metallb-speaker.yaml
# vi metallb-speaker.yaml
'''

spec:
  template:
    spec:
      nodeSelector:
        node-role.kubernetes.io/worker: ""
        
'''

 

4️⃣ 기존 설정 삭제 후 재적용

# kubectl delete daemonset -n metallb-system speaker
# kubectl apply -f metallb-speaker.yaml

 

5️⃣ 확인

# kubectl get pods -n metallb-system -o wide
NAME                         READY   STATUS    RESTARTS   AGE    IP                NODE              NOMINATED NODE   READINESS GATES
controller-bb5f47665-ksjzz   1/1     Running   0          114m   10.110.33.139     kube-worker-204   <none>           <none>
speaker-cdrln                1/1     Running   0          109m   192.168.207.205   kube-worker-205   <none>           <none>
speaker-shhz9                1/1     Running   0          109m   192.168.207.204   kube-worker-204   <none>           <none>

 

🚀 L2 모드(ARP)로 MetalLB 설정

L2 모드(ARP)를 사용하려면 IP 풀 및 L2 Advertisement를 설정해야 합니다.
 

1️⃣ IP Pool 설정(ip-pool-01.yaml)

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool-01
  namespace: metallb-system
spec:
  addresses:
    - 192.168.207.180-192.168.207.182

 

2️⃣ L2 Advertisement 설정(network-l2-lb-01.yaml)

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: network-l2-lb-01
  namespace: metallb-system
spec:
  ipAddressPools:
    - ip-pool-01

 

3️⃣ 설정 적용 후 서비스 정상적으로 LoadBalancer IP 할당 받았는지 확인

  • 받기 전
# k get po,svc -o wide | grep myweb
pod/myweb   1/1     Running   0          153m   10.110.33.130   kube-worker-204   <none>           <none>
service/myweb-svc    LoadBalancer   10.103.157.17   <Pending>   80:30495/TCP   152m   run=myweb

 

  • 받은 후
# k get po,svc -o wide | grep myweb
pod/myweb   1/1     Running   0          153m   10.110.33.130   kube-worker-204   <none>           <none>
service/myweb-svc    LoadBalancer   10.103.157.17   192.168.207.180   80:30495/TCP   152m   run=myweb

 

🚀 MetalLB 서비스 테스트

1️⃣ 테스트용 애플리케이션 배포

# kubectl create deployment metallb-deploy --image=traefik/whoami --replicas=3 --port=80
# kubectl expose deployment metallb-deploy --name=metallb-deploy-svc --type=LoadBalancer --port=80 --target-port=80

 

2️⃣ 서비스 확인

# k get po,svc -o wide | grep metallb
pod/metallb-deploy-557f57778d-5wvln   1/1     Running   0          60s    10.108.136.17   kube-worker-205   <none>           <none>
pod/metallb-deploy-557f57778d-gf7pl   1/1     Running   0          60s    10.110.33.140   kube-worker-204   <none>           <none>
pod/metallb-deploy-557f57778d-p5znq   1/1     Running   0          60s    10.108.136.16   kube-worker-205   <none>           <none>
service/matallb-deploy-svc   LoadBalancer   10.111.211.48   192.168.207.181   80:31858/TCP   18s    app=metallb-deploy

 

🚀  발생한 문제 및 해결 방법

❌ kubectl edit daemonset로 변경 불가

해결 방법: kubectl get daemonset으로 YAML을 추출한 후 수정 후 kubectl apply로 재적용

❌ CrashLoopBackOff 오류 발생

원인: MetalLB가 Control Plane 노드에서 실행됨
해결 방법: nodeSelector를 추가하여 Worker 노드에서만 실행하도록 설정
 

참고 사항 

LoadBalancer IP로 할당받은 192.168.207.181로는 Ping 통신이 불가하다.