개발 트러블슈팅 완전 정복 | 웹개발·백엔드·데브옵스 실무 에러 해결법. Docker, GitHub Actions, TypeScript, MySQL, Redis 등 실전 경험 기반의 개발 블로그
목요일
Kubernetes CrashLoopBackOff 완벽 해결 가이드
증상: kubectl get pods에서 STATUS가 CrashLoopBackOff로 표시되며, 컨테이너가 시작과 종료를 반복합니다.
원인:
1. 애플리케이션 코드 버그 또는 크래시
2. 환경 변수 누락
3. 필요한 파일 또는 리소스 미존재
4. 헬스체크 실패
5. 메모리/CPU 부족
6. 이미지 문제
해결 방법:
1. 로그 확인: kubectl logs 파드이름 --previous
2. 파드 상세 정보 확인: kubectl describe pod 파드이름
3. 환경 변수 검증: deployment spec에서 환경 변수 설정 확인
4. 헬스체크 설정 검토: initialDelaySeconds를 충분히 설정 (예: 30초)
5. 리소스 요청/제한 확인: requests와 limits 설정 검토, OOMKilled 확인
6. 이미지 및 진입점 확인: Dockerfile의 CMD가 정확한지 확인
7. 볼륨 마운트 확인: 필요한 경로가 정확히 마운트되었는지 확인
디버그 팁: kubectl debug 파드이름 -it --image=busybox로 컨테이너 환경 직접 확인
정리: CrashLoopBackOff는 로그와 describe 명령으로 원인 파악이 가능하며, 대부분 설정 문제입니다.
화요일
k8s OOMKilled 에러 진단 및 해결 완벽 가이드
<div style="font-family:'Noto Sans KR',sans-serif;line-height:1.8;max-width:860px;margin:0 auto">
<p style="color:#666;font-size:14px">🔍 검색 키워드: k8s OOMKilled, Kubernetes 메모리 부족, 파드 종료, 메모리 리소스 설정, 컨테이너 메모리 누수</p>
<h2>k8s OOMKilled 에러 진단 및 해결</h2>
<p>Kubernetes에서 파드가 갑자기 종료되고 재시작되는 문제는 보통 메모리 부족 때문입니다.</p>
<h3>1. 증상: 파드가 자꾸 크래시된다</h3>
<pre style="background:#1e1e1e;color:#d4d4d4;padding:16px;border-radius:6px;overflow-x:auto"><code>$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-app-abc123 0/1 CrashLoopBackOff 5 2m
Last State: Terminated (reason:OOMKilled, exit code:137)</code></pre>
<p>exit code 137은 Linux에서 SIGKILL(9) 신호를 받았다는 뜻입니다.</p>
<h3>2. 원인</h3>
<ul>
<li>메모리 limit이 너무 낮게 설정됨</li>
<li>애플리케이션의 메모리 누수</li>
<li>노드의 물리 메모리 부족</li>
</ul>
<h3>3. 해결 방법</h3>
<h4>방법 1: 메모리 limit 증가</h4>
<pre style="background:#1e1e1e;color:#d4d4d4;padding:16px;border-radius:6px;overflow-x:auto"><code>resources:
limits:
memory: 512Mi
requests:
memory: 256Mi</code></pre>
<h4>방법 2: HPA로 자동 확장</h4>
<pre style="background:#1e1e1e;color:#d4d4d4;padding:16px;border-radius:6px;overflow-x:auto"><code>apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70</code></pre>
<h3>정리표</h3>
<table border="1" cellpadding="10" cellspacing="0" style="width:100%;border-collapse:collapse">
<tr style="background:#f5f5f5"><th style="text-align:left">확인 항목</th><th style="text-align:left">명령어</th><th style="text-align:left">의미</th></tr>
<tr><td>파드 상태</td><td>kubectl describe pod</td><td>OOMKilled 여부</td></tr>
<tr><td>실제 메모리 사용</td><td>kubectl top pod</td><td>현재 사용량</td></tr>
<tr><td>노드 여유</td><td>kubectl top node</td><td>전체 노드 메모리 상태</td></tr>
</table>
<hr>
<p><strong>팁</strong>: requests는 평상시 사용량의 70~80%, limits는 requests의 1.5~2배로 설정하는 것이 best practice입니다.</p>
</div>