-
MetalLB 설치하기Kubernetes 2025. 3. 22. 23:26
MetalLB란?
MetalLB는 베어메탈 Kubernetes 클러스터에서 사용할 수 있는 로드 밸런서 구현체입니다. 일반적으로 Kubernetes에서 로드 밸런서를 사용하려면 클라우드 제공자(GCP, AWS, Azure 등)의 네트워크 서비스를 이용하는데, 베어메탈 환경에서는 이러한 클라우드 네트워크 서비스가 없기 때문에 로드 밸런서를 직접 설정해야 합니다.
MetalLB는 이를 해결하기 위해 **표준 네트워크 라우팅 프로토콜(BGP, ARP)**을 사용하여 베어메탈 환경에서도 Kubernetes 클러스터의 Service에 외부 IP를 할당하고, 외부 트래픽을 클러스터 내부의 서비스로 전달할 수 있게 합니다.
요구사항
- Kubernetes v1.13.0 이상
- 클러스터 네트워크 구성
- 외부 서비스에 할당할 IPv4 주소
- BGP 모드 사용 시
- BGP를 지원하는 라우터 필요
- L2 모드 사용 시
- 노드 간 포트 7946 (TCP & UDP)에서 memberlist 통신을 위해 트래픽이 허용되어야
BGP 모드 L2 모드 동작 방식 ● BGP는 주로 라우터들이 서로 경로를 공유하는 프로토콜로 사용됨. MetalLB는 BGP를 사용하여 외부 네트워크와 Kubernetes 클러스터 간의 IP 주소 경로를 광고 ● 브로드캐스트 방식으로 IP주소를 네트워크 상에서 멀티캐스트하거나 ARP를 사용하여 외부 트래픽을 Kubernetes 서비스로 라우팅 필요한 환경 ● BGP 라우터 필요
○ MetalLB는 BGP를 통해 Kubernetes 서비스에 할당된 IP주소를 외부 네트워크에 광고
● 주로 대규모 클러스터나 복잡한 네트워크 환경에서 사용● 특별한 라우터 없이, 네트워크가 브로드캐스트가 가능한 환경
● 노드 간 통신이 가능하고, MetalLB가 ARP를 통해 외부 IP를 할당하는 방식으로 작동
● 포트 7946 (TCP&UDP)에서 트래픽을 허용장점 ● 높은 확장성 지원
○ 대규모 클러스터 및 네트워크에서 유용
● 자동 경로 업데이트
○ 네트워크가 동적으로 변하더라도 트래픽 라우팅이 자동으로 조정됨● 설정이 단순하고 라우터를 별도로 준비할 필요가 없음
● 소규모 클러스터나 단순한 네트워크 환경에 적함단점 ● BGP 라우터 필요 및 BGP 설정이 다소 복잡할 수 있음 ● 확장성이 BGP에 비해 낮음
○ 큰 네트워크에서 동작하기엔 제한적방법1) Kubespray로 배포
kubespray로 클러스터 구성 시 MetalLB 포함하여 설치하도록 addon구성
kube_proxy_strict_arp 설정
MetalLB를 사용하기 위해서는 kube_proxy_strict_arp 설정이 true로 되어 있어야 함
IPVS 모드에서 kube-proxy를 사용하는 경우 Kubernetes v1.14.2부터 strict arp 모드를 활성화 해야함
kube-router를 서비스 프록시로 사용하는 경우에는 필요 XMetalLB가 Layer2 모드에서 IP를 광고하고, ARP 요청에 올바르게 응답하기 위해 필요한 옵션
kube-proxy는 ARP 요청을 처리할 때 IP 주소가 특정 노드에서만 유효하다고 간주하고, 클러스터의 다른 노드에서 사용되는 IP가 올바르게 라우팅되도록 보장
- kubespray/inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
kube_proxy_strict_arp: true
MetalLB 설정
- kubespray/inventory/mycluster/group_vars/k8s_cluster/addons.yml
- 주석값은 default로 적용되므로 변경/선택 사항만 수정
- metallb_enabled : metallb 기능 활성화
- metallb_protocol : 프로토콜 지정 (layer2 또는 BGP)
- speaker : 클러스터 노드에서 실행되며, 서비스에 연결된 IP를 외부 네트워크에 알리는 역할
- controller : 클러스터 내부에서 실행되며, MetalLB의 중앙 관리 역할. Kubernetes API와 통신하며, IP를 할당하고 관리
- tolerations 설정으로 speaker와 controller가 taint된 노드 (control_plane_node)에서 실행될 수 있도록 함
- adress_pools : MetalLB가 IP를 할당할 수 있는 IP pool 정의
- auto_assign : 설정 pool 안에서 자동 할당
# MetalLB deployment metallb_enabled: true metallb_speaker_enabled: "{{ metallb_enabled }}" metallb_namespace: "metallb-system" # metallb_version: v0.13.9 metallb_protocol: "layer2" # metallb_port: "7472" # metallb_memberlist_port: "7946" metallb_config: # speaker: # nodeselector: # kubernetes.io/os: "linux" # tolerations: # - key: "node-role.kubernetes.io/control-plane" # operator: "Equal" # value: "" # effect: "NoSchedule" # controller: # nodeselector: # kubernetes.io/os: "linux" # tolerations: # - key: "node-role.kubernetes.io/control-plane" # operator: "Equal" # value: "" # effect: "NoSchedule" address_pools: primary: ip_range: - 10.1.33.51-10.1.33.61 auto_assign: true # pool1: # ip_range: # - 10.6.0.0/16 # auto_assign: true # pool2: # ip_range: # - 10.10.0.0/16 # auto_assign: true layer2: - primary # layer3: # defaults: # peer_port: 179 # hold_time: 120s # communities: # vpn-only: "1234:1" # NO_ADVERTISE: "65535:65282" # metallb_peers: # peer1: # peer_address: 10.6.0.1 # peer_asn: 64512 # my_asn: 4200000000 # communities: # - vpn-only # address_pool: # - pool1 # peer2: # peer_address: 10.10.0.1 # peer_asn: 64513 # my_asn: 4200000000 # communities: # - NO_ADVERTISE # address_pool: # - pool2
방법2) 매니페스트로 배포
이미 배포된 클러스터에 Kubernetes manifests를 이용하여 MetalLB 배포
kube_proxy_strict_arp 설정
- 현재 클러스터에서 kube-proxy 구성을 편집
# kubectl edit configmap -n kube-system kube-proxy apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: strictARP: true
MetalLB manifests 배포
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
MetalLB를 설치하는 매니페스트에는 MetalLB가 실제로 어떤 IP 주소 범위를 사용할지, 어떤 프로토콜을 사용할지 등의 설정 정보가 포함되어 있지 않음
설치 후, MetalLB의 구성 요소(컨트롤러와 스피커)는 시작되지만, 실제 서비스 IP를 할당하거나 서비스를 외부에 노출시키는 등의 동작은 구성 파일을 통해 설정이 완료되기 전까지는 대기 상태로 남아 있게 됨manifests 구성 요소
- metallb-system/controller
- metallb-system/speaker
- controller와 speaker를 위한 서비스 계정과, 각 구성 요소가 장동하는데 필요한 RBAC 권한
IPAddressPool 생성
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 10.1.33.51-10.1.33.61
Layer2 구성
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-system
- 특정 IPAddressPool만 설정할 경우 spec 추가 설정
spec: ipAddressPools: - first-pool
방법3) Helm으로 배포
이미 배포된 클러스터에 Helm을 이용하여 MetalLB 배포
kube_proxy_strict_arp 설정
- 현재 클러스터에서 kube-proxy 구성을 편집
# kubectl edit configmap -n kube-system kube-proxy apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: strictARP: true
MetalLB Helm Chart 설정
helm repo add metallb https://metallb.github.io/metallb helm install metallb metallb/metallb -n metallb-system --create-namespace
IPAddressPool 생성
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 10.1.33.51-10.1.33.61
Layer2 구성
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-system
- 특정 IPAddressPool만 설정할 경우 spec 추가 설정
spec: ipAddressPools: - first-pool
설치 확인
기본적으로 ‘metallb-system’ 네임스페이스에 배포됨
- pod
- controller
- speaker
- Ipaddresspools
- L2advertisements
- service
- webhook-service (유효성 검사)
- secret
- memberlist
- webhook-server-cert
테스트
- 테스트 서비스 생성
- type : LoadBalancer
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
- EXTERNAL-IP 할당 확인
- 할당된 IP 접근 확인
'Kubernetes' 카테고리의 다른 글
CloudNativePG (0) 2025.03.23 ArgoCD 설치 (Helm) (0) 2025.03.23 Harbor 설치 (Helm) (0) 2025.03.21 [K8S] kubespray inventory_builder 제거 (0) 2025.03.21 [K8S][폐쇄망]Kubespray로 Kubernetes 설치하기 - Ubuntu (0) 2025.03.20