
이거 모르는 분 꽤 많더라. 어제 팀원이 "distroless 이미지로 바꿨더니 이제 파드 안 들여다볼 수가 없어요"라고 물어봐서, 그 자리에서 알려준 팁. 사실 별 것도 아닌데 정리해두면 다음에 또 물어보는 사람 나오니까.
상황
distroless 베이스로 만든 컨테이너는 셸도 없고 cat도 없다. 그러니 kubectl exec -it pod -- sh 는 당연히 안 먹힌다. 예전에는 어쩔 수 없이 debug용 이미지 하나 더 만들거나, 파드를 아예 복제해서 이미지만 갈아끼우거나 했었다. 근데 Kubernetes 1.25부터 ephemeral container가 stable 됐고, kubectl debug 로 훨씬 편해졌다.
문제는 그냥 kubectl debug pod/foo -it --image=busybox 이렇게만 하면 대상 컨테이너의 파일시스템이 안 보인다는 거다. 프로세스도 안 보이고. shareProcessNamespace 나 targetContainer 설정을 매번 손으로 넣기 귀찮다.
팁: --profile=general 을 붙여라
kubectl 1.30 이상이면 --profile 플래그가 GA다. 이거 하나만 붙이면 위에서 말한 설정이 알아서 붙는다.
kubectl debug -it pod/api-server-xxxx \
--image=nicolaka/netshoot \
--target=api-server \
--profile=general
--target 을 주면 대상 컨테이너의 PID namespace 를 공유하니까 ps -ef 로 앱 프로세스가 보이고, /proc/<pid>/root/ 로 대상 컨테이너의 파일시스템에 들어갈 수 있다. distroless 안에 있는 config 파일이나 바이너리를 확인할 때 이 경로가 진짜 유용하다.
netshoot 대신 chainguard 이미지도 괜찮다
디버그 이미지는 취향인데, 나는 nicolaka/netshoot 를 주로 쓴다. 네트워크 툴이 다 들어있어서 DNS 이슈나 iptables 까볼 때 편함. 대신 이미지가 500MB 넘어가서 노드 pull 시간이 좀 있으니, private registry에 미리 캐시해두는 편이 낫다.
가벼운 게 필요하면 cgr.dev/chainguard/wolfi-base 도 요즘 자주 쓰인다. 100MB 대에 apk 로 필요한 툴만 추가 설치 가능.
하나 더 — 노드 자체를 봐야 할 때
파드가 아니라 노드 레벨에서 볼 게 있으면 kubectl debug node/<node-name> -it --image=... 로 노드에 debug 파드를 띄울 수 있다. /host 아래에 노드 rootfs가 마운트되어 뜬다. CNI 로그나 kubelet 상태 볼 때 SSH 안 열려있는 EKS 노드도 이 방법으로 접근 가능.
마무리
--profile=general 하나 알아두면 distroless 를 훨씬 마음 편하게 쓸 수 있다. 보안팀에서 자꾸 distroless 로 바꾸자고 하는데 운영이 반대하는 팀이 있다면, 이 명령어 하나 시연해주면 대체로 설득된다. 우리 팀도 그러음.
혹시 다른 debug 이미지 잘 쓰시는 분 있으면 댓글로 알려주세요.
'IT > 컨테이너' 카테고리의 다른 글
| Docker BuildKit 캐시, 사실 내부적으로는 이렇게 돌아간다 (1) | 2026.07.04 |
|---|---|
| Docker BuildKit cache mount, 이거 모르면 CI에서 매번 손해 본다 (0) | 2026.07.01 |
| Dockerfile COPY --link, 다들 쓴다는데 진짜 좋을까 (0) | 2026.06.28 |
| containerd config_path, 이거 모르는 분 꽤 많더라 (0) | 2026.06.21 |
| BuildKit cache mount으로 CI 빌드 시간 7분 -> 40초 만든 가이드 (0) | 2026.06.21 |