Ephemeral Debug Container로 실행 중인 Pod 디버깅하기
distroless 이미지나 CrashLoopBackOff 상태의 Pod에 임시 디버그 컨테이너를 삽입해 네트워크·프로세스 네임스페이스를 공유하며 진단하는 방법을 설명합니다.
지난 글에서 멀티 컨테이너 파드 패턴을 다뤘습니다. 실제 운영 환경에서는 컨테이너가 distroless 이미지로 빌드되거나 CrashLoopBackOff 상태에 빠져 kubectl exec조차 불가능한 상황이 종종 생깁니다. 이때 **Ephemeral Container(임시 컨테이너)**를 사용하면 실행 중인 Pod에 shell이나 진단 도구를 갖춘 컨테이너를 삽입해 문제를 분석할 수 있습니다. Kubernetes 1.23에서 GA(정식 기능)로 승격됐으며, 현재 대부분의 클러스터에서 기본 활성화돼 있습니다.
Ephemeral Container란
일반 컨테이너와 달리 임시 컨테이너는 Pod spec에 영구적으로 기록되지 않습니다. 삽입 후 프로세스가 종료되면 컨테이너는 사라지고 재시작도 되지 않습니다. 핵심 특징은 다음과 같습니다.
- 공유 네임스페이스:
--target옵션으로 특정 컨테이너의 Network·IPC 네임스페이스를 공유합니다.shareProcessNamespace: true가 설정된 Pod라면 PID 네임스페이스도 공유되어ps명령으로 대상 컨테이너 프로세스를 볼 수 있습니다. - 임시성: exit 시 자동 제거.
resources,livenessProbe,readinessProbe미지원. - distroless 우회: 디버그 이미지에서
tcpdump,curl,strace등을 자유롭게 실행할 수 있습니다.
kubectl debug 기본 사용법
가장 일반적인 패턴은 실행 중인 Pod에 직접 임시 컨테이너를 삽입하는 것입니다.
# distroless Pod에 busybox 삽입, app-container 네임스페이스 공유
kubectl debug -it my-app-pod \
--image=busybox \
--target=app-container
# 네트워크 진단 도구가 풍부한 이미지 사용
kubectl debug -it my-app-pod \
--image=nicolaka/netshoot \
--target=app-container
세션에 진입하면 같은 네트워크 네임스페이스를 공유하므로 curl localhost:8080처럼 대상 컨테이너의 포트를 직접 테스트할 수 있습니다.
/proc를 통한 파일시스템 접근
PID 네임스페이스를 공유하는 경우, 대상 컨테이너의 파일시스템에 /proc/{PID}/root 경로로 접근할 수 있습니다.
# 대상 컨테이너의 PID 1 환경변수 확인
cat /proc/1/environ | tr '\0' '\n'
# 대상 컨테이너 루트 파일시스템 탐색
ls /proc/1/root/app/
Pod 복사본으로 디버그
원본 Pod를 건드리지 않고 복사본을 만들어 디버깅할 수 있습니다. 특히 이미지 자체를 교체해 실행해야 할 때 유용합니다.
# Pod 복사본 생성, 모든 컨테이너 이미지를 ubuntu로 교체
kubectl debug my-app-pod \
--copy-to=debug-pod \
--set-image=*=ubuntu \
-it -- bash
# 특정 컨테이너만 이미지 교체
kubectl debug my-app-pod \
--copy-to=debug-pod \
--set-image=app=ubuntu \
-it -- bash
복사본 Pod가 남아 있으면 나중에 직접 삭제해야 합니다.
kubectl delete pod debug-pod
노드 디버그
Node 수준의 문제를 진단할 때는 node 서브커맨드를 사용합니다. 자동으로 hostNetwork, hostPID가 활성화되고 노드 파일시스템이 /host에 마운트됩니다.
kubectl debug node/worker-node-1 \
-it --image=ubuntu
# 노드 진입 후 chroot로 노드 파일시스템 탐색
chroot /host bash
실전 진단 흐름 예시
# 1. CrashLoopBackOff 확인
kubectl get pod my-app -o wide
# 2. 임시 컨테이너 삽입 (--target 으로 충돌 컨테이너 지정)
kubectl debug -it my-app \
--image=nicolaka/netshoot \
--target=app
# 3. 네임스페이스 공유 확인 후 진단
# 컨테이너 내부에서:
ps aux # PID 공유 시 대상 프로세스 보임
ss -tlnp # 포트 리스닝 확인
curl -v localhost:8080 # 헬스 엔드포인트 확인
tcpdump -i eth0 -n port 8080 # 패킷 덤프
# 4. 세션 종료 → 임시 컨테이너 자동 제거
exit
주의사항
Ephemeral Container는 PodSecurityAdmission 정책의 영향을 받습니다. restricted 정책이 적용된 네임스페이스에서는 privileged 이미지 삽입이 거부될 수 있습니다. 또한 Completed 또는 Succeeded 상태의 Pod에는 임시 컨테이너를 추가할 수 없으며, kubectl exec와 달리 이미 종료된 컨테이너에도 접근이 불가합니다.
# ephemeralContainers 직접 YAML 작성 예시 (참고용)
# kubectl debug 가 자동으로 처리하므로 보통 직접 작성 불필요
spec:
ephemeralContainers:
- name: debugger
image: busybox
stdin: true
tty: true
targetContainerName: app
지난 글: 멀티 컨테이너 파드 패턴: Sidecar, Ambassador, Adapter
다음 글: 쿠버네티스 Labels와 Selectors 완전 이해
읽어주셔서 감사합니다. 😊