본문 바로가기

공부기록/42 Seoul

[ft_services] MetalLB 설정

subject PDF 내 Load Balancer 에 대한 요구사항

Load Balancer는 외부에서 여러분의 서비스에 접근하는 것을 관리합니다. 이 load balancer가 여러분의 클러스터에 접근하는 유일한 입구가 될 것입니다. 각 서비스와 연관된 포트를 유지해야합니다.(ex. IP:3000 for Grafana) Load Balancer는 하나의 IP를 가집니다.
서비스로의 모든 Redirection 은 load balancer를 이용해 이루어질 수 있도록 하세요. FTPS, Grafana, Wordpress, phpMyAdmin, nignx는 모두 LoadBalancer 타입입니다. Influx DB와 MySQL은 ClusterIP 타입입니다. 다른 entrie들은 존재할 수 있지만, 그 entrie들 중 어느것도 NodePort 타입이어서는 안됩니다.
Node Port, Ingress, kubectl port-forward 명령어는 금지.
Cloud provider에서 제공하는 loadbalancer는 여기선 무용지물입니다. MetalLB 라는걸 알아보세요.

MetalLB ?

  • bareMetalLoadBalancer
  • 우리의 서비스를 load balancer를 이용해 외부와 연결시켜야 하는데, Service 리소스의 타입 중 하나인 LoadBalancer 는 클라우드 환경이 아닌 경우 사용에 제한이 있다.
  • 우린 클라우드환경이 아닌 로컬에서 하니까 'baremetal' 환경에서 사용할 수 있는 load balancer인 MetalLB를 사용해야 한다.

MetalLB Setup

공식홈페이지에선 이렇게 설치하라고 한다.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

하지만 더 간편한 방법이 있다.

minikube addons enable metallb

minikube는 활성화하거나 비활성화할 수 있고 로컬 쿠버네티스 환경에서 접속해 볼 수 있는 내장 addon이라는걸 제공한다.

 minikube addons list  로 지원하는 서비스의 목록을 볼 수 있다.

우리 과제에선 여기서 metalLB를 활성화해서 사용할 것이고 위 명령으로 metalLB를 활성화(enable)할 수 있다.

위 명령을 실행하고  minikube addons list  를 다시 해보면 metallb가 enabled 상태로 바뀐 것을 확인할 수 있다.


MetalLB Configuration

enable만 해주면 metallb는 유휴상태(idle)로 있기 때문에, yaml 파일로 설정을 적용해주어야 한다.

공식홈페이지에 설정 방법도 잘 나와있다. 3가지 방법이 있는데 Layer2 Configuration이 가장 간편하다.

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250

metallb.yaml

 

여기서 addresses 에 쓰여있는 ip주소 범위 내에서 load balancer가 각 서비스별로 external IP 할당을 해준다. 이 주소 범위는 그대로 두면 안되고, minikube ip 로 나온 ip 주소를 참고해 Host ip 대역을 설정해주어야 한다.

$ minikube ip
192.168.99.100

이 IP 주소는 100부터 시작해서 minikube를 다시 실행할때마다 바뀌었다(1씩 증가함). 다른 코드들을 보니 넉넉하게 100개 정도의 range로 설정하는 방법을 쓰기도 하고, minikube ip 를 파싱해서 사용하는 방법(iwoo님 블로그 참조)도 있었다.

처음엔 minikube ip를 파싱해서 사용했지만, 다른 컨테이너들을 만들 때 설정 파일에 ip 주소가 들어가는 경우가 너무 많았다. 매번 파싱하기가 너무 귀찮아서 그냥 ip 주소 범위를 지정해버렸다.

그리고 ft_services 구버전 서브젝트에서는 서비스마다 다른 ip주소를 가져야했지만, 신버전에서는 꼭 그렇게 하지 않아도 된다고 한다. 하나의 ip 주소를 이용하면서, 포트번호만 다르게 해서 각 서비스에 접근할 수 있으면 된다.

 

#setup.sh

#metallb
minikube addons enable metallb
kubectl apply -f ./srcs/metallb/metallb.yaml

shell 스크립트 metallb 설정 부분

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.99.100-192.168.99.255

metallb.yaml

범위를 192.168.99.100-192.168.99.255 로 지정.

 

metalLB 설정은 끝이다.

다음 단계에서 nginx 컨테이너를 만들어보고, metallb 가 nginx 에게 외부에서 접속할 수 있는 ip 주소를 잘 할당해주나 확인해보자!

 

 

 

trivia

minikube delete를 하고  /Users/{username}/Library/VirtualBox/HostInterfaceNetworking-vboxnet0-Dhcpd.leases  파일을 지워주면 minikube ip 주소가 다시 192.168.99.100으로 돌아오긴 한다고 한다(?) -> 여기 참고

 

 

참고

 

MetalLB (Network LoadBalancer ) & Minikube.

In this article we will start with a brief introduction of Services and which types of services does Kubernetes offers. After that we will…

medium.com