728x90

목차

     

    LoadBalancer가 무엇일까?

    로드밸런서는 클라이언트 요청을 여러 대상 서버로 분산시켜 서버의 부하를 분산하고 서비스의 가용성을 높이는 역할을 한다. Kubernetes에서는 클러스터 내의 애플리케이션을 외부로 노출시키기 위해 로드밸런서를 사용한다.

    로드밸런서의 전단계인 nodePort를 사용할 수 있지만 이것엔 단점이 존재한다. 단점은 다음과 같다.

    1. 보안 이슈: 노드 포트를 사용하면 모든 노드에서 서비스에 접근할 수 있다. 이는 보안상의 이슈로 이어질 수 있으며, 필요 이상으로 네트워크에 노출될 수 있다.
    2. 포트 충돌: 노드 포트는 각 노드에서 고유한 포트를 사용한다. 만약 다른 서비스가 이미 사용 중인 포트를 선택하면 충돌이 발생하여 서비스가 제대로 동작하지 않을 수 있다.
    3. 한정된 포트 범위: 노드 포트의 포트 범위는 30000-32767이다. 이 범위 내에서만 노드 포트를 사용할 수 있으며, 포트가 부족한 경우 서비스를 제대로 배포할 수 없는 경우가 발생할 수 있다.
    4.노드 의존성: 노드 포트를 사용하면 클러스터 내에서 노드의 구성이 변경되거나 새로운 노드가 추가되었을 때 서비스를 업데이트해야 한다. 이는 유연성을 제한하고 관리 비용을 증가시킬 수 있다.

    nodePort의 위와 같은 단점을 극복하기 때문에 로드밸런서를 사용을 하는 것이다.

     

    LoadBalancer(metalLB) 설치 전 환경에 따라 버전 호환이 안될 수 있다.

    그렇기 때문에 환경 스펙을 비교해보고 설치하자

    kubernetes : 1.28.2
    OS : centOS 7
    containerd : 1.6.28
    MetalLB : 0.11.0

     

    LoadBalancer(metalLB)를 설치 해보자!

    NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    service/superset        LoadBalancer   11.123.141.182   <pending>      8088:30364/TCP   149m

    LoadBalancer(metalLB)를 설치하지 않은 경우 EXTERNAL-IP의 상태가 pending 일 것이다. 이것을 IP가 할당되게 변경해보자.

     

    MetalLB를 구분하여 저장하기 위해 namespace를 생성한다.

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
    [root@docker04 ingress]# kubectl get ns
    NAME              STATUS   AGE
    metallb-system    Active   153m

    namespace를 조회하면 다음과 같이 metallb-system이 생성되었다.

     

    MetalLB를 설치하기

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
    [root@docker04 ingress]# kubectl get all -n metallb-system
    NAME                              READY   STATUS    RESTARTS   AGE
    pod/controller-7b57f7dbdc-ct9x9   1/1     Running   0          156m
    pod/speaker-5nbn4                 1/1     Running   0          156m
    pod/speaker-7jw2q                 1/1     Running   0          156m
    pod/speaker-95rx9                 1/1     Running   0          156m
    
    NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   156m
    
    NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/controller   1/1     1            1           156m
    
    NAME                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/controller-7b57f7dbdc   1         1         1       156m

     

    Secret 생성하기

    kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
    [root@docker04 ingress]# kubectl get secret -n metallb-system
    NAME         TYPE     DATA   AGE
    memberlist   Opaque   1      157m

     

    ConfigMap 생성 및 실행하기

    # 파일명 : metallb_config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: metallb-system
      name: config
    data:
      config: |
        address-pools:
        - name: default
          protocol: layer2
          addresses:
          - 11.123.50.246-11.123.50.250
    kubectl apply -f metallb_config.yaml
    [root@docker04 metallb]# kubectl get configmap -n metallb-system
    NAME               DATA   AGE
    config             1      159m

     

    설치 후 정상동작 확인하기

    [root@docker04 metallb]# kubectl get svc -n superset-ns
    NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP         PORT(S)          AGE
    service/superset        LoadBalancer   11.123.141.182   11.123.50.250      8088:30364/TCP   149m
    728x90
    TOP