Kubernetes CronJob에서 soft affinity와 podAntiAffinity의 실제 작동 방식과 노드 분산 전략 이해하기

✅ 실전 운영 중 발생 가능한 핵심 질문들

  • preferred nodeAffinity 조건이 만족되지 않으면 어떻게 되는가?
  • podAntiAffinity 조건의 기준 라벨이 없으면 스케줄링은 실패하는가?
  • Pod이 Completed 또는 Terminating 상태일 때 anti-affinity에 영향 주는가?
  • 병렬 실행이 금지된 CronJob에서도 anti-affinity가 의미가 있을까?
  • group=batch-alpha 노드가 하나뿐인 경우에도 분산이 가능한가?

✅ 핵심 개념 요약

개념요약
preferredDuringSchedulingIgnoredDuringExecutionsoft 조건이므로 만족하지 않으면 무시하고 실행
podAntiAffinity 기준 라벨Pod 템플릿 내 template.metadata.labels 기준
Completed, Terminating 상태anti-affinity 대상에 포함됨 (Pod 리소스 살아 있으면 영향 줌)
TTLSecondsAfterFinishedPod을 자동 GC 처리해 anti-affinity 영향 최소화
동일 app 라벨로 여러 CronJob 구성Pod 템플릿에서 동일 app 라벨로 설정해야 anti-affinity가 서로 작동함
CronJob 이름 구분 vs Pod 라벨 통일CronJob 이름은 유일하게, Pod 라벨은 공통값 유지 (app=batch-shared-cronjob 등)

✅ 스케줄러 점수 계산 흐름 예시

  • affinity: group=batch-alpha → +100점
  • podAntiAffinity: 동일 app Pod 있음 → -30점
  • 점수 동률 시 → Kubernetes 내부 우선순위에 따라 배정 (랜덤처럼 보일 수 있음)

✅ 시각화 도표 제공

  • 시간 순서대로 Job 완료, Pod Terminating, 다음 Job 생성, anti-affinity 평가 과정 정리
  • anti-affinity에 영향 주는 타이밍 이해에 유용

시간축 → → → →

┌──────────────┐
│ 1. Job #1 생성됨 │
└──────────────┘


┌──────────────────────────┐
│ Job #1 의 Pod 실행 중 (Running) │
└──────────────────────────┘


┌─────────────────────────────┐
│ 2. Job #1 완료됨 (Pod: Completed) │
│ → Job Controller가 “종료됨” 인식 │
└─────────────────────────────┘


┌───────────────────────────────┐
│ 3. Pod #1 는 아직 살아있음 (Terminating) │
└───────────────────────────────┘


┌─────────────────────────────┐
│ 4. Job #2 생성됨 (Forbid 조건 OK) │
└─────────────────────────────┘


┌────────────────────────────────────────────┐
│ 5. Pod #2 스케줄링 시도 │
│ → 스케줄러가 노드 A 에 Pod #1 이 살아있는 걸 감지 │
│ → podAntiAffinity 조건 적용됨 (-30점) │
└────────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│ 6. 다른 노드 있음 → 그쪽으로 회피하여 실행 │
│ 다른 노드 없음 → 점수 무시하고 그대로 실행됨 │
└──────────────────────────────────────────┘

시간Job ControllerPod 상태스케줄러 판단
T0Job #1 생성Pod #1: Running
T1Job #1 완료Pod #1: Completed
T2Job #2 생성됨Pod #1: TerminatingPod #2 스케줄링 시작
T3Pod #1 존재 인식 → -30점
T4다른 노드 있으면 회피
T5없으면 그대로 실행

관련 글

답글 남기기

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