Study/Study

쿠버네티스 리소스 관리 오픈소스 - Karpenter

TTOII 2023. 11. 9. 18:30
728x90

Karpenter란 무엇인가 ?

AWS가 개발한 K8s 클러스터 상의 워커 노드 자동 확장 기능(생성 및 삭제)을 수행하는 오픈소스 프로젝트이다.

Kapenter는 자신이 생성한 노드의 수명 주기를 관리한다.

사용자는 서비스에 맞게 노드의 사양을 지정하고 Kapenter는 사용자 설정에 따라 노드를 늘렸다가 줄였다가 한다.

 

 

Karpenter 작동 원리

어떻게 Karpenter는 노드를 관리할까? | Karpenter는 노드 생성 및 삭제를 도와주는 오픈소스 도구이다. 클러스터 상에 파드를 올릴 노드가 없으면 Karpenter는 노드를 생성한다. Karpenter는 자신이 생성

brunch.co.kr

해당 글에서 Karpenter의 소개와 쿠버네티스 노드 스케쥴 절차에 대한 내용을 알기 쉽게 다루었다.

 

https://devblog.kakaostyle.com/ko/2022-10-13-1-karpenter-on-eks/

간략하게 정리해보면,

K8s API 서버가 파드 생성 요청을 받으면 스케쥴러가 내부 알고리즘에 의해 적합한 노드를 찾아 파드를 생성한다.

 

Karpenter는 스케쥴러가 적합한 노드를 찾지 못할 때 동작한다.

K8s 스케쥴러가 파드 스케쥴링을 시도했음에도 여전히 Pending 상태라면 Karpenter 컨트롤러는 준실시간으로 스케쥴링되지 않은 파드를 찾는다. 

 

Karpenter의 Provisioner의 내부 코드를 살펴보면 GetPendingPods() 함수는 할당된 노드가 없는 파드 리스트를 불러온다.

그 후 각 파드를 돌면서 IsProvisionable() 함수를 통해 정말 노드를 추가해야 하는지 확인한다.

 

노드를 추가해야 하는 조건은 다음과 같다.

  1. 스케쥴링 되어있지 않음
  2. 선점(Preempt)되어 있지 않음
  3. 스케쥴링에 실패함
  4. Daemonset으로 생성된 파드가 아님
  5. Static 파드가 아님

모든 조건을 만족하는 파드가 있다면 Karpenter 컨트롤러는 새로운 노드를 생성한다.


Karpenter가 노드를 삭제하는 방법 ?

Karpenter는 주기적으로 여러개의 deprovisioner를 실행한다.

Deprovisioner는 특정 조건에 부합하는 노드를 삭제하는 역할을 한다.

 

각 deprovisioner에는 ShouldDeprovision() 함수가 존재하며 해당 deprovisioner가 동작해야 하는 조건을 검사한다.

즉, 노드를 내려도 되는 조건을 확인한다. 조건을 만족하는 노드를 삭제한 후 deprovisioner은 새롭게 삭제할 노드를 찾는다.

728x90