본문 바로가기 대메뉴 바로가기

테크니컬 스토리

아이티마야의 새로운 기술 뉴스를 만나보세요.
Kubernetes LoadBalancer 사용 (MetalLB)
등록일
2023.01.27
첨부파일
K8s LoadBalancer 사용을 위한 MetalLB
Kubernetes LoadBalancer 사용 (MetalLB)

k8s는 대다수의 서비스를 함께 배포하지만, 일부 서비스는 외부 서비스를 사용해야 합니다.
그중 대표적인게 네트워크 서비스 중 하나인 LoadBalancer입니다.
k8s에서 제공하는 네트워크 모드는 clusterIP, NodePort, LoadBalancer 3가지입니다.
이 포스팅에서는 LoadBalancer 사용을 위해 MetalLB를 구성합니다.

  • ARP 모드 활성화

Metal LB 사용을 위해 ARP 모드를 활성화합니다.

  • $ kubectl edit configmap -n kube-system kube - proxy
  • (수정전)strictARP : false
  • (수정후)strictARP : true
  • Metal LB 설치

Metal LB는 설치용 yaml 파일을 제공합니다. 매우 간단하게 설치할 수 있습니다.

  • $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
  • $ kubectl get all -n metallb-system
  • Metal LB 구성

여기서는 IPAddressPool 을 2개 생성하고, L2 네트워크에 IPAddressPool을 등록하여 구성합니다.
L2 네트워크에 직접 IP Pool을 구성하여 사용할 수도 있습니다.

  • # IP (ip-pool-01) 생성
  • $ vi ip-pool-01.yaml
  • apiVersion: metallb.io/v1beta1
  • kind: IPAddressPool
  • metadata:
  • name: ip-pool-01
  • namespace: metallb-system
  • spec:
  • addresses:
  • - 192.168.0.70-192.168.0.79
  • # IP (ip-pool-01) 생성
  • $ vi ip-pool-02.yaml
  • apiVersion: metallb.io/v1beta1
  • kind: IPAddressPool
  • metadata:
  • name: ip-pool-02
  • namespace: metallb-system
  • spec:
  • addresses:
  • - 192.168.1.180-192.168.1.189
  • # L2네트워크 생성
  • $ vi network-l2-lb-01.yaml
  • apiVersion: metallb.io/v1beta1
  • kind: L2Advertisement
  • metadata:
  • name:network-l2-lb-01
  • namespace: metallb-system
  • spec:
  • ipAddressPools:
  • - ip-pool-01
  • - ip-pool-02
  • #적용
  • $ kubectl apply -f ip-pool-01.yaml
  • $ kubectl apply -f ip-pool-02.yaml
  • kubectl apply -f network-l2-lb-01.yaml
  • (Test) nginx-deploy 생성

Metal LB가 구성되었으니 테스트해 보겠습니다.
nginx deployment를 생성하고 replicas를 3개로 구성합니다.

  • $ vi test-nginx-deploy.yaml
  • apiVersion: apps/v1
  • kind:Deployment
  • metadata:
  • name: test-nginx-deploy
  • labels:
  • app:nginx
  • spec:
  • replicas: 3
  • selector:
  • matchLabels:
  • app: nginx
  • template:
  • metadata:
  • labels:
  • app: nginx
  • spec:
  • containers:
  • - name: test-nginx
  • aimage: nginx
  • ports:
  • - containerPort:80
  • $ kubectl apply -f test-nginx-deploy.yaml
  • (Test) nginx-svc 생성

생성한 deploy의 서비스를 생성합니다. 서비스 타입을 LoadBalancer로 구성합니다.

  • $ vi test-nginx-svc.yaml
  • apiVersion: v1
  • kind:Service
  • metadata:
  • name: est-nginx-svc
  • labels:
  • app:nginx
  • spec:
  • ports:
  • selector:
  • - port:8080
  • targetPort: 80
  • protocol: TCP
  • selector:
  • app: nginx
  • type: LoadBalancer
  • $ kubectl apply -f test-nginx-svc.yaml
  • (Test) svc 확인

서비스가 생성되면 서비스 목록에서 [CLUSTER-IP]와 [EXTERNAL-IP]가 둘 다 생성되는 것을 확인할 수 있습니다.
[EXTERNAL-IP]는 위에서 생성한 IP 풀 내에서 할당되고, 외부에서 접속이 가능합니다.

  • $ kubectl get svc -n default
  • 기존 서비스 수정

기존 서비스의 경우 kubectl edit를 이용하여 [type: ClusterIP]를 [type: LoadBalancer]로 수정하면 적용됩니다.

PLEASE WAIT WHILE LOADING...