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