티스토리 뷰

에디.Container

AEWS 5주차. EKS Autoscaling

에디.이이 2023. 5. 26. 11:52

K8s를 사용하다보면,

사용량 증가에 따라 애플리케이션의 성능을 높히기 위해 Pod의 성능이나 수량을 증가시켜야 할 때가 있습니다.

또는 반대로 비용절감 등의 이유로 리소스를 회수하기 위해 Pod의 성능이나 수량을 축소시켜야 할 때도 있습니다.

 

Pod의 경우 Node의 성능 내에서는 자유롭게 변경이 가능하겠지만,

어느 순간 Node의 자원이 부족해지는 상황도 발생할 수 있으며, 이러한 경우에는 Node 수나 성능을 증가해야 합니다.

이부분에 있어 만약 베어메탈 기반의 K8s를 사용중이라면 Node의 수나 성능 향상에 있어서는 자유롭지 못할 수 있습니다.

그러나 EKS를 비롯한 클라우드 또는 가상화 기반의 K8s에서는 해당 기능을 사용할 수 있습니다.

 

EKS에서는 Pod의 수량을 조정하는 Horizontal Pod Autoscaling(HPA)와

Pod의 크기를 조정하는 Verticlal Pod Autoscaling(VPA)를 지원하고 있으며,

클러스터 내 Node의 수량을 조정하는 Cluster Autoscaler(CA)와

Cluster Proportional Autoscaler(CPA), Karpenter를 지원하고 있습니다.

 

 

1. Horizontal Pod Autoscaling(HPA)

일반적으로 표현하는 Scale-out/in의 개념으로, 클러스터 내에서 Pod의 수량을 변화시켜 성능을 변화시킵니다.

기본적으로 pod의 CPU와 메모리 사용량을 기반으로하며, 추가적인 사용자 메트릭을 통해 동작할 수 있습니다.

개별 Pod의 성능이 달라지진 않지만, 동일한 Pod의 수량이 변화합니다.

 

동작은 cAdvisor가 컨테이너들의 메모리와 CPU 정보를 수집하여 Node에 추가로 설치된 metrics-server에 전달합니다.

metrics-server는 kubelet을 통해 수집된 데이터를 apiserver에 등록하게 되고,

HPA는 apiserver로부터 15분마다 수집된 정보를 전달받아 정책에 따라 ReplicaSet을 변화시킵니다.

해당 정보는 Node에 위치한 kubelet에 전달되어 pod의 수를 변화시키게 됩니다.

 

추가적으로 Kubernetes based Event Driven Autosacler(KEDA)를 사용한한다면,

Event Driven 형태로 동작하기 때문에 job queue size나 http request rate 같은 다양한 정책기반의 Scaling이 가능합니다.

KEDA에서 제공하는 Scalers는 공식 홈페이지에서 확인할 수 있으며, 지속적으로 늘어나고 있습니다.

이는 단순 metric과는 다르기 때문에 keda 전용의 metric 서버를 사용하여 데이터를 수집합니다.

 

예를 들어 airflow는 metadb를 통해 현재 실행 중이거나 대기 중인 task가 얼마나 존재하는지 알 수 있으며,

이를 활용하여 pod의 scale을 결정한다면 큐에 task가 많이 추가되는 시점에 더 빠르게 확장할 수 있습니다.

또한, Karpenter와 함께 사용한다면, 특정시간에 AutoScaling 하는 이벤트 기반의 Scaling이 가능합니다.

 

2. Verticlal Pod Autoscaling(VPA)

일반적으로 표현하는 Scale-Up/Down의 개념으로 Pod의 스펙을 변화시켜 성능을 변화시킵니다.

pod의 resources.request의 CPU와 메모리에 대해  값을 설정하면, 해당 범위 내에서 최적값을 구성합니다.

결과적으로 Pod의 수량은 변하지 않으며, Pod의 성능이 높아집니다.

그러나 HPA와 함께 사용할 수는 없습니다.

 

수집된 Metric과 History storage 로깅을 기반으로 VPA 컨트롤러에서 상황을 모니터링합니다.

VPA 컨트롤러는 추천 리소스에 대한 정보를 VPC Admission Controller에게 전달하고, 

Deployment Controller는 Pod의 스펙을 Overwrite하여 pod의 사이즈를 증가시킵니다.

이때 pod의 크기 조정은 기존 pod가 종료되고, 새로운 크기의 신규 pod가 배포되는 방식으로 이루어집니다.

 

 

3. Cluster Autoscaler(CA)

Node 기반의 Scale-Out/in으로, Pod가 아닌 K8s의 Node의 수량 변경을 통해 성능을 변화합니다.

