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 통신이 불가하다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Calicoctl 구성하기 (0) | 2025.03.19 |
---|---|
[Kubernetes] etcd 데몬 설정 및 문제해결 (0) | 2025.03.18 |
[Kubernetes] 로드밸런싱을 위한 Control Plane 중설 및 HAProxy 장애 처리 (0) | 2025.03.17 |
[Kubernetes] Kubernetes NFS PV/PVC 마운트 실패 해결 과정 (0) | 2025.03.05 |
[Kubernetes] containerd VS CRI-O 차이점 (0) | 2025.03.01 |