실전 운영 중 발생 가능한 핵심 질문들
- preferred nodeAffinity 조건이 만족되지 않으면 어떻게 되는가?
- podAntiAffinity 조건의 기준 라벨이 없으면 스케줄링은 실패하는가?
- Pod이 Completed 또는 Terminating 상태일 때 anti-affinity에 영향 주는가?
- 병렬 실행이 금지된 CronJob에서도 anti-affinity가 의미가 있을까?
group=batch-alpha
노드가 하나뿐인 경우에도 분산이 가능한가?
핵심 개념 요약
개념 | 요약 |
---|---|
preferredDuringSchedulingIgnoredDuringExecution | soft 조건이므로 만족하지 않으면 무시하고 실행 |
podAntiAffinity 기준 라벨 | Pod 템플릿 내 template.metadata.labels 기준 |
Completed, Terminating 상태 | anti-affinity 대상에 포함됨 (Pod 리소스 살아 있으면 영향 줌) |
TTLSecondsAfterFinished | Pod을 자동 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 Controller | Pod 상태 | 스케줄러 판단 |
---|---|---|---|
T0 | Job #1 생성 | Pod #1: Running | |
T1 | Job #1 완료 | Pod #1: Completed | |
T2 | Job #2 생성됨 | Pod #1: Terminating | Pod #2 스케줄링 시작 |
T3 | Pod #1 존재 인식 → -30점 | ||
T4 | 다른 노드 있으면 회피 | ||
T5 | 없으면 그대로 실행 |