EKS Auto Mode의 정적 용량 Node Pools

EKS Auto Mode의 정적 용량 Node Pools

Amazon EKS Auto Mode는 Pod 수요와 무관하게 고정된 수의 노드를 유지하는 정적 용량 노드 풀을 지원합니다. 정적 용량 노드 풀은 예측 가능한 용량, 예약 인스턴스, 또는 일관된 인프라 발자국을 유지해야 하는 특정 규정 준수 요구사항이 있는 워크로드에 유용합니다.

Pod 스케줄링 수요에 따라 확장되는 동적 노드 풀과 달리, 정적 용량 노드 풀은 사용자가 구성한 노드 수를 유지합니다.

출처: 문서

본문

정적 용량 노드 풀 구성

정적 용량 노드 풀을 만들려면 NodePool 사양에서 replicas 필드를 설정합니다. replicas 필드는 노드 풀이 유지할 정확한 노드 수를 정의합니다. replicas 구성 방법은 Examples를 참고하세요.

정적 용량 노드 풀 고려 사항

정적 용량 노드 풀에는 몇 가지 중요한 제약 조건과 동작이 있습니다.

구성 제약 조건:

  • 모드 전환 불가: 노드 풀에 replicas를 설정하면 제거할 수 없습니다. 노드 풀은 정적 모드와 동적 모드 사이를 전환할 수 없어요.
  • 제한된 리소스 제한: limits 섹션에서 limits.nodes 필드만 지원됩니다. CPU·메모리 제한은 적용되지 않습니다.
  • weight 필드 없음: 노드 선택이 우선순위 기반이 아니므로 정적 용량 노드 풀에는 weight 필드를 설정할 수 없습니다.

운영 동작:

  • 통합 없음: 정적 용량 풀의 노드는 통합 대상으로 고려되지 않습니다.
  • 확장 작업: 확장 작업은 노드 디스럽션 버짓을 우회하지만 PodDisruptionBudgets는 계속 존중합니다.
  • 노드 교체: 노드는 구성에 따라 드리프트(예: AMI 업데이트)와 만료로 인해 여전히 교체됩니다.

모범 사례

용량 계획:

  • 노드 교체 작업 중 임시 확장을 허용하려면 limits.nodes를 replicas보다 높게 설정하세요.
  • limits를 설정할 때 노드 드리프트나 AMI 업데이트 중 필요한 최대 용량을 고려하세요.

인스턴스 선택:

  • Reserved Instances나 특정 하드웨어 요구사항이 있으면 특정 인스턴스 유형을 사용하세요.
  • 확장 중 인스턴스 가용성을 제한할 수 있는 지나치게 제한적인 요구사항은 피하세요.

디스럽션 관리:

  • 가용성과 유지보수 작업의 균형을 맞추도록 적절한 디스럽션 버짓을 구성하세요.
  • 버짓 비율을 설정할 때 노드 교체에 대한 애플리케이션 허용도를 고려하세요.

모니터링:

  • 원하는 용량이 유지되는지 status.nodes 필드를 정기적으로 모니터링하세요.
  • 실제 노드 수가 원하는 replicas와 달라질 때 알림을 설정하세요.

영역 분포:

  • 고가용성을 위해 정적 용량을 여러 Availability Zones에 걸쳐 분산하세요.
  • 여러 Availability Zones에 걸친 정적 용량 노드 풀을 만들면 EKS Auto Mode가 지정된 영역에 노드를 분산하지만 분포가 고르다는 보장은 없어요.
  • Availability Zones 간 예측 가능하고 고른 분포를 원한다면 topology.kubernetes.io/zone 요구사항으로 각각 특정 Availability Zone에 고정된 별도의 정적 용량 노드 풀을 만드세요.
  • 3개 영역에 12개 노드를 고르게 분산해야 한다면 3개 영역에 12개 replicas의 단일 노드 풀보다 각각 4개 replicas의 노드 풀 3개를 만드세요.

