Cloud/Docker & Kubernetes

쿠버네티스의 서비스 (HPA)

DGO 2023. 5. 18. 19:02

HPA

 

만약 파드를 사용하는 사용자가 갑자기 많아져 부하가 증가하게 되면 심한 경우 서비스 중단이 발생 할 수도 있다.

 

쿠버네티스는 이런 경우를 대비해 부하량에 따라 디플로이먼트의 파드 수를 유동적으로 관리하는 기능을 제공하며 이를

 

HPA(Horizontal Pod Autoscaler)라고 한다. 부하량이 증가하게 되면 설정에 따라 파드를 더 배치하게 되고 부하가 감소하

 

게되면 파드를 자동으로 감소시킨다.

 

 

우선 디플로이먼트를 hpa-hname-pods라는 이름으로 생성한다.

 

HPA를 사용하려면 MetalLB가 구성되어 있어야하며 이전 포스트에서 이미 MetalLB를 구성했기 때문에 expose를 실행해

 

해당 디플로이먼트를 바로 로드밸런서 서비스로 설정한다.

 

 

HPA를 사용하려면 파드의 자원이 어느정도 사용되는지 알아야 하기 때문에 부하를 확인하기 위해 리눅스의 top명령어와

 

비슷하게  kubectl top pod 명령어로 자원 사용량을 확인한다.

 

 

명령어를 실행하면 요청한 자원이 없다며 오류 메시지가 발생한다.

 

왜냐하면 HPA 구조를 살펴보면 자원을 요청할 때 메트릭 서버라는 것을 통해 cpu, 메모리 등의 계측값을 전달받게 되는데

 

현재 메트릭 서버가 없기 때문에 계측값을 받지 못하는 것이다.

 

따라서 계측값을 수집하고 전달해 주는 메트릭 서버를 설정해야 한다.

 

 

메트릭 서버도 오브젝트 스펙 파일로 설치가 가능하며 해당 깃허브 링크에서 설치를 제공하고 있다.

 

https://github.com/kubernetes-sigs/metrics-server

 

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut

Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container reso...

github.com

 

해당 명령어를 실행시키면 메트릭 서버가 구성된다.

 

 

하지만 다시 top 명령어를 실행하여도 아래와 같이 오류메시지가 발생하며 정보를 불러오지 못하는데

 

 

이 현상은 tls 인증이 되지 않아 발생하는 에러로 실습에서는 해당 인증을 무시하도록 메트릭 서버를 수정해야 한다.

 

(참고 : https://github.com/kubernetes-sigs/metrics-server/issues/300)

 

아래 명령어를 실행하여 배포된 deployment의 수정이 가능하며 해당 명령어를 입력하게 되면 vi 편집기로 설정을 변경 할

 

수 있다.

 

kubectl edit deployment -n kube-system metrics-server

 

편집기가 열리고 스크롤을 내려 args: 부분에 tls 인증을 무시할 수 있도록 해당 내용(- --kubelet-insecure-tls)을 추

 

가하고 저장한다.

 

 

설정이 변경되고 정보 수집에 시간이 걸리므로 1,2분 정도 경과 후 다시 kubectl top 명령어를 수행하면 아래와 같이 리소스

 

를 정상적으로 모니터링 하는 것을 확인할 수 있다.

 

현재 scale 기준 값이 설정되어 있지 않아 파드를 증설할 시점을 알 수가 없기 때문에 파드에 scale이 실행되게 해당 파드에

 

edit 명령으로 기준 값을 설정한다.

 

kubectl edit deployment hpa-hname-pods 명령어를 실행하여 아래처럼 120행의 resources: {} 부분에 requests, limits 항목

 

을 추가한다.

 

 

여기서 사용한 m이라는 단위는 milliunits의 약어로 1000m이 1 cpu이다.

 

requests: cpu: "10m" 은 0.01cpu 사용을 기준으로 파드를 증설하게 설정한 것이고

 

한쪽 파드로 부하가 몰릴 것을 대비해 limits: cpu: "50m" 으로 cpu 사용제한을 0.05cpu로 설정한다.

 

 

디플로이먼트에 조건을 설정했고 해당 조건이 만족되는 경우에 자동으로 scale이 수행되도록 autoscale 명령을 사용한다.

 

 

min은 최소 파드 수, max는 최대 파드의 수이고 cpu-percent는 cpu 사용량이 50%를 넘게되면 autoscale 하겠다는 옵션이

 

다. 파드 하나가 처리할 수 있는 부하는 10m으로 설정 하였었고 50%인 5m가 넘으면 파드를 증설하도록 되어 있다.

 

kubectl get hpa 명령으로 통해 hpa의 현재 상태를 확인 할 수 있다.

 

 

테스트를 위해 현재 마스터 노드의 터미널을 두 개 띄우고 각각 watch kubectl get pods, watch kubectl top pods 명령어를

 

입력한다.

 

watch를 사용하면 2초에 한번씩 자동으로 상태가 갱신되어 모니터링이 가능하다.

 

그리고 부하를 줄 명령으로 이전에 로드밸런서 테스트 때 사용했던 코드를 powershell로 실행한다.

 

$i=0;
while($true)
{
	% { $i++; write-host -NoNewLine "$i $_" }
	(Invoke-RestMethod "http://192.168.1.11")-replace '\n', " "
}

 

 

코드를 실행하면 부하량이 증가함에 따라 사용률이 올라가고 파드가 생성되는 것을 알 수 있다.

 

 

 

생성된 파드에 분산 되는 부하량을 확인 할 수 있고 더 이상 파드가 생성되지 않는 상태가 되면 부하를 생성하는 파워

 

셀 명령을 종료한다.

 

 

일정 시간이 지나고 더 이상 부하가 없으면 autoscale의 최소 조건인 파드 1개로 돌아가기 위해 파드가 종료되는 것을 확인

 

할 수 있다. 참고로 시간이 좀 걸리는 것으로 보인다.

 

 

 

 

부하 테스트를 완료했고 이와 같이 HPA를 잘 활용하면 자원 사용을 극대화하며 서비스 가동률을 높일 수 있다.