[k8s] Service: MetalLB로 로드밸런서 구성하기 (on premise)

이전 포스트
https://blog.naver.com/sssang97/223084158042

GCP GKE나 AWS EKS 같은 클라우드 호스팅 클러스터에서는 자체적으로 로드밸런서를 제공해주기 때문에 사용이 편한 편이다. 하지만 온프레미스 클러스터를 구축할 경우에는 귀찮지만 직접 설정을 해줘야 한다.
개중에서도 그나마 좀 편리하고 범용적으로 사용되는 것이 MetalLB라는 녀석이다.




IP 정리

가장 먼저 해줘야 할 것은 공유기의 주소 할당 범위를 제약하는 것이다. MetalLB가 할당받을 IP 대역을 DHCP로 훔쳐쓰지 못하도록 해야 한다.

나는 IPTIME이었는데, 기존에는 192.168.0.2~192.168.0.254로 되어있던 것을 저렇게 바꿨다. 220번부터를 MetalLB에 여유분으로 챙겨줄 것이다.


netis는 이랬다.




metalLB 설치 (helm)

나는 helm을 통해 설치했다.

아래 명령들을 실행해서 플러그인을 설치한다.
먼저 네임스페이스를 만들어주고

kubectl create ns metallb-system

helm으로 설치를 진행하면 된다.

helm upgrade --install -n metallb-system metallb oci://registry-1.docker.io/bitnamicharts/metallb

그리고 다 뜨길 기다린다.





IP 주소 범위 설정

yaml 하나 파서 주소 범위를 정의한다.
아까 공유기에서 제외한 범위를 넣어줄 것이다.

vi L2-range-allocation.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: example
  namespace: metallb-system
spec:
  addresses:
  - 192.168.0.220-192.168.0.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

그리고 그걸로 apply를 먹여준다.

kubectl apply -f ./L2-range-allocation.yaml

그래서 이렇게 잘 뜨면 잘 된 것이다.




로드밸런서 적용

나는 이렇게 생성된 argocd 엔드포인트를 metalLB 로드밸런서로 내부망에 공개하려 한다.

한번 구성만 잘 했다면, 로드밸런서로 전환하는 방법은 클라우드들과 다르지 않다.

kubectl patch svc 서비스명 -n 네임스페이스 -p '{"spec": {"type": "LoadBalancer"}}'

이렇게 external IP가 잘뜨고


내부망에서 접속도 잘 된다면 된 것이다.

IP 대역을 다시 바꿔야 한다면, yaml 파일 수정 후 재적용을 해줘야한다.


# note the old IPs allocated to the services
kubectl get svc

# delete the old configmap
kubectl -n metallb-system delete cm config

# apply the new configmap
kubectl apply -f L2-range-allocation.yaml

# delete the metallb pods
kubectl -n metallb-system delete pod --all

# watch the pods come back up
kubectl -n metallb-system get pods -w

# inspect new IPs of services
kubectl get svc



참조
https://itnext.io/kubernetes-loadbalancer-service-for-on-premises-6b7f75187be8
https://github.com/metallb/metallb/issues/308
https://linux.systemv.pe.kr/2021/07/metallb-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0/