← 문제 라이브러리
K8s 입문 K8S 001 · 18분

ConfigMap 변경 직후 CrashLoopBackOff: 이미지는 그대로인데 파드가 계속 재시작

오후 2시 10분, 결제 API(payment-api)의 Helm 값 파일을 고친 PR이 운영에 배포됐습니다.

검수된 문제무료
시나리오

오후 2시 10분, 결제 API(payment-api)의 Helm 값 파일을 고친 PR이 운영에 배포됐습니다. PR 제목은 "DB 접속 설정을 HOST/PORT로 분리"이고 이미지 태그는 그대로 v2.14.3입니다. 이 차트는 ConfigMap이 바뀌면 파드를 새로 띄웁니다. 5분 뒤 "payment-api 파드 재시작 반복" 알림이 오고 결제 5xx가 조금씩 늘어납니다. 새로 뜬 파드는 모두 죽고, 변경 전부터 떠 있던 파드 2개만 트래픽을 받고 있습니다. 동료는 CrashLoopBackOff를 보고 "이미지가 깨졌으니 이전 이미지로 롤백하자"고 합니다.

단서
kubectl get pods -l app=payment-api
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
kubectl describe pod payment-api-7c9d8f6b5-2xkqp (일부)
    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-api
kubectl logs payment-api-7c9d8f6b5-2xkqp --previous
2026-09-27T05:16:02Z INFO  payment-api v2.14.3 starting
2026-09-27T05:16:03Z FATAL missing required environment variable PAYMENT_DB_URL
이번 PR의 변경 (charts/payment-api/values-prod.yaml)
 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부터 지원

과제 원인을 한 문장으로 좁히고, 서비스를 되살리는 순서(검증 포함)와 재발 방지책을 적어 보세요.

먼저 볼 것
  • 재시작이 반복될 때 이번 배포에서 '무엇이 바뀌었나'부터 좁히기
  • 이미 죽은 컨테이너가 남긴 로그 읽기
  • 되돌리기 명령이 실제로 무엇을 되돌리는지 구분하기
점검 체크리스트
  1. kubectl describe pod <pod> — Last State의 Exit Code·Reason, 시작과 종료 사이 시간
  2. kubectl logs <pod> --previous — 죽기 직전 컨테이너의 로그
  3. helm history payment-api 와 변경 PR — 이번에 바뀐 것이 이미지인지 설정인지
  4. kubectl get rs -l app=payment-api — 이전 ReplicaSet 파드가 몇 개 살아 있는지(영향 범위)