전공영역 공부 기록

EKS에서 karpenter를 사용해보자

악분 2023. 12. 9. 13:39
반응형

 안녕하세요. 이 글은 karpenter에 대한 간단한 소개와 사용방법을 설명합니다. 영상으로도 만나볼 수 있습니다.

https://youtu.be/WjkfXgNJsig?si=82lsiSHD9a4vfD1o

 

1. 이 글에서 다루는 내용

  • 카펜터가 무엇인지
  • 카펜터 기능
  • 카펜터 동작원리
  • 카펜터 설치방법
  • 카펜터 사용방법

 

2.   선수지식

이 글을 읽기 위해 아래 선수지식이 필요합니다.

  • EKS 사용방법
  • EKS IRSA 사용방법

 

3.   karpetner란?

karpenter는 쿠버네티스 노드를 스케일 in/out하는 클러스터 오토스케일러입니다. 즉, 쿠버네티스 노드를 자동으로 증가시키거나 축소시킵니다.

 

karpenter는 모든 쿠버네티스를 사용할 수 있습니다. 노드를 언제든지 자유롭게 증설 또는 축소시킬 수 있는 클라우드에서 사용하기 편한 EKS, AKS에서 많이 사용합니다.

 

4.   karpenter기능

4.1.   노드 생성

pod를 스케쥴링 할 수 있는 노드가 없어 pod  pending 이벤트가 발생하면, karpneter는 이벤트를 감지해 노드를 자동으로 생성합니다.

 

 

4.2.  노드 삭제

karpenter는 karpenter로 생성한 노드 중에 불필요하다고 판단되는 노드를 삭제합니다. 삭제 판단 기준은 사용자가 설정할 수 있습니다.

  • 노드에 daemonset을 제외한 pod가 없는 경우
  • 노드 유지시간이 지난 경우
  • 노드를 한개로 합칠 수 있는 경우

 

4.3.   스케쥴링

karpenter는 노드를 생성/삭제 과정에서 영향 있는 pod를 직접 스케쥴링합니다. kube-scheduler 대신 직접 스케쥴링 하기 때문에 속도가 향상됩니다.

 

5.   동작원리

karpneter는 모든 쿠버네티스 환경에서 사용할 수 있으므로, karpenter가 실행되는 환경에 따라 동작 원리가 다릅니다.

 

EKS에서 동작하는 karpenter는 EC2 Fleet가 노드를 생성하고 삭제합니다. EC2 Fleet는 요구조건에 적합한 노드 사양을 선택하고 노드를 생성 또는 삭제합니다. EC2 Fleet을 사용하는 karpenter코드를 보면 알 수 있는데 자세한 내용은 이권수님 블로그 또는 제 유투브 영상을 참고해주실 바랍니다.

 

6.   설치방법

설치 방법은 yaml만 배포하면 되기 때문에 매우 쉽습니다. 다만, karpenter가 실행되는 환경에 따라 추가 설정이 필요합니다. 예를 들어 EKS에 karpenter를 설치한다면 EC2 Fleet, Subnet 등 관련 IAM policy가 필요합니다.

 

저는 IRSA를 사용하여 karpenter의 IAM Policy를 설정했습니다. 그리고 helm chart를 사용하여 karpenter를 설치했습니다. 설치에 대한 자세한 과정은 저의 github을 참고해주세요.

 

7. 사용방법

쿠버네티스 CRD를 사용하여 karpenter 설정을 정의합니다. CRD에는 karpenter가 생성할 노드 사양, 노드 삭제 조건 등을 정의합니다. karpenter v0.32를 기준으로 CRD이름이 달라졌습니다. 이름만 달라졌을 뿐 설정내용은 동일합니다.

 

CRD는 NodePool과 NodeClass를 사용합니다. NodePool은 NodeClass를 참조하는 관계를 갖습니다.

 

 

7.1.  NodePool

NodePool은 레이블, taint 등 노드의 메타데이터와 노드 사양 그리고 노드 삭제 조건을 설정합니다. 아래 예제에서는 노드 사양만 정의하고 나머지 설정은 디폴트 설정을 사용했습니다.

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      requirements:
      - key: "karpenter.k8s.aws/instance-category"
        operator: In
        values: ["t"]
      - key: "karpenter.k8s.aws/instance-cpu"
        operator: Gt
        values: ["1"]
      - key: "karpenter.k8s.aws/instance-generation"
        operator: Gt
        values: ["2"]
      - key: "topology.kubernetes.io/zone"
        operator: In
        values: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
      - key: "kubernetes.io/arch"
        operator: In
        values: ["amd64"]
      - key: "karpenter.sh/capacity-type"
        operator: In
        values: ["on-demand"]
      nodeClassRef:
        apiVersion: karpenter.k8s.aws/v1beta1
        kind: EC2NodeClass
        name: default

 

7.2. NodeClass

NodeClass는 쿠버네티스 환경에 맞는 노드 정보를 설정합니다. EKS환경이라면 subnet, IAM Role등을 설정합니다. NodeClass는 NodePool에서 사용합니다.

apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: AL2
  # Managed-nodegroup에 설정된 EC2 인스턴스 IAM role을 확인
  role: "${NODE_ROLE}"

  subnetSelectorTerms:
  - tags:
      karpenter.sh/discovery: "${CLUSTER_NAME}"

  securityGroupSelectorTerms:
  - tags:
      karpenter.sh/discovery: "${CLUSTER_NAME}"

 

7.3   공식문서를 참조하여 설정 찾기

NodePool과 NodeClass 설정해야 하는 필드는 엄청 많습니다. 공식문서를 참조하여 상황에 맞는 필드를 설정해야 합니다. 공식문서 메뉴에서 Concepts에서 설정해야 하는 필드를 확인할 수 있습니다.

 

8.   helloworld실습

helloworld 실습은 유투브 영상으로 대신합니다.

 

참고자료

반응형