정적 용량 노드 풀 확장

kubectl scale 명령으로 정적 용량 노드 풀의 replicas 수를 변경할 수 있습니다.

# Scale down to 5 nodes
kubectl scale nodepool static-nodepool --replicas=5

축소 시 EKS Auto Mode는 PodDisruptionBudgets를 존중하고 실행 중인 Pod가 남은 노드에 다시 스케줄링되도록 하면서 노드를 정상적으로 종료합니다.

정적 용량 노드 풀 모니터링

다음 명령으로 정적 용량 노드 풀을 모니터링합니다.

# View node pool status
kubectl get nodepool static-nodepool

# Get detailed information including current node count
kubectl describe nodepool static-nodepool

# Check the current number of nodes
kubectl get nodepool static-nodepool -o jsonpath='{.status.nodes}'

status.nodes 필드는 노드 풀이 관리하는 현재 노드 수를 보여 주며, 정상 조건에서는 원하는 replicas 수와 일치해야 합니다.

트러블슈팅

노드가 원하는 replicas에 도달하지 못함:

  • limits.nodes 값이 충분한지 확인
  • 요구사항이 인스턴스 선택을 지나치게 제한하지 않는지 확인
  • 사용 중인 인스턴스 유형과 리전의 AWS 서비스 할당량 검토

노드 교체가 너무 오래 걸림:

  • 더 많은 동시 교체를 허용하도록 디스럽션 버짓 조정
  • PodDisruptionBudgets가 노드 종료를 막고 있는지 확인

예기치 않은 노드 종료:

  • expireAfter와 terminationGracePeriod 설정 검토
  • 수동 노드 종료나 AWS 유지보수 이벤트 확인

예시

기본 정적 용량 노드 풀

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: basic-static
spec:
  replicas: 5

  template:
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["m"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a"]

  limits:
    nodes: 8  # Allow scaling up to 8 during operations

특정 인스턴스 유형의 정적 용량

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: reserved-instances
spec:
  replicas: 20

  template:
    metadata:
      labels:
        instance-type: reserved
        cost-center: production
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values: ["m5.2xlarge"]  # Specific instance type
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b", "us-west-2c"]

  limits:
    nodes: 25

  disruption:
    # Conservative disruption for production workloads
    budgets:
      - nodes: 10%

다중 영역 정적 용량 노드 풀

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: multi-zone-static
spec:
  replicas: 12  # Will be distributed across specified zones

  template:
    metadata:
      labels:
        availability: high
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m"]
        - key: "eks.amazonaws.com/instance-cpu"
          operator: In
          values: ["8", "16"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b", "us-west-2c"]
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]

  limits:
    nodes: 15

  disruption:
    budgets:
      - nodes: 25%

용량 예약이 있는 정적 용량

다음 예시는 EC2 Capacity Reservation과 함께 정적 용량 노드 풀을 사용하는 방법을 보여 줍니다. EKS Auto Mode와 함께 EC2 Capacity Reservations를 사용하는 방법은 Control deployment of workloads into Capacity Reservations with EKS Auto Mode를 참고하세요.

capacityReservationSelectorTerms를 정의하는 NodeClass:

apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: capacity-reservation-nodeclass
spec:
  role: AmazonEKSNodeRole
  securityGroupSelectorTerms:
  - id: sg-0123456789abcdef0
  subnetSelectorTerms:
  - id: subnet-0123456789abcdef0
  capacityReservationSelectorTerms:
  - id: cr-0123456789abcdef0

위 NodeClass를 참조하고 karpenter.sh/capacity-type: reserved를 사용하는 NodePool:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-capacity-reservation-nodepool
spec:
  replicas: 5
  limits:
    nodes: 8  # Allow scaling up to 8 during operations
  template:
    metadata: {}
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: capacity-reservation-nodeclass
      requirements:
      - key: karpenter.sh/capacity-type
        operator: In
        values: ['reserved']

더 알아보기 (Learn more)