MetalLB는 Kubernetes 클러스터에서 로드 밸런서를 제공하는 오픈소스 프로젝트이다. 기본적으로 클라우드 환경에서는 클라우드 제공자가 관리하는 로드 밸런서를 통해 Kubernetes 서비스가 외부 트래픽을 받을 수 있다. 그러나 베어메탈 환경이나 자체 데이터 센터에서 운영되는 Kubernetes 클러스터에서는 클라우드 제공자가 제공하는 로드 밸런서를 사용할 수 없다. MetalLB는 이러한 환경에서 Kubernetes에 로드 밸런싱 기능을 추가한다.
MetalLB는 Kubernetes 클러스터 외부에서 접근 가능한 IP 주소를 할당학여 서비스에 외부 트래픽을 로드 밸런싱한다.
MetalLB는 설정된 IP 풀에서 사용할 수 있는 IP 주소를 서비스에 할당한다. 이를 통해 서비스가 외부에서 접근 가능해진다.
로드 밸런싱은 네트워크 트래픽을 여러 서버 또는 서비스로 분산시키는 기술을 말한다. 이를 통해 시스템의 가용성과 성능을 향상시키고, 특정 서버나 서비스에 과도한 부하가 걸리지 않도록 한다.

라운드 로빈 (Round Robin)
들어오는 요청을 순차적으로 각 서버에 분배한다. 모든 서버가 동일한 수의 요청을 처리하도록 한다.
가중 라운드 로빈 (Weighted Round Robin)
각 서버에 가중치를 부여하여, 가중치에 비례하여 요청을 분배한다.
최소 연결 (Least Connection)
현재 연결 수가 가장 적은 서버에 요청을 분배한다.
IP 해싱 (IP Hash)
클라이언트의 IP 주소를 해싱하여 특정 서버에 요청을 분배한다. 이를 통해 특정 클라이언트의 요청이 항상 동일한 서버로 라우팅된다.
랜덤 (Random)
임의의 서버에 요청을 분배한다.
kubenetes가 세팅된 환경이라고 생각하고 진행합니다. 🐟🐟
MetalLB를 설치한다.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
MetalLB가 사용할 IP 주소 범위를 정의하는 ippool.yaml 파일을 생성한다. 강사님이 주신 실습 파일의 내용은 다음과 같다.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 10.10.10.240-10.10.10.250
autoAssign: true
# 파일 적용
kubectl apply -f ippool.yaml
다음은 Layer 2 설정 파일을 생성하고 적용해보자. 마찬가지로 강사님께서 주신 실습 코드이다!
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: lb-pool
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
# 파일 적용
kubectl apply -f l2.yaml
이렇게 설정하면 MetalLB가 클러스터 외부에서 접근 가능한 IP 주소를 Kubernetes 서비스에 할당할 수 있게 되어, 베어메탈 환경에서도 클라우드 환경과 유사한 로드 밸런싱 기능을 사용할 수 있다.
Ingress Ngingx는 Kubernetes 클러스터에서 Ingress 리소스를 관리하고, HTTP 및 HTTPS 트래픽을 클러스터 내의 서비스로 라우팅하는 Ingress 컨트롤러다. Kubernetes Ingress는 외부 트래픽을 클러스터 내부의 특정 서비스로 라우팅하는 규칙을 정의하는 리소스이다.
우선 Ingress Nginx 컨트롤러를 설치해보자.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
nginx의 데모를 배포하고 서비스 노출시키면 끝 🐟
kubectl create deployment ingress-nginx-demo --image=nginx --port=80
kubectl expose deployment ingress-nginx-demo