EKS Auto Mode용 Node Pool 생성하기

EKS Auto Mode용 Node Pool 생성하기

Amazon EKS 노드 풀은 Kubernetes 클러스터에서 컴퓨트 리소스를 유연하게 관리하는 방법을 제공합니다. 이 주제는 클러스터 확장과 리소스 활용을 최적화하는 데 도움이 되는 노드 프로비저닝 도구인 Karpenter로 노드 풀을 생성·구성하는 방법을 보여 줍니다. Karpenter의 NodePool 리소스로 인스턴스 유형, Availability Zones, 아키텍처, 용량 유형을 포함한 컴퓨트 리소스의 특정 요구사항을 정의할 수 있어요.

내장 system과 general-purpose 노드 풀은 수정할 수 없습니다. 활성화하거나 비활성화만 할 수 있어요. 자세한 내용은 Enable or Disable Built-in NodePools를 참고하세요.

NodePool 사양은 다양한 지원 라벨과 요구사항을 통해 EKS 클러스터의 컴퓨트 리소스를 세밀하게 제어할 수 있게 합니다. EC2 인스턴스 카테고리, CPU 구성, Availability Zones, 아키텍처(ARM64/AMD64), 용량 유형(spot 또는 on-demand) 지정 옵션이 포함됩니다. CPU·메모리 사용의 리소스 제한을 설정해 클러스터가 필요한 운영 경계 내에 머물도록 할 수도 있어요.

EKS Auto Mode는 잘 알려진 Kubernetes 라벨을 활용해 노드 특성을 식별하는 일관되고 표준화된 방법을 제공합니다. topology.kubernetes.io/zone(Availability Zones용), kubernetes.io/arch(CPU 아키텍처용) 같은 라벨은 확립된 Kubernetes 규칙을 따릅니다. 또한 EKS 특화 라벨(eks.amazonaws.com/ 접두사)은 인스턴스 유형, CPU 제조사, GPU 기능, 네트워킹 사양 같은 AWS 특화 속성으로 이 기능을 확장합니다. 이 표준화된 라벨링 시스템은 기존 Kubernetes 도구와의 매끄러운 통합을 가능하게 하면서 깊은 AWS 인프라 통합을 제공합니다.

출처: 문서

본문

NodePool 생성

Amazon EKS 클러스터용 NodePool을 만들려면 다음 단계를 따르세요.

  1. 필요한 NodePool 구성으로 nodepool.yaml이라는 YAML 파일을 만듭니다. 아래 샘플 구성을 사용할 수 있어요.
  2. NodePool을 클러스터에 적용합니다.
kubectl apply -f nodepool.yaml
  1. NodePool이 성공적으로 생성되었는지 확인합니다.
kubectl get nodepools
  1. (선택) NodePool 상태를 모니터링합니다.
kubectl describe nodepool default

NodePool이 클러스터에 존재하는 유효한 NodeClass를 참조하는지 확인하세요. NodeClass는 컴퓨트 리소스의 AWS 특화 구성을 정의합니다. 자세한 내용은 Create a Node Class for Amazon EKS를 참고하세요.

