오후 2시 10분, 결제 API(payment-api)의 Helm 값 파일을 고친 PR이 운영에 배포됐습니다. PR 제목은 "DB 접속 설정을 HOST/PORT로 분리"이고 이미지 태그는 그대로 v2.14.3입니다. 이 차트는 ConfigMap이 바뀌면 파드를 새로 띄웁니다. 5분 뒤 "payment-api 파드 재시작 반복" 알림이 오고 결제 5xx가 조금씩 늘어납니다. 새로 뜬 파드는 모두 죽고, 변경 전부터 떠 있던 파드 2개만 트래픽을 받고 있습니다. 동료는 CrashLoopBackOff를 보고 "이미지가 깨졌으니 이전 이미지로 롤백하자"고 합니다.
ConfigMap 변경 직후 CrashLoopBackOff: 이미지는 그대로인데 파드가 계속 재시작
오후 2시 10분, 결제 API(payment-api)의 Helm 값 파일을 고친 PR이 운영에 배포됐습니다.
시나리오
단서
NAME READY STATUS RESTARTS AGE payment-api-7c9d8f6b5-2xkqp 0/1 CrashLoopBackOff 5 (40s ago) 6m payment-api-7c9d8f6b5-9lmzt 0/1 CrashLoopBackOff 5 (35s ago) 6m payment-api-5b7f9c8d4-h4vwn 1/1 Running 0 2d payment-api-5b7f9c8d4-q8rtc 1/1 Running 0 2d
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Sun, 27 Sep 2026 14:16:02 +0900
Finished: Sun, 27 Sep 2026 14:16:03 +0900
Restart Count: 5
Events:
Normal Pulled 3m (x6 over 6m) kubelet Container image "registry.example.com/payment-api:v2.14.3" already present on machine
Warning BackOff 20s (x24 over 6m) kubelet Back-off restarting failed container payment-api2026-09-27T05:16:02Z INFO payment-api v2.14.3 starting 2026-09-27T05:16:03Z FATAL missing required environment variable PAYMENT_DB_URL
config: - PAYMENT_DB_URL: "postgres://payment@db-primary:5432/payment" + PAYMENT_DB_HOST: "db-primary" + PAYMENT_DB_PORT: "5432" image: tag: v2.14.3 # PR 설명: HOST/PORT 방식은 payment-api v2.15.0부터 지원
과제 원인을 한 문장으로 좁히고, 서비스를 되살리는 순서(검증 포함)와 재발 방지책을 적어 보세요.
구독하면 이어서 볼 수 있어요
이 문제의 전체 시나리오와 점검 체크리스트, 복구 순서, 모범 풀이는 Pro 구독에서 열립니다.
먼저 볼 것
- 재시작이 반복될 때 이번 배포에서 '무엇이 바뀌었나'부터 좁히기
- 이미 죽은 컨테이너가 남긴 로그 읽기
- 되돌리기 명령이 실제로 무엇을 되돌리는지 구분하기
점검 체크리스트
- kubectl describe pod <pod> — Last State의 Exit Code·Reason, 시작과 종료 사이 시간
- kubectl logs <pod> --previous — 죽기 직전 컨테이너의 로그
- helm history payment-api 와 변경 PR — 이번에 바뀐 것이 이미지인지 설정인지
- kubectl get rs -l app=payment-api — 이전 ReplicaSet 파드가 몇 개 살아 있는지(영향 범위)
복구와 재발 방지
같이 보면 좋은 질문
현장에서 본 비슷한 케이스
0/10