Basic Node Pool

Updaet : 2025.04.09

1. 기본 NodePool 생성

Karpenter가 실제로 어떻게 작동하는지 이해하기 위해 기본적인 프로비저닝을 수행해 보겠습니다. Karpenter를 사용하면 스케줄되지 않은 Pod을 처리하기 위해 자동으로 노드를 추가하고, 필요하지 않은 경우 이를 제거할 수 있습니다. 이 과정에서 NodePoolEC2NodeClass가 중요한 역할을 합니다.


1.1 NodePool이란?

NodePoolKarpenter의 핵심 리소스(Custom Resource, CRD)로, Karpenter의 동작을 설정하는 역할을 합니다.

① NodePool의 역할

Karpenter는 아래와 같은 작업을 자동으로 수행합니다.

  • 스케줄되지 않은 Pod을 감지하고 이를 위한 노드를 추가

  • Pod을 새로운 노드에 스케줄링

  • 노드가 더 이상 필요하지 않을 경우 자동으로 제거

이러한 동작을 제어하려면 NodePool을 반드시 생성해야 하며, NodePool이 없으면 Karpenter는 비활성화된 상태로 유지됩니다.


1.2 EC2NodeClass란?

EC2NodeClassAWS EC2 관련 설정을 정의하는 Karpenter의 Custom Resource입니다. 각 NodePool은 반드시 하나의 EC2NodeClass를 참조해야 합니다.

  • spec.template.spec.nodeClassRef 속성을 통해 NodePool과 연결됩니다.

  • AWS 환경에서 EC2 관련 설정을 따로 관리할 수 있도록 도와줍니다.

🔗 공식 문서 참고:


1.3 사전 요구 사항

Karpenter를 사용하기 전에 다음과 같은 환경이 준비되어 있어야 합니다.

① 필수 구성 요소

  • Karpenter 설치 완료

  • EKS 클러스터 및 IAM 역할 설정 완료

이제 NodePool과 NodeClass를 배포하겠습니다.


1.4 NodePool 및 NodeClass 배포

이제 NodePool과 EC2NodeClass를 생성하여 Karpenter가 노드를 자동으로 관리할 수 있도록 설정합니다.

① 주요 설정 설명

아래 basic.yaml 파일을 통해 NodePool과 EC2NodeClass를 정의합니다.

설정 항목
설명

consolidateAfter

노드가 저활용 상태일 때 몇 초 후 제거할지 설정. (예제에서는 30초)

requirements

생성할 노드의 제약 조건. instance-category, architecture, capacity-type 등 설정 가능

labels

노드에 추가할 라벨. (Pod을 특정 노드에 스케줄링하는 데 사용)

nodeClassRef

AWS EC2 관련 설정을 참조하는 EC2NodeClass 연결

limits

클러스터 전체 리소스 제한. (예제에서는 cpu: 10)


1.5 NodePool 및 NodeClass 매니페스트 작성

아래 매니페스트를 사용하여 NodePool과 EC2NodeClass를 생성합니다.

  • Node Pool의 이름은 default 이며, 여러개의 Node Pool을 생성해서 관리할 수 있습니다.

  • Karpenter에 의해 생성된 노드에는 eks-team: my-team 라벨이 추가 됩니다.

  • Node Pool에서 생성될 인스턴스 타입의 조건을 정의합니다.

    • 인스턴스 세대 : 5세대 인스턴스 이상

    • 인스턴스 타입 : c,m,r type 인스턴스

    • 인트턴스 아키텍쳐 : x86 아키텍쳐

    • 인스턴스 Capacity Type : on-demand

    • 인스턴스 운영체제 : Linux OS

1.6 NodePool 및 NodeClass 적용

아래 명령어를 실행하여 생성한 매니페스트를 적용합니다.

성공적으로 생성되면 다음과 같은 메시지가 출력됩니다.


1.7 Subnet과 Security Group 에 Tag 설정

다음은 기존 EKS 클러스터, 서브넷 및 보안 그룹에 karpenter.sh/discovery 태그를 추가하는 방법입니다.


① EKS 클러스터 이름 변수 설정

현재 AWS 계정에서 첫 번째 EKS 클러스터의 이름을 가져와 CLUSTER_NAME 변수에 저장합니다.

클러스터에 설정된 모든 태그를 조회합니다.

아래 명령을 통해 " karpenter.sh/discovery" tag가 있는지 확인합니다.

② Cluster에 karpenter.sh/discovery 태그 추가

EKS 클러스터에 Karpenter가 인식할 discovery 태그 추가를 합니다.

태그가 정상적으로 추가되었는지 확인합니다.

아래 명령을 통해 " karpenter.sh/discovery" tag가 있는지 확인합니다.

③ Subnet에 karpenter.sh/discovery 태그 추가

EKS 클러스터가 배포된 서브넷의 ID를 가져와 변수에 저장합니다.

Private 서브넷에 karpenter.sh/discovery 태그를 추가합니다.

Private 서브넷에 karpenter.sh/discovery 태그가 정상적으로 추가되었는지 확인합니다.

④ Security Group에 karpenter.sh/discovery 태그 추가

클러스터가 사용하는 기본 보안 그룹의 ID를 가져와 변수에 저장합니다.

보안 그룹에 karpenter.sh/discovery 태그를 추가합니다.

보안 그룹에 karpenter.sh/discovery 태그가 정상적으로 추가되었는지 확인합니다.


  • EKS 클러스터, 서브넷, 보안 그룹karpenter.sh/discovery 태그를 추가하면 Karpenter가 노드를 자동으로 프로비저닝할 수 있습니다.

  • 태그 적용 후 Karpenter의 로그를 확인하여 정상적으로 서브넷을 감지하는지 점검할 수 있습니다.

위 과정이 완료되면 Karpenter가 정상적으로 작동할 가능성이 높습니다. 🚀

1.8 요약

NodePool을 생성하여 Karpenter가 클러스터 내에서 동작할 수 있도록 설정하였습니다. ✅ EC2NodeClass를 사용하여 AWS EC2 관련 설정을 관리할 수 있도록 구성하였습니다. ✅ 이제 Karpenter는 스케줄되지 않은 Pod을 감지하고 자동으로 노드를 추가할 것입니다.


이제 Karpenter의 기본적인 노드 프로비저닝이 완료되었습니다. 🚀

Last updated

Was this helpful?