본문 바로가기
Infra2026년 5월 6일6분 읽기

Kubernetes 1.31 — Sidecar 컨테이너 GA, 운영 환경 마이그레이션 가이드

YS
김영삼
조회 575
Kubernetes 1.31 — Sidecar 컨테이너 GA, 운영 환경 마이그레이션 가이드

핵심 요약

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 대응
Istio1.24+ 자동 채택
Linkerd2.16+ 자동
Vault Agent Injector1.5+ 옵션 (sidecar=true)
OpenTelemetry Operator0.105+ 자동
Datadog Agent3.95+ (sidecar 모드 추가)
Fluentbit / Fluentdhelm 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. 1.30 클러스터 확인: 모든 노드가 1.30 이상
  2. 스테이징 1.31 업그레이드: kubeadm·EKS·GKE 절차에 따라
  3. 1주 모니터링: Pod 종료 패턴, sidecar 재시작 카운트
  4. 의존 도구 업그레이드: Istio·OTel Operator 등 1.31 호환 버전으로
  5. 커스텀 사이드카 마이그레이션: 기존 containers의 사이드카를 initContainers + restartPolicy: Always로 이동
  6. Job 회귀 테스트: 사이드카 포함 Job이 정상 Completed되는지
  7. 프로덕션 롤아웃: 카나리 → 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

아직 댓글이 없습니다.
Ctrl+Enter로 등록