기존 Node에 가용 자원이 부족한 경우 추가된 Node를 배포하여 추가적인 Pod를 배포합니다.

 

CAS는 특정 시간을 간격으로 사용률을 지속적으로 확인하여,

pending 상태인 pod가 존재할 경우 Node를 Scale-in/out을 AWS의 Auto Scaling Group과 연계하여 적용합니다.

이를 위해 EKS에서는 node로 사용되는 EC2 배포시에 cluster-autoscaler와 관련된 TAG가 자동으로 들어가 있습니다.

 

즉, CA를 이용한 Scaling에서는 EKS와 Auto Scaling Group 두군데서 각자의 방식으로 관리가 되며,

서로간의 관리정보가 동기화되지 않으며, CA는 ASG에 전적으로 의지하고, Node의 생성 및 삭제 등에 관여하지 않습니다.

그 결과 EKS에서 Node를 삭제해도 EC2 인스턴스는 삭제가 되지 않으며,

Node 축소시 pod 적은 Node만이 삭제되며 별도의 선택이나 정책 적용이 어려우며, Scaling에 대한 속도가 매우 느립니다.

특히 Request를 기준으로 스케줄링이 이루어지며, 컨테이너 프로세스가 사용하는 리소스 사용량은 고려되지 않습니다.

이러한 이유등으로 인해 CA보다는 Karpenter를 이용하는 방식이 더 선호되고 있습니다.

 

4. Cluster Proportional Autoscaler(CPA)

CPA Node 수량에 비례하여 Pod 개수를 관리합니다.

CPA는 단순하게 동작하며, Metrics server 등을 사용하지 않고 kubapi server API 사용하며,

특정한 규칙 없이 Node 개수에 비례하여 pod 몇개나 배포할지 규칙만 설정하면 됩니다.

즉, Node가 늘면 Pod도 늘고, Pod 증가로 인해 특정 서비스에 부하가 걸리면,

VPA로 Pod 수량을 증가시켜 서비스의 부하를 줄일 수 있습니다.

 

예를 들어 Node가 늘어나면 coredns pod의 개수도 비례하여 증가시켜, coredns의 부하를 줄일  있습니다.

즉, node 개수가 2개일  coredns 1개를, node개수가 5개일 때 coredns를 3 등으로 늘리도록 설정할 수있습니다.

 

 

5. Karpenter

Karpenter는 AWS가 개발한 오픈소스 프로젝트로 Node의 수명주기를 관리하는 솔루션입니다.

CA와 비슷한 역할을 수행하지만, AWS 리소스에 대한 의존성이 없어서 빠른 배포가 가능하다는 점이 강점입니다.

즉, Pod가 pending이 발생할 경우 수십초 이내에 컴퓨팅 리소스를 제공할 수 있습니다.

 

Karpenter는 모는 Node의 수명주기를 관리하고 있으며, 평상시에 unscheduled pod를 관찰하고 있습니다.

관찰중 Pod가 배포되지 못하고 Pending 상태에 빠지게 되면, 바로 새로운 Node를 직접 추가를 결정하고 배포합니다.

이후 Node가 Ready 상태가 되면 kube-scheduler를 대신하여 pod의 Node binding 요청을 수행합니다.

 

즉, Karpenter는 CA에 비해 훨씬 단순하게 동작하며,

클러스터 확장시 발생하는 많은 부분을 Karpenter에서 직접 처리해서 빠르게 확장을 처리할 수 있습니다. 

 

또한, 비용에 대해서도 자동으로 고려해줍니다.

예를 들어 Node를 생성시에도 적절한 스펙의 저렴한 인스턴스를 자동으로 선택해주고,

Pod가 줄어 Node 내 여유가 있다면 자동으로 Node 수량을 줄어줍니다.

또한, 대용량 Node를 통해 소규모 Node를 대체할 경우 비용이 더 저렴해 진다면 자동으로 Node를 변경하기도 합니다.

관련 실습

-----------------------------------------------------------------------------------------------

이 내용은 AEWS(AWS EKS Workshop Study) 1기의 과제로써 작성되었습니다.

AEWS는 '가시다'님이 속한 CloudNet@에서 진행하는 AWS EKS workshop에 대한 스터디입니다.

매주 일요일마다 소중한 정보를 퍼주시는 '가시다'님께 무한 감사 드립니다.

https://gasidaseo.notion.site/23-AWS-EKS-Workshop-07165aec800042b9ac9357aee18fdf17

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
최근에 올라온 글
Total
Today
Yesterday
링크