EKS의 AutoScaling 이해하기

​ ​

오늘은 Kubernetes의 Cluster AutoScaling에 대해 정리해보려 합니다. 그 다음 EKS에서는 어떻게 적용할 수 있는지, 어떤 효과를 볼 수 있는지 알아보겠습니다.


Kubernetes Cluster AutoScaling

Kubernetes는 Cluster AutoScaler를 통해 동적으로 인프라를 확장할 수 있습니다. Cluster AutoScaler는 Pod의 리소스 요청에 따라 클러스터의 노드를 추가하거나 제거합니다. 만약 리소스 부족으로 인해 스케줄링 대기 상태의 Pod가 존재하는 경우 Cluster AutoScaler가 노드를 추가합니다. 추가 시 설정한 Min, Max 값을 넘어가지 않도록 구성 할 수 있습니다.

먼저 AutoScaler를 설정하면 대기 상태의 Pod을 주기적으로 확인합니다. 클러스터 리소스가 부족하면서 사용자가 정의한 최대 노드 수에 도달하지 않은 경우 노드 프로비저닝을 요청합니다. 노드가 추가되면 스케줄러에 의해 대기 상태의 Pod들이 새로운 노드로 할당됩니다.

노드를 축소하는 프로세스는 사용자가 정의한 메트릭에 의해 시작됩니다. 예를 들어 CPU Utilization이 50% 이하로 설정했다고 가정해보겠습니다. Cluster AutoScaler는 삭제할 노드에서 실행 중인 Pod를 다른 노드로 안전하게 이동시킬 수 있는지 확인합니다. 이때 Pod가 로컬 스토리지를 사용하고 있었다면 데이터 유실이 발생할 수 있으니 PV 사용을 권장합니다. 이러한 확인 프로세스를 노드 또는 Pod 단위로 수행하고 Pod이 모두 이동하게 되면 노드를 제거합니다.


EKS AutoScaler

EKS의 AutoScaler는 AWS의 Auto Scaling Group을 활용하고 있습니다. ASG는 주기적으로 현재 상태를 확인하고 Desired State로 변화하는 방식으로 동작합니다. 사용자는 클러스터 노드 수를 제한하는 Min, Max 값을 지정할 수 있습니다.

위와 같이 목적에 따라 여러 종류의 ASG를 설정하고 서로 다른 AutoScaling Policy를 적용할 수 있습니다. Spot Instance Group을 설정하면 저렴하지만 입찰 가격에 의해 언제든지 인스턴스가 내려갈 수 있습니다. 하지만 EKS의 Spot Interrupt Handler (DeamonSet) 에 의해 정상적으로 실행 중인 Pod들을 재배치할 수 있습니다.

그리고 위 그림과 같이 앞서 설정한 Cluster AutoScaler에 의해 새로운 Spot Instance가 추가됩니다. 분석용 클러스터 같은 경우, 주말과 야간 시간에 사용량이 낮다는 사실을 이미 알고 있기 때문에 CloudWatch Scheduled Policy를 통해 노드를 축소하면 비용을 절감할 수 있습니다.


EKS AutoScaler 설정

먼저 EKS에 ASG 권한을 가지는 IAM Role을 만들어서 Worker Node 보안 그룹에 추가합니다. 다음으로 ASG 그룹 태그를 설정하고 yaml 파일을 클러스터에 배포합니다. 자세한 내용은 공식 문서를 통해 진행하실 수 있습니다. 만약 Policy로 메모리 지표를 사용하고 싶다면 각 노드에 CloudWatch Agent를 배포해야 합니다.