Search
Duplicate
📒

[Kubernetes Infra] 03-4. LoadBalancer, Metalb

상태
완료
수업
Kubernetes Infra
주제
4 more properties
참고

LoadBalancer

NOTE
LoadBalancer는 클러스터 외부에서 서비스에 대한 트래픽을 관리하는데 사용된다!
NodePort와 달리 단일 진입점에서 자동으로 각 노드간 로드밸런싱 지원
특정노드 접근 vs 전체노드 공통접근
기존 NodePort는 특정 서버로 접근하던 중, 서버에 문제가 생길때 Pod로 접근하지 못하는 문제가 발생할 수 있다. NodePort는 정상적으로 운영되는 Server로 로드밸런싱해주는 역할을 해주지 못한다.
이와 같은 단점을 해결하기 위해서 LoadBalancer가 등장했다. 외부 IP를 가지고 있는 로드밸런서를 할당받아서 동작하며, on-premiss에서도 MetalLB라는 addon을 사용해서 사용할 수 있다.
클라우드 환경에서는 LoadBalancer와 함께 자동으로 NodePort가 설정되므로, 이 두가지를 명시적으로 구분할 필요는 없다. (LoadBalancer만 작성해도됨)
apiVersion: v1 kind: Service metadata: name: myapp-loadbalancer spec: type: LoadBalancer # 서비스 타입을 LoadBalancer로 설정 ports: - port: 80 # 서비스가 클러스터 외부에 노출될 포트 번호 targetPort: 80 # 포드에서 서비스를 제공하는 포트 번호 selector: app: myapp # 이 서비스에 트래픽을 전달할 포드를 결정하는 레이블 셀렉터
YAML
복사
예시 코드

온프레미스 로드밸런서 MetalLB

NOTE
온프레미스에서 로드밸런서를 사용하려면 내부에 로드밸런서 서비스를 받아주는 구성이 필요한데 이를 지원하는 것이 MetalLB다!
베어메탈 환경의 MetalLb
베어메탈이란 가상화되지 않은 물리적 컴퓨터 하드웨어를 의미한다. 즉 운영체제가 하드웨어 위에서 실행되며, 가상머신(VM)이나 컨테이너와 같은 추가적인 레이어가 없는 상태를 말한다.
MetalLB는 쿠버네티스에서 베어메탈 환경을 위한 로드 밸런서 솔루션이다. 쿠버네티스 클러스터가 클라우드 환경에 배포되는 경우, 클라우드 업체의 로드 밸런서 서비스를 제공해주지만 베어메탈 환경에서는 이러한 서비스를 사용할 수 없으므로 별도의 솔루션을 사용한다.
ex) 오픈소스 기반 - MetalLB, Porter

주요 특징

Layer2모드
metalLB의 Layer2모드는 네트워크의 모든 기기에게 자신이 해당 Ip주소를 가지고 있다고 알린다.
ARP요청에 응답하여 이 작업을 수행하며, 설정이 간단하고 단순하게 동작한다.
BGH(Boarder Gateway Protoclol)
BGP모드는 더 동적이고 유연한 라우터 방식을 제공한다,
MetalLB는 네트워크 내의 BGP 라우터와 피어링하여 쿠버네티스 클러스터 내부에서 사용 가능한 IP주소를 라우터에 알린다.

kubectl 설치

NOTE
k create deployment lb-hname-pods --image=sysnet4admin/echo-hname k scale deployment lb-hname-pods --replicas=3 k create deployment lb-ip-pods --image=sysnet4admin/echo-hname k scale deployment lb-ip-pods --replicas=3
YAML
복사
테스트 pod
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/namespace.yaml kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/metallb.yaml # openssl rand -base64 128을 통해서 스피커 통신간 사용하는 시크릿 생성 kubectl create secret generic -n metallb-system memberlist \ --from-literal=secretkey="$(openssl rand -base64 128)" # address-pools 적용 k apply -f metallb-l2config.yaml # 테스트 코드 k expose deploy lb-hname-pods --type=LoadBalancer --name=lb-haname-svc --port=80 k expose deploy lb-ip-pods --type=LoadBalancer --name=lb-ip-svc --port=80 curl http://192.168.32.10 curl http://192.168.32.11
Bash
복사
설치 & 테스트 코드
apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: nginx-ip-range protocol: layer2 addresses: - 192.168.1.11-192.168.1.13
YAML
복사
metallb-l2config.yaml

Helm 설치

NOTE
helm repo add metallb https://metallb.github.io/metallb helm pull metallb/metallb --untar --version 0.13.7
Bash
복사
helm 저장소 가져오기
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: production namespace: metallb spec: # Production services will go here. Public IPs are expensive, so we leased # just 4 of them. addresses: - 172.17.29.70 - 172.17.29.85
YAML
복사
IPAddressPool
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb spec: ipAddressPools: - production # nodeSelectors: # - matchLabels: # kubernetes.io/hostname: NodeA # - matchLabels: # kubernetes.io/hostname: NodeB
YAML
복사
L2Advertisement
MetalLB버전 0.13.x부터 MetalLB는 이전에 사용되던 ConfigMap대신 CR(사용자 정의 리소스)를 사용하도록 업데이트 되었다.
이제 본인이 직접 yaml로 리소스를 정의해서 적용해야 한다.
kubectl create ns metallb kubectl config set-context --current --namespace=metallb helm install metallb . --namespace metallb -f my-values.yaml . --wait kubectl apply -f L2Advertisement.yaml kubectl apply -f IPAddressPool.yaml
Bash
복사
실행코드

MetalLb 파드 아키텍쳐 확인(kubetail)

NOTE
kubetail은 쿠버네티스 클러스터에서 여러 파드의 로그를 동시에 탐색할 수 있는 도구이다!
apt -y install kubetail kubetail --version k ns metallb-system k get pod kubetail speaker kubetail -n metallb-system
Bash
복사

부하 테스트 및 고가용성 시나리오 검증(k6)

NOTE
k6는 고성능 확장 가능한 로드 테스팅을 수행할 수 있도록 설계된 오픈소스 테스팅 도구이다!
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69 echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list sudo apt-get update sudo apt-get install k6
Bash
복사
설치코드
import http from 'k6/http'; import { check, group, sleep } from 'k6'; # 4분동안 진행 # 0~1분(가상 사용자 0 ~ 1000 증가) # 1~3분(가상 사용자 1000 유지) # 3~4분(가상 사용자 1000 ~ 0 감소) export let options = { stages: [ { duration: '1m', target: 1000 }, { duration: '2m', target: 1000 }, { duration: '1m', target: 0 }, ] }; # get함수를 실행하고 1초쉰다. export default function () { http.get('http://192.168.32.71'); sleep(1); }
Bash
복사
테스트 코드 (k6)