Kubernetes LoadBalancer _ On-premise 기반 로드밸런서 (MetalLB), HPA
※ 본 내용은 「컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 길벗」를 참고하여 작성하였습니다.
1. LoadBalancer(MetalLB)
쿠버네티스 외부 연결방식 중 노드포트를 통해 노드포트 서비스로 이동하고
이를 쿠버네티스의 파드로 보내는 구조는 배우 비효율적입니다.
로드밸런서라는 서비스타입은 매우 간단한 구조로 부하를 분산시킬 수 있습니다.
쿠버네티스에서 로드밸런서를 사용하려면 보통 서비스업체를 통해 구현할 수 있습니다.
하지만 온프레미스에서도 구성이 가능한데 이를 지원해주는 것이 MetalLB입니다.
MetalLB는 기존의 L2 네트워크(ARP/NDP)와 L3 네트워크(BGP)로 로드밸런서를 구현합니다.
구현 절차
(1) 기존에 3개의 pod를 각각 가진 2개의 deployment가 존재한다고 가정하였을 때,
아래와 같은 metallb.yaml 매니페스트 파일을 통해 사전에 정의된 오브젝트 스펙으로 MetalLB를 구성할 수 있습니다.
이를 통해 MetalLB에 필요한 요소가 모두 설치되고 독립적인 네임스페이스(metallb-syustem)도 함께 설치됩니다.
kubectl apply -f ./metallb.yaml
(2) 배포된 MetalLB의 파드가 5개(controller 1개, speaker 4개)인지 확인하고 IP와 상태도 확인합니다.
kubectl get pods -n metallb-system -o wide
(3) ConfigMap 오브젝트(설정이 정의된 포맷)를 사용하여 MetalLB 설정을 적용합니다.
kubectl apply -f ./metallb-l2config.yaml
# metallb-l2config.yaml
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
(4) ConfigMap 생성여부를 확인합니다.
kubectl get configmap -n metallb-system
(5) 적용이 잘 되었는지도 확인해줍니다.
kubectl get configmap -n metallb-system -o yaml
(6) 각 디플로이먼트(lb-hname-pods, lb-ip-pods)를 로드밸런서 서비스에 노출시켜줍니다.
kubectl expose deployment lb-hname-pods --type=LoadBalancer --name=lb-hname-svc --port=80
kubectl expose deployment lb-ip-pods --type=LoadBalancer --name=lb-ip-svc --port=80
(7) 서비스벌로 CLUSTER-IP와 EXTERNAL-IP가 적용이 잘 되었는지 확인합니다.
kubectl get services
2. HAP(Horizontal Pod Autoscaler)
사용자 1명이 파드에 접근하는 것은 위의 방식으로도 크게 문제가 없으나
여러 사람이 접근하는 경우에도 대비해야 하는 상황이 발생할 수 있습니다.
쿠버네티스에서는 이를 대비하기 위해서 HPA(Horizontal Pod Autoscaler)를 통해
부하량에 따라 디플로이먼트의 파드 수를 유동적으로 관리하는 기능을 제공합니다.
절차
먼저 대상이 될 deployment를 생성합니다.
그리고 앞서와 같이 expose를 실행해 로드밸런서 서비스로 설정합니다.
kubectl expose deployment hpa-hname-pods --type=LoadBalancer --name=hpa-hname-svc --port=80
설정된 로드밸런서 서비스와 부여된 IP를 확인합니다.
kubectl get services
그런데 HPA는 각 워커노드의 kubelet에서 계측값을 수집해서 Metrics-Server로 보내고,
Metrics-Server에서는 API서버를 통해 HPA로 계측값을 전달합니다.
전달받은 계측값을 확인하고 HPA는 더 많은 자원이 필요한 경우
Scale 요청을 Deployment로 전달하여 파드의 수를 조절합니다.
하지만 여기서 Metrics-Server는 아직 구현하지 않았기 때문에 설정해주어야 합니다.
메트릭서버도 오브젝트 스펙(매니페스트) 파일로 설치할 수 있습니다.
메트릭 서버의 원본 소스(https://github.com/kubernetes-sigs/metrics-server)에서
96~106번째 라인을 아래 내용과 같이 수정해줍니다.
(TLS 인증 무시, kubelet이 내부주소를 우선 사용하게 만듦)
# metrics-server-service.yaml
...
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server-amd64:v0.3.6
args:
# Manually Add for lab env(Sysnet4admin/k8s)
# skip tls internal usage purpose
- --kubelet-insecure-tls
# kubelet could use internalIP communication
- --kubelet-preferred-address-types=InternalIP
- --cert-dir=/tmp
- --secure-port=4443
...
아래 명령어를 통해 파드의 top값을 확인할 수 있습니다.
여기서는 CPU와 메모리 부하를 확인 가능합니다.
kubectl top pods
edit 명령을 통해 배포된 디플로이먼트 내용 중 아래 내용을 수정해줍니다.
kubectl edit deployment hpa-hname-pods
# 40번째 줄 부터
name: echo-hname
resources:
requests:
cpu: "10m"
limits:
cpu: "50m"
terminationMessagePath: /dev/termination-log
일정 시간 지난 후 kubectl top pods를 실행하면 스펙이 변경되어 새로운 파드가 생성됨을 확인할 수 있습니다.
아래와 같이 autoscale을 설정해서 특정 조건이 만족되는 경우 자동으로 scale 명령이 수행되도록 할 수 있습니다.
kubectl autoscale deployment hpa-hname-pods --min=1 --max=30 --cpu-percent=50
'Data Engineering > docker, kubernetes(k8s)' 카테고리의 다른 글
Docker 볼륨, 바인드 마운트 개념 및 실행 (0) | 2024.12.23 |
---|---|
Kubernetes 스테이트풀셋(StatefulSet)의 정의 및 사용방법 (0) | 2024.12.22 |
Kubernetes 서비스의 개념과 인그레스 (0) | 2024.12.19 |
Kubernetes 노드/파드 운영을 위한 명령어(생성, 변경, 삭제, replica, cordon, drain) (1) | 2024.12.18 |
Kubernetes 설치 및 설정 Code 분석, Pod 생명주기, 기본 명령어 (1) | 2024.12.17 |
댓글