귀찮게하기/DevOps-SRE

Kubernetes Pod 스케줄링 정복

게임이 더 좋아 2025. 5. 28. 01:29
반응형
728x170

주요 옵션

  • Node Selector: 특정 레이블 노드에 배치
  • Node Name: 특정 노드에 강제 배치
  • Taints & Tolerations: 노드 접근 제어
  • Node Affinity & Pod Affinity/Anti-Affinity: 조건 및 Pod 관계 기반 배치
  • Topology Spread Constraints: 균등한 Pod 분산

1. Node Selector

Node Selector는 Pod를 특정 레이블이 있는 노드에 배치하는 가장 간단한 방법

spec:
  nodeSelector:
    disktype: ssd
    gpu-vendor: nvidia

주요 활용 사례:

  • SSD 디스크 노드에 데이터베이스 배치
  • GPU 노드에 ML 워크로드 배치
  • 특정 CPU 아키텍처노드 선택

특징: 레이블 key-value가 정확히 일치하는 노드에만 배치(AND 조건).

복잡한 조건 불가 → Node Affinity로 대체 가능


2. Node Name

Node Name은 Pod를 특정 노드 이름에 강제로 배치

spec:
  nodeName: kube-node-01

주요 활용 사례:

  • 시스템 에이전트 배치
  • 디버깅/테스트용 특정 노드 지정
  • 특정 노드의 로컬 볼륨 사용

특징: 스케줄러를 무시하고 지정된 노드에 직접 배치

노드가 다운되면 Pod는 Pending 상태로 남아있어 일반 애플리케이션에는 비추천


3. Taints & Tolerations

Taints는 노드가 특정 Pod를 거부하도록 설정하고, Tolerations는 Pod가 이를 허용

Taint 설정 (Node):

kubectl taint nodes node-01 special-workload=true:NoSchedule

Toleration 설정 (Pod):

spec:
  tolerations:
  - key: "special-workload"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

Taint 효과:

  • NoSchedule: 새로운 Pod 배치 금지
  • PreferNoSchedule: 배치 피하려고 노력
  • NoExecute: 배치 금지 + 기존 Pod 퇴출

주요 활용 사례:

  • GPU 노드에 일반 Pod 배치 방지
  • 특정 팀 전용 노드 격리
  • 장애 노드에서 Pod 자동 이동

4. Node Affinity

Node Affinity는 복잡한 조건으로 노드를 선택

required(강제)와 preferred(선호) 두 가지 유형

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - antarctica-east1
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 60
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd

지원 연산자: In, NotIn, Exists, DoesNotExist, Gt, Lt

주요 활용 사례:

  • 특정 가용 영역(AZ)에 Pod 배치
  • 고성능 CPU/메모리 노드 선호
  • 특정 인스턴스 타입 제외

특징: Node Selector보다 유연하며, 복잡한 조건과 가중치 지원.


5. Pod Affinity & Anti-Affinity: Pod 간 관계 제어

Pod Affinity는 특정 Pod와 같은 위치에, Anti-Affinity는 다른 위치에 배치

topologyKey로 범위를 지정

spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: cache-service
        topologyKey: "kubernetes.io/hostname"
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchLabels:
              app: my-critical-app
          topologyKey: "kubernetes.io/hostname"

실제 시나리오 예제: 웹 서버와 Redis를 같은 AZ에 배치

spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: redis
        topologyKey: "topology.kubernetes.io/zone"

주요 활용 사례:

  • Affinity: 웹 서버와 캐시를 같은 노드/AZ에 배치하여 네트워크 지연 최소화
  • Anti-Affinity: 애플리케이션 복제본을 다른 노드/AZ에 분산해 고가용성 확보
  • 마이크로서비스 간 통신 최적화

6. Topology Spread Constraints

Topology Spread Constraints는 Pod를 노드, AZ, 리전 등에 고르게 분산

spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: "topology.kubernetes.io/zone"
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: my-app

주요 필드:

  • maxSkew: 특정 토폴로지 도메인 간 Pod 수의 최대 허용 차이
    • maxSkew: 1은 가장 균등한 분산
  • topologyKey: 분산의 기준이 되는 노드 레이블 키
  • whenUnsatisfiable: 제약 조건을 만족시킬 수 없을 때 스케줄러의 동작을 결정
    • DoNotSchedule (기본값): Pod를 스케줄링 안함
    • ScheduleAnyway: Pod를 스케줄링하되, maxSkew를 최소화하는 방향으로 노력
  • labelSelector: 어떤 Pod 그룹에 대해 분산 제약을 적용할지 정의합니다. 이 레이블과 일치하는 Pod들이 분산 대상

주요 활용 사례:

  • AZ 간 Pod 균등 분산으로 장애 영향 최소화
  • 노드별 워크로드 과부하 방지
  • 트래픽 부하 분산

특징: Anti-Affinity보다 세밀한 분산 제어 가능.

 


결론

Kubernetes Pod 스케줄링은 클러스터의 가용성, 성능, 비용 효율성을 최적화하는 핵심 도구

간단한 배치에는 Node Selector와 Node Name을

노드 격리에는 Taints & Tolerations를

복잡한 조건과 관계 제어에는 Node/Pod Affinity를

고른 분산에는 Topology Spread Constraints를 활용

 

참고 자료:

728x90
반응형
그리드형

'귀찮게하기 > DevOps-SRE' 카테고리의 다른 글

클러스터 외부에서 Istio Service Mesh 파드 접근 흐름  (0) 2025.05.16
Pod와 ServiceAccount의 관계  (0) 2025.05.14
Redis에 대한 오해  (0) 2025.04.23
DevOps - istio(2)  (1) 2025.04.12
[Kubernetes] RBAC  (0) 2025.04.05