[Kubernetes] Kubernetes 미니홈서버 구축해 보기 - 9 - 기존 HAProxy와 NodePort로 연결된 NGINX Ingress를 MetalLB로 교체
```
[k8s] Kubernetes 미니홈서버 구축해보기 - 9 - 기존 HAProxy와 NodePort로 연결된 NGINX Ingress를 MetalLB로 교체
```
이번 글을 통해 배워갈 내용
- 개요
- MetalLB 소개
- 사전준비 및 확인
- MetalLB 설치 및 확인
1. 개요
기존 HAProxy 와 NodePort로 연결된 NGINX Ingress를
MetalLB로 교체하여 조금 더 간단하고 깔끔한 Load Balancer 환경을 구축해 보겠습니다.
2. MetalLB 소개
MetalLB는 베어메탈 환경에서 LoadBalancer 타입의 서비스를 지원해 주는 도구입니다.
클라우드 환경에서는 기본적으로 LoadBalancer를 버튼 한 번으로 세팅이 가능하지만
On Promise 환경 및 개인 서버에서는 MetalLB로 IP(VIP)를 할당하고 트래픽을 서비스를 통해
보내주는 역할이 가능합니다
3. 사전준비 및 확인
3-1.
쿠버네티스 버전 1.23 이상이라면 Pod Security Admission (PSA)로 인해서
MetalLB를 설치할 namespace에 privileged 라벨을 붙여야 할 수도 있습니다.
kubectl create ns metallb-system
kubectl get ns metallb-system --show-labels
kubectl label ns metallb-system pod-security.kubernetes.io/enforce=privileged
kubectl label ns metallb-system \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/audit=privileged \
pod-security.kubernetes.io/warn=privileged
kubectl get ns metallb-system --show-labels
3-2
CNI 확인: 저는 Cilium을 사용 중이고, MetalLB와 잘 호환됩니다.
다른 CNI를 쓰더라도 일반적인 Kubernetes 네트워킹을 지원하면 문제없습니다.
3-3
만약 kube-proxy를 IPVS 모드로 사용 중이라면, strictARP를 활성화해야 합니다.
단어설명
kube-proxy는 Kubernetes 클러스터에서 서비스 트래픽을 관리하는 네트워크 프락시이고
IPVS (IP Virtual Server) 모드는 IPVS 모드는 Linux 커널의 LVS(Load Balancer) 기반으로 동작하는 고성능 네트워크 로드 밸런서입니다.
strictARP (Strict Address Resolution Protocol)는 ARP 응답을 제한하는 기능입니다.
IPVS 모드에서는 LoadBalancer 역할을 하는 노드가
클러스터 외부로 직접 트래픽을 전달할 때 올바르게 동작하도록
strictARP를 활성화해야 합니다.
아래 명령어로 확인하고 설정할 수 있습니다:
kubectl get configmap -n kube-system kube-proxy -o yaml | grep strictARP
방법 1
# 수정 (직접 보고 수정)
kubectl edit configmap -n kube-system kube-proxy
```
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: 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
ingress 삭제 (필요시)
helm list -n ingress-controller
helm uninstall ingress-nginx -n ingress-controller
kubectl get all -n ingress-controller
kubectl delete namespace ingress-controller
4. MetalLB 설치 및 확인
Layer 2 모드란?
클러스터 내에서 특정 노드(Worker Node)가 로드 밸런서의 IP를 직접 소유하는 방식입니다. 외부에서 해당 IP로 요청이 오면, MetalLB가 해당 노드의 MAC 주소를 사용하여 트래픽을 전달합니다. 추가적인 BGP 설정이 필요 없어서 가장 간단한 방식입니다.
BGP와 FRR 컴포넌트 제외
설정 파일 작성
cat <<EOF > metallb-values.yaml
controller:
enabled: true
image:
repository: quay.io/metallb/controller
tag: v0.14.9
speaker:
enabled: true
image:
repository: quay.io/metallb/speaker
tag: v0.14.9
frr:
enabled: false # Disable BGP/FRR
EOF
설정 파일 적용해서 설치
helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm install metallb metallb/metallb -n metallb-system -f metallb-values.yaml
IP 범위 적용
kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.10.200-192.168.10.250
EOF
MetalLB의 L2Advertisement 설정을 적용
kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
EOF
확인
kubectl get ipaddresspool -n metallb-system
kubectl get l2advertisement -n metallb-system
kubectl get configmap -n metallb-system config -o yaml
kubectl get pods -n metallb-system
테스트
kubectl run nginx-sample --image=nginx:latest --labels=app=nginx-sample -n default
kubectl get pods -n default -l app=nginx-sample -o wide
kubectl expose pod nginx-sample --port=80 --target-port=80 --type=LoadBalancer --name=nginx-sample-service -n default
kubectl get svc -n default

읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
https://metallb.io/installation/
Installation :: MetalLB, bare metal load-balancer for Kubernetes
Before starting with installation, make sure you meet all the requirements. In particular, you should pay attention to network addon compatibility. If you’re trying to run MetalLB on a cloud platform, you should also look at the cloud compatibility page
metallb.io
https://github.com/metallb/metallb
GitHub - metallb/metallb: A network load-balancer implementation for Kubernetes using standard routing protocols
A network load-balancer implementation for Kubernetes using standard routing protocols - metallb/metallb
github.com
https://stackoverflow.com/questions/66124430/metallb-loadbalancer-is-stuck-on-pending
Metallb LoadBalancer is stuck on pending
I am trying to set up a bare metal Kubernetes server including the metallb LoadBalancer. Therefore, I followed the instructions published on the website of the kind project https://kind.sigs.k8s.io...
stackoverflow.com
'DevOps > Kubernetes' 카테고리의 다른 글
쿠버네티스 미니홈서버 구축해보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정 (0) | 2025.03.04 |
---|---|
쿠버네티스 미니홈서버 구축해보기 - 7 - Proxmox에서 프라이빗 네트워크 만들고 VM 연결하기 (1) | 2025.03.03 |
쿠버네티스 미니홈서버 구축해보기 - 6 - Proxmox 방화벽 점검해보기 (0) | 2025.03.02 |
쿠버네티스 미니홈서버 구축해보기 - 5 - Master Node Control Plane설정해보기 (0) | 2025.03.01 |
쿠버네티스 미니홈서버 구축해보기 - 4 - PROXMOX Ubuntu VM 세팅하기 (2) | 2025.02.26 |
[Kubernetes] Kubernetes 미니홈서버 구축해 보기 - 9 - 기존 HAProxy와 NodePort로 연결된 NGINX Ingress를 MetalLB로 교체
```
[k8s] Kubernetes 미니홈서버 구축해보기 - 9 - 기존 HAProxy와 NodePort로 연결된 NGINX Ingress를 MetalLB로 교체
```

이번 글을 통해 배워갈 내용
- 개요
- MetalLB 소개
- 사전준비 및 확인
- MetalLB 설치 및 확인
1. 개요
기존 HAProxy 와 NodePort로 연결된 NGINX Ingress를
MetalLB로 교체하여 조금 더 간단하고 깔끔한 Load Balancer 환경을 구축해 보겠습니다.
2. MetalLB 소개
MetalLB는 베어메탈 환경에서 LoadBalancer 타입의 서비스를 지원해 주는 도구입니다.
클라우드 환경에서는 기본적으로 LoadBalancer를 버튼 한 번으로 세팅이 가능하지만
On Promise 환경 및 개인 서버에서는 MetalLB로 IP(VIP)를 할당하고 트래픽을 서비스를 통해
보내주는 역할이 가능합니다
3. 사전준비 및 확인
3-1.
쿠버네티스 버전 1.23 이상이라면 Pod Security Admission (PSA)로 인해서
MetalLB를 설치할 namespace에 privileged 라벨을 붙여야 할 수도 있습니다.
kubectl create ns metallb-system
kubectl get ns metallb-system --show-labels
kubectl label ns metallb-system pod-security.kubernetes.io/enforce=privileged
kubectl label ns metallb-system \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/audit=privileged \
pod-security.kubernetes.io/warn=privileged
kubectl get ns metallb-system --show-labels
3-2
CNI 확인: 저는 Cilium을 사용 중이고, MetalLB와 잘 호환됩니다.
다른 CNI를 쓰더라도 일반적인 Kubernetes 네트워킹을 지원하면 문제없습니다.
3-3
만약 kube-proxy를 IPVS 모드로 사용 중이라면, strictARP를 활성화해야 합니다.
단어설명
kube-proxy는 Kubernetes 클러스터에서 서비스 트래픽을 관리하는 네트워크 프락시이고
IPVS (IP Virtual Server) 모드는 IPVS 모드는 Linux 커널의 LVS(Load Balancer) 기반으로 동작하는 고성능 네트워크 로드 밸런서입니다.
strictARP (Strict Address Resolution Protocol)는 ARP 응답을 제한하는 기능입니다.
IPVS 모드에서는 LoadBalancer 역할을 하는 노드가
클러스터 외부로 직접 트래픽을 전달할 때 올바르게 동작하도록
strictARP를 활성화해야 합니다.
아래 명령어로 확인하고 설정할 수 있습니다:
kubectl get configmap -n kube-system kube-proxy -o yaml | grep strictARP
방법 1
# 수정 (직접 보고 수정)
kubectl edit configmap -n kube-system kube-proxy
```
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: 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
ingress 삭제 (필요시)
helm list -n ingress-controller
helm uninstall ingress-nginx -n ingress-controller
kubectl get all -n ingress-controller
kubectl delete namespace ingress-controller
4. MetalLB 설치 및 확인
Layer 2 모드란?
클러스터 내에서 특정 노드(Worker Node)가 로드 밸런서의 IP를 직접 소유하는 방식입니다. 외부에서 해당 IP로 요청이 오면, MetalLB가 해당 노드의 MAC 주소를 사용하여 트래픽을 전달합니다. 추가적인 BGP 설정이 필요 없어서 가장 간단한 방식입니다.
BGP와 FRR 컴포넌트 제외
설정 파일 작성
cat <<EOF > metallb-values.yaml
controller:
enabled: true
image:
repository: quay.io/metallb/controller
tag: v0.14.9
speaker:
enabled: true
image:
repository: quay.io/metallb/speaker
tag: v0.14.9
frr:
enabled: false # Disable BGP/FRR
EOF
설정 파일 적용해서 설치
helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm install metallb metallb/metallb -n metallb-system -f metallb-values.yaml
IP 범위 적용
kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.10.200-192.168.10.250
EOF
MetalLB의 L2Advertisement 설정을 적용
kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
EOF
확인
kubectl get ipaddresspool -n metallb-system
kubectl get l2advertisement -n metallb-system
kubectl get configmap -n metallb-system config -o yaml
kubectl get pods -n metallb-system
테스트
kubectl run nginx-sample --image=nginx:latest --labels=app=nginx-sample -n default
kubectl get pods -n default -l app=nginx-sample -o wide
kubectl expose pod nginx-sample --port=80 --target-port=80 --type=LoadBalancer --name=nginx-sample-service -n default
kubectl get svc -n default

읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
https://metallb.io/installation/
Installation :: MetalLB, bare metal load-balancer for Kubernetes
Before starting with installation, make sure you meet all the requirements. In particular, you should pay attention to network addon compatibility. If you’re trying to run MetalLB on a cloud platform, you should also look at the cloud compatibility page
metallb.io
https://github.com/metallb/metallb
GitHub - metallb/metallb: A network load-balancer implementation for Kubernetes using standard routing protocols
A network load-balancer implementation for Kubernetes using standard routing protocols - metallb/metallb
github.com
https://stackoverflow.com/questions/66124430/metallb-loadbalancer-is-stuck-on-pending
Metallb LoadBalancer is stuck on pending
I am trying to set up a bare metal Kubernetes server including the metallb LoadBalancer. Therefore, I followed the instructions published on the website of the kind project https://kind.sigs.k8s.io...
stackoverflow.com
'DevOps > Kubernetes' 카테고리의 다른 글
쿠버네티스 미니홈서버 구축해보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정 (0) | 2025.03.04 |
---|---|
쿠버네티스 미니홈서버 구축해보기 - 7 - Proxmox에서 프라이빗 네트워크 만들고 VM 연결하기 (1) | 2025.03.03 |
쿠버네티스 미니홈서버 구축해보기 - 6 - Proxmox 방화벽 점검해보기 (0) | 2025.03.02 |
쿠버네티스 미니홈서버 구축해보기 - 5 - Master Node Control Plane설정해보기 (0) | 2025.03.01 |
쿠버네티스 미니홈서버 구축해보기 - 4 - PROXMOX Ubuntu VM 세팅하기 (2) | 2025.02.26 |