샘플 NodePool

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: my-node-pool
spec:
  template:
    metadata:
      labels:
        billing-team: my-team
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m", "r"]
        - key: "eks.amazonaws.com/instance-cpu"
          operator: In
          values: ["4", "8", "16", "32"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b"]
        - key: "kubernetes.io/arch"
          operator: In
          values: ["arm64", "amd64"]

  disruption:
    consolidationPolicy: Balanced
    consolidateAfter: 30s

  limits:
    cpu: "1000"
    memory: 1000Gi

EKS Auto Mode 지원 라벨

EKS Auto Mode는 다음 잘 알려진 라벨을 지원합니다.

Note: EKS Auto Mode는 Karpenter와 다른 라벨을 사용합니다. EC2 관리형 인스턴스 관련 라벨은 eks.amazonaws.com으로 시작합니다.

라벨 예시 설명
topology.kubernetes.io/zone us-east-2a AWS 리전
node.kubernetes.io/instance-type g4dn.8xlarge AWS 인스턴스 유형
kubernetes.io/arch amd64 아키텍처는 인스턴스의 GOARCH 값으로 정의
karpenter.sh/capacity-type spot 용량 유형에는 spot, on-demand, reserved가 있습니다. 지정하지 않으면 Karpenter는 reserved, spot, on-demand 순으로 우선합니다.
eks.amazonaws.com/instance-hypervisor nitro 특정 하이퍼바이저를 사용하는 인스턴스 유형
eks.amazonaws.com/compute-type auto EKS Auto Mode 관리 노드를 식별
eks.amazonaws.com/instance-encryption-in-transit-supported true 전송 중 암호화를 지원(또는 미지원)하는 인스턴스 유형
eks.amazonaws.com/instance-category g 같은 카테고리의 인스턴스 유형, 보통 세대 번호 앞의 문자열
eks.amazonaws.com/instance-generation 4 인스턴스 카테고리 내 인스턴스 유형 세대 번호
eks.amazonaws.com/instance-family g4dn 속성이 비슷하지만 리소스 수량이 다른 인스턴스 유형
eks.amazonaws.com/instance-size 8xlarge 리소스 수량이 비슷하지만 속성이 다른 인스턴스 유형
eks.amazonaws.com/instance-cpu 32 인스턴스의 CPU 수
eks.amazonaws.com/instance-cpu-manufacturer aws CPU 제조사 이름
eks.amazonaws.com/instance-memory 131072 인스턴스의 메모리 메비바이트 수
eks.amazonaws.com/instance-ebs-bandwidth 9500 인스턴스에서 사용 가능한 최대 EBS 메가비트 수
eks.amazonaws.com/instance-network-bandwidth 131072 인스턴스에서 사용 가능한 기준 메가비트 수
eks.amazonaws.com/instance-gpu-name t4 인스턴스의 GPU 이름(있는 경우)
eks.amazonaws.com/instance-gpu-manufacturer nvidia GPU 제조사 이름
eks.amazonaws.com/instance-gpu-count 1 인스턴스의 GPU 수
eks.amazonaws.com/instance-gpu-memory 16384 GPU의 메모리 메비바이트 수
eks.amazonaws.com/instance-local-nvme 900 인스턴스의 로컬 nvme 스토리지 기비바이트 수
eks.amazonaws.com/capacity-reservation-interruptible true 용량 예약이 인터럽트 가능한지 여부. karpenter.sh/capacity-type: reserved 노드에만 존재.

Note: EKS Auto Mode는 특정 인스턴스만 지원하며 최소 크기 요구사항이 있습니다. 자세한 내용은 EKS Auto Mode supported instance reference를 참고하세요.

EKS Auto Mode 미지원 라벨

EKS Auto Mode는 다음 라벨을 지원하지 않습니다. EKS Auto Mode는 Linux만 지원합니다.

  • node.kubernetes.io/windows-build
  • kubernetes.io/os

내장 노드 풀 비활성화

커스텀 노드 풀을 만들면 내장 노드 풀을 비활성화할 수 있어요. 자세한 내용은 Enable or Disable Built-in NodePools를 참고하세요.

내장 노드 풀이 없는 클러스터

내장 노드 풀 없이 클러스터를 만들 수 있습니다. 조직이 커스터마이즈된 노드 풀을 만든 경우 유용해요.

Note: 내장 노드 풀 없이 클러스터를 만들면 default NodeClass가 자동으로 프로비저닝되지 않습니다. 커스텀 NodeClass를 만들어야 해요. 자세한 내용은 Create a Node Class for Amazon EKS를 참고하세요.

개요:

  1. nodePools와 nodeRoleArn 값이 모두 비어 있는 EKS 클러스터를 만듭니다. 샘플 eksctl autoModeConfig:
autoModeConfig:
  enabled: true
  nodePools: []
  # Do not set a nodeRoleARN

자세한 내용은 Create an EKS Auto Mode Cluster with the eksctl CLI를 참고하세요. 2. 노드 역할 ARN으로 커스텀 노드 클래스를 만듭니다. 자세한 내용은 Create a Node Class for Amazon EKS를 참고하세요. 3. 커스텀 노드 클래스용 access entry를 만듭니다. 자세한 내용은 Create node class access entry를 참고하세요. 4. 위에서 설명한 대로 커스텀 노드 풀을 만듭니다.

디스럽션(Disruption)

spec.disruption.consolidationPolicy, spec.disruption.consolidateAfter, spec.template.spec.expireAfter를 사용해 NodePool을 통해 EKS Auto Mode가 노드를 디스럽션하도록 여러 방식으로 구성할 수 있어요. NodePool의 spec.disruption.budgets로 EKS Auto Mode의 디스럽션을 속도 제한할 수도 있습니다. 디스럽션되는 시간 창과 동시 노드 수를 제어할 수도 있어요. 이 동작 구성 방법은 Karpenter Documentation의 Disruption을 참고하세요.

consolidationPolicy 필드는 세 가지 값을 허용합니다.

  • WhenEmpty – 빈 노드만 통합하므로 실행 중인 워크로드는 절대 디스럽션되지 않습니다.
  • WhenEmptyOrUnderutilized – 비용을 위해 공격적으로 통합하며, 노드의 Pod를 더 저렴하게 다시 패킹할 수 있을 때마다 워크로드를 디스럽션합니다.
  • Balanced – 각 통합 작업을 디스럽션 비용과 비용 절감의 가중치로 평가합니다. 디스럽션이 절감보다 큰 작업은 건너뜁니다.

각 값에 대한 자세한 내용은 Karpenter 문서의 Disruption을 참고하세요.

노드 풀에 디스럽션을 구성해 다음을 할 수 있습니다.

  • 인스턴스가 저활용될 때를 식별하고 워크로드를 통합합니다.
  • 드리프트(drift), 빈 상태, 통합으로 인한 노드 종료를 속도 제한하는 노드 풀 디스럽션 버짓을 만듭니다.

기본적으로 EKS Auto Mode는:

  • 저활용 인스턴스를 통합합니다.
  • 336시간 후에 인스턴스를 종료합니다.
  • 노드의 10% 단일 디스럽션 버짓을 설정합니다.
  • 새 Auto Mode AMI가 출시되면(약 주 1회) 드리프트로 인한 노드 교체를 허용합니다.

종료 유예 기간(Termination Grace Period)

EKS Auto Mode NodePool에 terminationGracePeriod가 명시적으로 정의되지 않으면 시스템이 연결된 NodeClaim에 기본 24시간 종료 유예 기간을 자동으로 적용합니다. EKS Auto Mode 고객은 커스텀 NodePool 구성에서 terminationGracePeriod 기본값을 보지 못하지만, NodeClaim에서 이 기본값을 관찰합니다. 유예 기간이 NodePool에 명시적으로 설정되거나 NodeClaim에 기본 적용되더라도 기능은 일관되며, 클러스터 전체에서 예측 가능한 노드 종료 동작을 보장합니다.

더 알아보기 (Learn more)