ABOUT ME

-

  • 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를 서비스 프록시로 사용하는 경우에는 필요 X

    MetalLB가 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
Designed by Tistory.