Kubernetes의 스케줄링 및 노드 선택 정책

1. Kubernetes 스케줄링 개요

Kubernetes에서 스케줄링이란 새롭게 생성된 Pod를 클러스터 내의 적절한 Node에 배치하는 과정입니다. Kubernetes 스케줄러는 클러스터의 리소스 상태, Pod의 요구 사항, 정책 등을 고려하여 최적의 노드를 결정합니다.

2. Kubernetes 스케줄러(Kube-Scheduler)

2.1 역할

Kube-Scheduler는 Control Plane의 핵심 구성 요소 중 하나로, 다음과 같은 기능을 수행합니다.

  • 스케줄링이 필요한 Pod를 감지하고 대기열에 추가
  • 클러스터 내 사용 가능한 노드들의 상태를 평가
  • 적절한 노드를 선택하여 Pod를 배치

2.2 스케줄링 단계

Kubernetes의 스케줄링 프로세스는 크게 두 단계로 나뉩니다.

  1. 필터링(Filtering): 스케줄러는 먼저 Pod의 요구 사항을 만족하는 노드를 필터링합니다.
    • NodeSelectorNode Affinity 조건을 만족하는지 확인
    • Taints 및 Tolerations을 고려하여 배치 가능한 노드 결정
    • Resource(메모리, CPU 등) 요청이 가능한 노드 확인
  2. 스코어링(Scoring): 필터링된 노드 중 가장 적절한 노드를 선택하기 위해 점수를 부여합니다.
    • CPU 및 메모리 가용성
    • Pod 간 친화성 및 비친화성(Affinity/Anti-Affinity)
    • 기존 리소스 사용률 및 로드 밸런싱 고려

3. 노드 선택 정책

Kubernetes에서는 다양한 노드 선택 정책을 제공하여 사용자가 Pod를 원하는 노드에 배치할 수 있도록 합니다.

3.1 NodeSelector

NodeSelector는 Pod를 특정 노드에 배치할 수 있도록 하는 가장 기본적인 방법입니다. nodeSelector 필드를 사용하여 노드의 특정 라벨을 기반으로 Pod를 배치합니다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  nodeSelector:
    disktype: ssd
  containers:
    - name: example-container
      image: nginx

3.2 Node Affinity

Node Affinity는 NodeSelector보다 더 유연한 방식으로, 특정 조건을 만족하는 노드에 Pod를 배치하거나 특정 노드를 피하도록 설정할 수 있습니다.

  • requiredDuringSchedulingIgnoredDuringExecution: 반드시 조건을 만족하는 노드에만 배치
  • preferredDuringSchedulingIgnoredDuringExecution: 가능한 한 조건을 만족하는 노드에 배치하지만, 필수는 아님
apiVersion: v1
kind: Pod
metadata:
  name: affinity-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  containers:
  - name: nginx
    image: nginx

3.3 Taints and Tolerations

Taints와 Tolerations는 특정 노드에 Pod가 배치되지 않도록 하거나, 특정 Pod만 배치될 수 있도록 하는 메커니즘입니다.

Taints 적용 예시 (노드 수준)

kubectl taint nodes node1 key=value:NoSchedule

Toleration 설정 예시 (Pod 수준)

apiVersion: v1
kind: Pod
metadata:
  name: toleration-pod
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"
  containers:
  - name: nginx
    image: nginx

3.4 Pod Affinity 및 Pod Anti-Affinity

Pod 간의 배치 전략을 설정할 수 있으며, 같은 노드 또는 특정 노드 그룹 내에서 함께 배치하거나 피하도록 설정할 수 있습니다.

  • Pod Affinity: 특정 Pod와 가까운 노드에 배치
  • Pod Anti-Affinity: 특정 Pod와 다른 노드에 배치
apiVersion: v1
kind: Pod
metadata:
  name: affinity-example
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        labelSelector:
          matchLabels:
            app: frontend
        topologyKey: "kubernetes.io/hostname"
  containers:
  - name: nginx
    image: nginx

4. 스케줄링 정책 커스터마이징

4.1 Kubernetes Scheduler Profiles

Kubernetes에서는 여러 개의 스케줄러 프로필을 정의하여 특정 워크로드에 맞게 스케줄링을 최적화할 수 있습니다.

4.2 사용자 정의 스케줄러

기본 스케줄러 대신 사용자 정의 스케줄러를 설정할 수도 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: custom-scheduler-pod
spec:
  schedulerName: my-custom-scheduler
  containers:
  - name: nginx
    image: nginx

5. 결론

Kubernetes의 스케줄링 및 노드 선택 정책은 클러스터 리소스를 효율적으로 사용하고 워크로드를 최적의 위치에 배치하는 중요한 역할을 합니다. 기본적인 NodeSelector부터 Affinity, Taints and Tolerations까지 다양한 정책을 활용하여 원하는 방식으로 Pod를 배포할 수 있습니다. 또한, 필요에 따라 사용자 정의 스케줄러를 적용하여 더욱 정교한 배포 전략을 수립할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다