워크로드가 EKS Auto Mode 노드에 배포되는지 제어하기

워크로드가 EKS Auto Mode 노드에 배포되는지 제어하기

EKS Auto Mode가 있는 EKS 클러스터에서 워크로드를 실행할 때, 특정 워크로드가 EKS Auto Mode 노드나 다른 컴퓨팅 유형에서 실행되도록 제어해야 할 때가 있어요. 이 토픽에서는 node selector와 affinity 규칙을 사용해 워크로드가 의도한 컴퓨팅 인프라에 스케줄링되도록 하는 방법을 설명해요.

출처: 문서

본문

이 토픽의 예시는 eks.amazonaws.com/compute-type 라벨을 사용해 워크로드가 EKS Auto Mode 노드에 배포되도록 요구하거나 방지하는 방법을 보여줘요. 이는 EKS Auto Mode와 다른 컴퓨팅 유형(예: 자체 관리 Karpenter 프로비저너, EKS Managed Node Groups)을 함께 실행하는 혼합 모드 클러스터에서 특히 유용해요.

EKS Auto Mode 노드는 eks.amazonaws.com/compute-type 라벨의 값을 auto로 설정해요. 이 라벨로 워크로드가 EKS Auto Mode가 관리하는 노드에 배포되는지 제어할 수 있어요.

워크로드가 EKS Auto Mode 노드에 배포되도록 요구하기 (Require that a workload is deployed to EKS Auto Mode nodes)

참고: 이 nodeSelector 값은 EKS Auto Mode에 필수는 아니에요. 이 값은 혼합 모드, 즉 EKS Auto Mode가 관리하지 않는 노드 유형을 실행하는 경우에만 의미가 있어요. 예를 들어 EKS Managed Node Groups로 정적 컴퓨팅 용량을 배포하고, EKS Auto Mode로 동적 컴퓨팅 용량을 관리할 수 있어요.

Kubernetes가 워크로드를 EKS Auto Mode 노드에 스케줄링하도록 요구하려면 Deployment나 다른 워크로드에 이 nodeSelector를 추가할 수 있어요:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      nodeSelector:
        eks.amazonaws.com/compute-type: auto

워크로드가 EKS Auto Mode 노드에 배포되지 않도록 요구하기 (Require that a workload is not deployed to EKS Auto Mode nodes)

Kubernetes가 워크로드를 EKS Auto Mode 노드에 스케줄링하지 않도록 요구하려면 Deployment나 다른 워크로드에 이 nodeAffinity를 추가할 수 있어요:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - auto

특정 NodePool 대상 지정하기 (Target a specific NodePool)

Amazon EKS Auto Mode 클러스터에는 하나 이상의 NodePool이 있을 수 있어요. 워크로드가 특정 NodePool의 노드에서만 실행되도록 하고 싶을 수 있어요. 이를 위해 워크로드는 다음 라벨 중 하나와 매칭될 수 있어요:

  • NodePool에 정의하는 사용자 지정 라벨 (custom label). NodePool의 spec.template.metadata.labels 아래에 라벨을 추가하면 Amazon EKS Auto Mode가 해당 NodePool이 프로비저닝하는 모든 노드에 그 라벨을 적용해요. 사용자 지정 라벨은 권장되는 방식이에요. 사용자 지정 라벨은 특정 NodePool 이름이 아니라 workload-class: gpu-inference 같은 기능에 워크로드를 연결해 주기 때문이에요.
  • 잘 알려진 karpenter.sh/nodepool 라벨. Amazon EKS Auto Mode는 프로비저닝하는 모든 노드에 NodePool 이름을 값으로 해서 이 라벨을 적용해요. 사용자 지정 라벨을 정의하지 않았고 NodePool을 이름으로 대상으로 지정하려면 이 라벨을 사용해요.

사용자 지정 NodePool 라벨 대상 지정하기 (Target a custom NodePool label)

먼저 NodePool에 라벨을 정의해요:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: gpu
spec:
  template:
    metadata:
      labels:
        workload-class: gpu-inference

NodePool 구성에 대한 자세한 내용은 Create a Node Pool for EKS Auto Mode를 참고해 주세요.

다음으로, 워크로드에서 그 라벨을 매칭해요:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: inference
spec:
  template:
    spec:
      nodeSelector:
        workload-class: gpu-inference

이 Deployment의 파드는 gpu NodePool이 프로비저닝하는 노드에서만 스케줄링돼요. 이 nodeSelector가 없는 워크로드는 계속 기본 NodePool에서 실행돼요.

NodePool을 이름으로 대상 지정하기 (Target a NodePool by name)

NodePool 이름 변경이 스케줄링에 영향을 줘요: 워크로드를 이름으로 고정하면 대상 NodePool의 이름을 바꾸거나 삭제할 때 파드가 Pending 상태에 남을 수 있어요. 단일 NodePool 정의보다 오래 살아남을 것으로 예상되는 워크로드에는 사용자 지정 기능 라벨을 사용해 주세요.

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      nodeSelector:
        karpenter.sh/nodepool: <pool-name>

Karpenter가 파드를 NodePool에 매칭하는 방법에 대한 자세한 내용은 Karpenter 문서의 Scheduling을 참고해 주세요.

더 알아보기 (Learn more)