← 학습 카테고리

Learn

Kubernetes

24개 모듈 · 현재 12번째

Kubernetes 모듈 12/24 k8s-learn-12

Native Sidecar Containers — initContainers에 restartPolicy: Always를 붙인다

Kubernetes StatefulSet PVC Retention Policy 및 Native Sidecar Containers 공식 문서 종합 (웹 리서치, 2026) — Kubernetes 공식 문서·블로그(StatefulSet PVC Auto-Deletion), KEP-753(Sidecar Containers) KEP-753: Sidecar Containers

이 모듈을 다 읽으면

  • 레거시 사이드카 패턴이 Job 완료 판정에서 왜 문제가 됐는지 설명할 수 있다
  • initContainers의 restartPolicy: Always가 시작 순서·완료 대기 방식·재시작을 각각 어떻게 바꾸는지 설명할 수 있다

k8s-learn-01에서 다룬 kubelet의 Pod 관리를 전제로, 로그 수집기 같은 부가 컨테이너(사이드카)를 붙였을 때 생기던 '메인 컨테이너가 끝나도 사이드카 때문에 Job이 안 끝나는' 문제와, 이를 해결한 Native Sidecar Containers의 동작을 정리한다.

레거시 사이드카의 문제 — Job이 끝나야 하는데 안 끝난다

기존 방식으로 사이드카(예: 로그 수집기)를 일반 컨테이너로 Pod에 같이 넣으면, Job 컨트롤러는 Pod 안의 '모든' 컨테이너가 끝나야 그 Pod를 Completed로 본다. 문제는 메인(애플리케이션) 컨테이너는 작업을 마치고 끝났는데, 로그 수집기 사이드카는 계속 살아있어서 Pod가 영원히 Running 상태로 남고 Job도 완료 처리되지 않는다는 것이다 — 사이드카를 명시적으로 언제 끝낼지 코드로 조율해야 하는 번거로움이 있었다.

핵심 포인트

  • 레거시 방식(사이드카=일반 컨테이너): Job은 Pod 안 '모든' 컨테이너가 끝나야 완료로 간주
  • 메인 컨테이너가 끝나도 사이드카(로그 수집기 등)가 계속 살아있으면 Pod가 계속 Running으로 남아 Job이 완료되지 않는 문제

해법 — initContainers에 restartPolicy: Always를 붙이면 사이드카가 된다

KEP-753은 initContainers 목록의 항목에 restartPolicy: Always 필드 하나만 추가하면 그 컨테이너가 사이드카로 취급되게 만들었다. kubelet은 이런 사이드카를 다른 init 컨테이너들과 같은 순서로 시작하지만, 일반 init 컨테이너처럼 '완료(종료)'될 때까지 기다리는 게 아니라 '시작 완료'(startup probe가 성공하는 시점, 또는 없으면 postStart 핸들러 완료)까지만 기다린 뒤 다음 단계로 넘어간다. 그리고 개별 init 컨테이너의 restartPolicy는 Pod 전체의 restartPolicy(예: Never나 OnFailure)를 오버라이드한다 — Pod 레벨이 Never여도 이 사이드카는 계속 재시작된다.

핵심 포인트

  • initContainers 항목에 restartPolicy: Always 필드만 추가하면 그 컨테이너가 사이드카로 인식됨
  • kubelet은 다른 init 컨테이너와 같은 순서로 시작하되, '완료'가 아니라 '시작 완료'(startup probe 성공 등)까지만 기다림 — 개별 restartPolicy가 Pod 전체 restartPolicy(Never 등)를 오버라이드해 계속 재시작됨

이게 Job 완료 문제를 해결하는 이유, 그리고 덤으로 얻는 것

이렇게 사이드카가 initContainers로 분리되면, Job 컨트롤러의 완료 판정 대상은 더 이상 '모든 컨테이너'가 아니라 '앱 컨테이너'로 좁혀진다 — 앱(메인) 컨테이너들이 다 끝나면 사이드카가 아직 실행 중이어도 Job이 완료된 것으로 처리된다. 이는 앞서 다룬 레거시 문제를 근본적으로 해결한다. 덤으로, kubelet은 메모리 압박 상황에서 사이드카의 OOM 스코어를 조정해 앱 컨테이너보다 먼저 죽지 않도록 보호하기도 한다.

핵심 포인트

  • 사이드카가 initContainers로 분리되면 Job 완료 판정은 '앱 컨테이너'만 기준 — 사이드카가 계속 실행 중이어도 Job이 정상 완료됨(레거시 문제 해결)
  • 덤으로 kubelet이 메모리 압박 시 사이드카의 OOM 스코어를 조정해 앱 컨테이너보다 먼저 죽지 않도록 보호