🎯 쿠버네티스 스케줄링 원리: Pod는 어떻게 배치될까?

쿠버네티스는 여러 컴퓨터(Node)로 구성된 큰 시스템이에요.
그럼 이런 질문이 생기겠죠?

“새로운 애플리케이션(Pod)은 어떤 컴퓨터에 설치되지?”

바로 이걸 결정해주는 게 스케줄링(Scheduling) 입니다!


📦 스케줄링이란?

Pod가 만들어지면, 그것을 어느 컴퓨터(Node)에 실행시킬지 결정하는 과정이에요.
이 역할을 하는 것이 바로 쿠버네티스 스케줄러(kube-scheduler)입니다.

스케줄러는 다음 3단계를 거쳐 Pod의 배치를 결정합니다:

[1단계] 필터링: 가능한 Node 고르기  
[2단계] 점수 매기기: 어떤 Node가 더 좋은지 판단  
[3단계] 선택하기: 가장 좋은 Node에 배치

🧮 1단계: 필터링 (Filtering)

먼저 “이 Pod를 실행할 수 있는 컴퓨터가 누구야?”라고 물어요.

✅ 필터링 조건 예시:

  • 컴퓨터가 꺼져 있지 않고(Ready 상태)
  • CPU나 메모리가 충분하고
  • Pod가 원하는 조건을 만족하는지

🏅 2단계: 점수 매기기 (Scoring)

“어떤 Node가 가장 적합한가?”를 판단하는 단계입니다.

기준 설명
사용량 적은 Node 여유가 많은 Node 우선
자원이 고르게 사용된 Node CPU/메모리 균형 잡힌 Node 선호
이미지가 이미 있는 Node 이미지 다운로드 시간 절약

점수가 가장 높은 Node가 최종 선택됩니다.


🖐 3단계: 배치 (Binding)

점수가 제일 높은 Node에 Pod가 실제로 배치(Binding) 됩니다.


🚫 Taint & Toleration

특정 Node는 “특수 용도”로만 사용하고 싶을 수 있어요.
예: GPU 전용, 관리자 전용 서버 등

  • Taint (Node 입장): “특정 Pod 아니면 나한테 오지 마!”
  • Toleration (Pod 입장): “저는 괜찮아요, 조건 만족해요!”

서로 조건이 맞아야만 배치가 됩니다.


🧲 Affinity (친화성 설정)

Pod는 어떤 Node에 배치되길 원하는지를 설정할 수 있어요.

🔹 Node Affinity

Node 라벨 기준으로 “이런 Node에 배치해주세요!”

🔹 Pod Affinity

“같은 종류의 다른 Pod 근처에서 실행하고 싶어요.”

🔹 Pod Anti-Affinity

“같은 종류의 Pod와는 떨어져서 실행하고 싶어요.”

친화성 설정을 통해 Pod 배치를 더 스마트하게 제어할 수 있어요.


🧪 실습 예시

🏷️ 1. 특정 Node에 라벨 붙이기

kubectl label nodes node1 disktype=ssd

📦 2. 해당 라벨이 있는 Node에만 배치되는 Pod 만들기

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
              - ssd

📐 Topology Spread (분산 배치)

“같은 종류의 Pod가 한 곳에 몰리면 장애 발생 시 위험해요.”
⇒ 그래서 Pod들을 골고루 분산시키는 기능이 필요합니다.

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: ScheduleAnyway

이렇게 하면 여러 서버에 Pod가 퍼져서 장애에 더 강해져요! 👍


🧠 마무리 요약

개념 설명
스케줄링 Pod를 Node에 배치하는 과정
필터링 실행 가능한 Node를 골라내기
점수화 어떤 Node가 더 좋은지 판단
Taint & Toleration 금지/허용 조건으로 노드 제어
Affinity 배치 희망 조건 설정
Spread 고르게 분산 배치

쿠버네티스는 단순한 배치가 아닌, 똑똑하게 Pod를 배치합니다.
이해하면 클러스터 운영이 훨씬 안정적이고 효율적으로 바뀔 수 있어요!

📎 참고자료

  • https://kubernetes.io/docs/concepts/scheduling-eviction/
  • 한국폴리텍대학 서울강서캠퍼스 빅데이터소프트웨어공학과 이협건 교수 강의자료