핵심 요약
k8s 1.31(2026-04-29 GA)에서 Sidecar 컨테이너가 정식 GA. 그동안 Istio·Vault·OpenTelemetry 같은 사이드카가 의존했던 우회 트릭이 표준 라이프사이클로 흡수된다.
1. 기존 사이드카 — 무엇이 문제였나
기존엔 사이드카가 단순히 또 다른 컨테이너. 라이프사이클이 메인 컨테이너와 분리돼 있어 다음 문제가 발생했다.
- Job 종료 안 됨: 메인 컨테이너 끝나도 Istio sidecar가 살아있어 Pod이 Completed로 안 감
- 시작 순서: Istio가 뜨기 전에 메인이 외부 호출 → 연결 실패
- 그레이스풀 셧다운: 메인이 종료된 뒤 sidecar가 마지막 로그를 못 보냄
2. 1.31의 새 모델
apiVersion: v1
kind: Pod
spec:
initContainers:
- name: otel-collector
image: otel/opentelemetry-collector-contrib
restartPolicy: Always # <-- 핵심: sidecar로 동작
- name: vault-agent
image: hashicorp/vault
restartPolicy: Always
containers:
- name: app
image: my-app:1.0
restartPolicy: Always를 갖는 init 컨테이너 = 사이드카. 다음을 보장한다.
- 메인 컨테이너 시작 전에 사이드카 ready 보장
- 메인이 종료되면 사이드카에 SIGTERM 자동 전파
- Job 컨텍스트에서 메인 종료 후 자동 청소
3. 영향받는 도구 — 마이그레이션 매트릭스
| 도구 | 1.31 대응 |
|---|---|
| Istio | 1.24+ 자동 채택 |
| Linkerd | 2.16+ 자동 |
| Vault Agent Injector | 1.5+ 옵션 (sidecar=true) |
| OpenTelemetry Operator | 0.105+ 자동 |
| Datadog Agent | 3.95+ (sidecar 모드 추가) |
| Fluentbit / Fluentd | helm chart 옵션 |
4. 직접 사이드카 작성 — 패턴
로그 수집 사이드카
spec:
initContainers:
- name: log-shipper
image: fluent/fluent-bit:3.0
restartPolicy: Always
volumeMounts:
- name: app-logs
mountPath: /var/log/app
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: app-logs
mountPath: /var/log/app
volumes:
- name: app-logs
emptyDir: {}
SSH 터널 사이드카 (DB 액세스)
- name: db-tunnel
image: alpine/socat
restartPolicy: Always
command: ["socat", "TCP-LISTEN:5432,fork", "TCP:db.internal:5432"]
5. Job·CronJob — 가장 큰 수혜
apiVersion: batch/v1
kind: Job
spec:
template:
spec:
initContainers:
- name: vault-agent
image: hashicorp/vault
restartPolicy: Always # 사이드카
containers:
- name: migrate
image: my-migrator:1.0
restartPolicy: OnFailure
이전엔 vault-agent가 종료 안 돼서 Job이 Completed가 안 됐다. 1.31부터는 메인 종료 시 vault-agent에 SIGTERM 전파 → Job 정상 종료.
6. 그레이스풀 셧다운 순서
1. Pod 삭제 요청
2. preStop 훅 실행 (메인 컨테이너)
3. 메인 컨테이너 SIGTERM
4. 메인 종료 대기
5. 사이드카에 SIGTERM
6. 모든 컨테이너 종료 후 Pod 제거
7. 마이그레이션 — 운영 환경 단계
- 1.30 클러스터 확인: 모든 노드가 1.30 이상
- 스테이징 1.31 업그레이드: kubeadm·EKS·GKE 절차에 따라
- 1주 모니터링: Pod 종료 패턴, sidecar 재시작 카운트
- 의존 도구 업그레이드: Istio·OTel Operator 등 1.31 호환 버전으로
- 커스텀 사이드카 마이그레이션: 기존
containers의 사이드카를initContainers + restartPolicy: Always로 이동 - Job 회귀 테스트: 사이드카 포함 Job이 정상 Completed되는지
- 프로덕션 롤아웃: 카나리 → 50% → 전체
8. 흔한 마이그레이션 함정
- HPA 설정 영향: 사이드카 리소스도 Pod 합산.
spec.containers[*].resources+ initContainer 합산 확인 - NetworkPolicy: 사이드카 포트도 허용 규칙 필요
- Pod Security Standards:
restartPolicy가 init 컨테이너에 명시되면 baseline 통과 확인 - 오래된 CRI: containerd 1.7 미만은 미지원. 1.7.20+ 필수
9. 가시화 — describe 출력
$ kubectl describe pod my-app-xxxx
...
Init Containers:
otel-collector:
State: Running
Restart: Always # <-- 사이드카 표시
Containers:
app:
State: Running
...
10. 참고
- kubernetes.io/docs/concepts/workloads/pods/sidecar-containers
- KEP-753 (sidecar containers proposal)

댓글 0