aws

AWS | Karpenter

no-easy-ray 2022. 10. 13. 22:47

회사에서는 CA(Cluster Autoscaler)를 사용하고 있지만, 오토스케일링 속도를 향상하기 위해 Karpenter를 설치하여 속도를 비교해 보았고테스트 했던 내용을 정리해보려고 합니다.

 

Karpenter


AWS에서 오픈소스로 개발한 기존 Cluster AutoScaler와 동일하게 클러스터의 오토스케일링을 가능하게 해주는 도구이다.

 

 

Karpenter Inastall


Karpenter 설치의 경우 가이드가 잘되어있기 때문에 따로 작성하지 않는다.

Cluster AutoScaler(CA)를 사용하고 있기 때문에 마이그레이션 부분을 참고하여 진행하였습니다.

 

 

Karpenter 특징


Karpenter는 고성능 쿠버네티스 오토스케일러라고 소개되고 있습니다.

하지만 현재 지원은 AWS EKS와 온프레미스 쿠버네티스만을 지원하고 있습니다.

따라서 Karpenter는 CA와 주로 비교되고 있고, 현재 숨고에서는 CA로 오토스케일링을 하고 있기 때문에 CA와 비교되는 특징들을 정리해 보려고 합니다.

 

Group-less node provisioning

가장 큰 특징으로는 오토스케일링을 수행하기 위해 관리하는 대상의 차이점이 존재합니다.

CA의 경우 EKS의 NodeGoup을 컨트롤하여 연관되는 ASG의 Scale을 수정함으로써 새로운 노드를 확보하게 되는 반면,

Karpenter의 경우 직접 파드 스케쥴링에 필요한 스펙의 인스턴스를 확보합니다.

 

CA를 이용할 경우 운영하는 서비스들이 다양한 스펙의 컴퓨팅 자원을 필요로 한다면, 각 타입에 맞게 NodeGroup을 구성하여 운영해야 합니다. (CPU특화, GPU특화 등… 또한 시작 템플릿에 정의된 Spec으로 밖에 인스턴스가 구동되지 못하는 점도 존재합니다.)

 

각 특성에 맞는 NodeGroup을 생성하는 이유는 CA의 동작원리 때문입니다. (NodeGroup과 ASG를 이용한 스케일링 이기 때문)

하지만, Karpenter의 경우 그룹을 이용하는 게 아닌 직접 필요한 인스턴스를 관리하기 때문에 그룹이라는 제한 없이 필요한 스펙의 인스턴스를 확보할 수 있는 차이점이 있습니다.

추가로 Karpenter는 Instance Type 선정 시 binpacking 알고리즘을 사용한다.

 

Scheduling enforcement

Karpenter의 장점 중 하나는 Pod의 스케쥴링이 CA보다 빠른 점이 있다. (Pod의 스케쥴링 시점이 더 빠르다)

보통 EKS의 경우 노드가 준비되고 나서 Pod가 스케쥴링되지만, Karpenter의 경우 시작하는 노드에 파드가 스케쥴링되도록 합니다.

 

문서상 노드 시작 대기 시간을 몇 초 절약할 수 있다고 나와있습니다.

 

테스트 진행 결과

Karpenter

 

CA(Cluster AutoScaler)

테스트는 노드가 0개인 상태에서 기본 nginx이미지를 사용하는 Pod를 띄우는 것으로 테스트를 진행했습니다.
실제로 속도 비교 시 약 10~15초 정도 빠른 걸로 확인된다.

 

 

Karpenter 구성


Helm Chart로 Karpenter 설치 후 Provisioner라는 CRD를 추가로 설치하여 운영하게 됩니다.

Provisioner의 설정값을 통해 상세한 Instance Type과 AutoScaling 옵션 등을 설정할 수 있습니다.

 

Karpenter에서 인스턴스를 구동시키는 방법은 NodeGroup에 지정된 시작 템플릿을 기반으로 잠시 생성하고, 생성된 시작 템플릿으로 인스턴스를 구동시키는 것을 확인할 수 있습니다.

 

 

시작 템플릿 생성 후 인스턴스 생성

인스턴스 생성 후 시작 템플릿 삭제

 

결론


karpenter를 사용했을 경우 노드가 스케일링 되어 프로비저닝이 완료되는데까지의 시간이 10~15초 정도 줄어드는 것으로 확인되었습니다.

 

Karpenter의 경우 서비스가 필요한 인스턴스 타입이 다양하여 NodeGroup이 많거나 많아지고 있는 상황에서 이점이 많이 크다고 생각합니다. (혹은 앞으로 다양한 인스턴스 타입을 사용하여 Pod를 Node안에 꽉꽉 채워 넣도록 하는 최적화를 진행하거나…)

 

그리고 Karpenter가 나온 지 얼마 되지 않아 문제가 있을 수 있다는 평이 많아 회사에서 적용하지는 못했지만, 개인적은 프로젝트에는 적용해볼 법하다고 생각됩니다. (그리고 실제로 프로덕션에 사용하는 회사도 있습니다.)