Pod 가 CrashLoopBackOff 에 들어가면 Kubernetes 는 컨테이너가 계속 실패하고 재시작된다고 알려 주는 것입니다. 흔한 증상이지만 root cause 는 startup failure, probe 설정, config 누락, dependency timing, 혹은 애플리케이션 실패처럼 보이는 resource pressure 일 수 있습니다.
짧게 말하면 핵심은 이것입니다. deployment 설정을 만지기 전에 컨테이너가 왜 종료되는지 먼저 찾아야 합니다. CrashLoopBackOff 는 restart symptom 이지 root cause 가 아닙니다.
event, log, probe 동작부터 본다
crash loop 를 좁히는 가장 빠른 자료는 보통 아래입니다.
- pod event
- 현재 / 이전 container log
- startup command 와 env
- probe 설정
이 신호들이 restart count 하나보다 훨씬 많은 걸 설명해 줍니다.
CrashLoopBackOff 는 보통 무엇을 뜻하나
실전에선 보통 이런 경우가 많습니다.
- 앱이 startup 중 바로 종료된다
- probe 가 너무 공격적이라 Kubernetes 가 죽인다
- boot 시점 dependency 가 준비되지 않았다
- resource limit 때문에 exit 또는 kill 된다
- config 또는 secret 가정이 틀렸다
그래서 이 incident 는 “앱이 스스로 죽는가” 와 “앱이 외부에서 죽임당하는가” 로 나눠 봐야 합니다.
흔한 원인
1. 앱이 startup 중 실패한다
config 오류, secret 누락, migration 문제, 잘못된 startup command 때문에 readiness 이전에 프로세스가 죽을 수 있습니다.
2. liveness 또는 startup probe 가 너무 공격적이다
앱은 건강하지만 시작이 느린데, Kubernetes 가 안정화 전에 계속 죽일 수 있습니다.
probe 또는 startup 동작을 바꾼 뒤 자주 보이는 패턴입니다.
3. dependency timing 이 어긋난다
DB, queue, upstream service 가 준비되기 전에 pod 가 그걸 당연히 기대하고 부팅하다 실패할 수 있습니다.
restart timing 과 dependency readiness 를 비교해 보면 이 경우가 드러나곤 합니다.
4. resource limit 이 비현실적이다
OOM kill 이나 CPU starvation 도 restart count 만 보면 앱 버그처럼 보일 수 있습니다.
5. mounted config 와 environment 가 기대와 다르다
image 는 맞아도 runtime input 이 틀릴 수 있습니다.
- config map 값
- secret key
- file mount path
- command / argument 변경
실전 점검 순서
1. kubectl describe pod event 를 본다
Kubernetes 가 아래 중 무엇을 보고 있는지 먼저 알 수 있습니다.
- probe failure
- OOM kill signal
- 반복 restart timing
- image 또는 startup 문제
2. 현재 / 이전 container log 를 본다
특히 previous log 가 중요할 때가 많습니다. 실패한 프로세스는 너무 빨리 죽어서 현재 실행 로그만으론 맥락이 부족할 수 있기 때문입니다.
3. probe, command, env, mounted config 를 점검한다
runtime input 이 image 기대와 맞는지 가정하지 말고 직접 확인해야 합니다.
많은 crash loop 가 결국 configuration drift 였던 경우가 많습니다.
4. restart timing 과 dependency / resource limit 을 비교한다
질문은 이렇습니다.
- pod 가 즉시 죽는가
- probe 시작 후에만 죽는가
- memory pressure 때만 죽는가
- dependency 가 없을 때만 죽는가
5. 진짜 crash 인지, startup 이 느린 것뿐인지 구분한다
이 구분이 앱 수정, probe 수정, 플랫폼 설정 수정 중 어느 길로 갈지 결정합니다.
빠른 명령
kubectl describe pod <pod> -n <ns>
kubectl logs <pod> -n <ns> --previous
kubectl get pod <pod> -n <ns> -o yaml
이 세 가지 조합이면 app startup 문제인지, probe 문제인지, config 문제인지, 이전 container run 문제인지 보통 빠르게 갈립니다.
restart reason, 마지막 fatal log, probe 또는 config mismatch event 를 같이 보세요.
failure mode 를 찾은 뒤 무엇을 바꾸면 좋나
앱 자체가 crash 한다면
config, command, startup logic, dependency assumption 을 먼저 고쳐야 합니다.
probe 가 너무 공격적이라면
건강하지만 느린 컨테이너를 죽이지 않도록 startup 또는 liveness 동작을 조정해야 합니다.
dependency 가 늦다면
startup 을 더 관대하게 만들거나, dependency 가 실제로 준비된 뒤에만 강하게 기대하도록 바꿔야 합니다.
limit 이 비현실적이라면
restart symptom 이 아니라 실제 usage 에 맞춰 resource 를 다시 잡아야 합니다.
runtime input 이 drift 했다면
config map, secret, command, image expectation 을 다시 맞춰야 합니다.
장애 중에 던져볼 질문
이 질문이 꽤 유용합니다.
컨테이너가 스스로 죽는 건가, 아니면 적절한 timing 이나 resource 만 있었다면 회복했을 컨테이너를 Kubernetes 가 죽이고 있는 건가?
이 질문이 application bug 와 platform behavior 를 빨리 갈라 줍니다.
FAQ
Q. CrashLoopBackOff 자체가 에러인가
아닙니다. 반복 restart 상태를 가리키는 상태값입니다.
Q. 가장 빠른 첫 단계는 무엇인가
describe event 와 previous container log 를 같이 보는 것입니다.
Q. restart delay 나 probe threshold 를 먼저 늘려야 하나
컨테이너가 진짜로 crash 하는지, 아니면 startup window 를 공정하게 못 받는지만 먼저 구분하는 게 좋습니다.
Q. OOM 이 crash loop 안에 숨어 있을 수도 있나
그렇습니다. 일부 crash loop 는 사실 memory incident 가 generic restart symptom 으로 보이는 경우입니다.
Read Next
- pod 가 아예 스케줄되지 않는다면 Kubernetes Pod Pending 과 비교해 보세요.
- 같은 이슈가 memory pressure 중심이라면 Kubernetes OOMKilled 를 이어서 보세요.
- pod 는 살아 있지만 ready 가 되지 않는다면 Kubernetes Readiness Probe Failed 와 비교해 보세요.
- 전체 인프라 글 흐름은 Infra 카테고리 에서 이어 볼 수 있습니다.
Related Posts
Sources:
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.