본문 바로가기
K8S

Kubernetes의 Node Scheduling

by Rainbound-IT 2024. 12. 19.
반응형

Kubernetes의 Node Scheduling은 클러스터에서 Pod가 실행될 적절한 Node를 선택하는 과정입니다. Kubernetes Scheduler가 이를 담당하며, 특정 Pod가 실행될 Node를 결정하기 위해 다양한 조건과 제약을 고려합니다.

Node Scheduling의 주요 과정

  1. Scheduling 후보 Node 필터링 (Filtering)
    • Scheduler는 클러스터 내에서 실행 가능한 Node를 찾기 위해 필터링 과정을 수행합니다.
    • 예를 들어, 다음 조건에 맞지 않는 Node는 제외됩니다:
      • Node가 충분한 리소스(CPU, 메모리 등)를 가지고 있는지.
      • Pod의 nodeSelector, nodeAffinity, 또는 taints에 맞는 Node인지.
      • Node 상태가 Ready인지.
  2. 적합한 Node 중에서 최적의 Node 선택 (Scoring)
    • 필터링 과정을 통과한 Node들에 점수를 매기고 최적의 Node를 선택합니다.
    • 점수는 다음 기준으로 계산됩니다:
      • Node의 리소스 사용률 (자원이 덜 사용된 Node가 선호됨).
      • Pod의 preferredDuringSchedulingIgnoredDuringExecution affinity.
      • 기타 사용자 정의 스케줄링 로직.
  3. Pod Binding
    • 최종적으로 선택된 Node에 Pod가 바인딩되어 실행됩니다.

주요 요소 및 설정

  1. Node Affinity 및 Anti-Affinity
    • 특정 Node에서 실행되도록 제어하거나, 특정 Node를 피하도록 설정할 수 있습니다.
    • requiredDuringSchedulingIgnoredDuringExecution: 필수 조건으로 스케줄링.
    • preferredDuringSchedulingIgnoredDuringExecution: 우선적으로 고려되지만 필수는 아님.
  2. Taints and Tolerations
    • Node에 Taints를 설정해 특정 Pod만 스케줄링될 수 있도록 제한합니다.
    • Pod는 Tolerations를 설정하여 해당 Taint를 무시할 수 있습니다.
  3. Node Selector
    • 간단한 방법으로 Pod가 특정 Node에 스케줄링되도록 지정합니다.
    • 예: nodeSelector: {"disktype": "ssd"}.
  4. Custom Scheduler
    • 기본 스케줄러 대신 사용자 정의 스케줄러를 구현할 수 있습니다.
    • Pod 스펙에서 schedulerName을 설정해 특정 스케줄러를 지정합니다.

스케줄링 동작 확인

  • 명령어로 스케줄링 결과를 확인할 수 있습니다.
    kubectl get pods -o wide
     
    Pod가 어떤 Node에 스케줄링되었는지 출력됩니다.

예시: Node Affinity 설정

apiVersion: v1
kind: Pod
metadata:
  name: nginx-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  • 위 설정은 disktype=ssd 레이블이 있는 Node에서만 Pod가 실행되도록 보장합니다.

Node Scheduling을 적절히 활용하면 클러스터의 리소스를 최적화하고, 특정 워크로드 요구 사항을 충족할 수 있습니다.

 

레이블과 Node 이름 방식의 차이

  • nodeSelector (레이블 방식):
    • 더 유연하며 Node 이름 외에도 다른 조건을 추가할 수 있음.
    • Node가 변경될 경우 레이블만 수정하면 됨.
  • nodeName (직접 지정 방식):
    • 강제적으로 특정 Node에서 실행.
    • Node 이름이 변경되면 설정을 수정해야 함.

 

 

반응형

댓글