IT/컨테이너

distroless 파드 디버깅, kubectl debug --profile 만 알면 된다

gfrog 2026. 7. 6. 06:44
SMALL

 

이거 모르는 분 꽤 많더라. 어제 팀원이 "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 이미지 잘 쓰시는 분 있으면 댓글로 알려주세요.

BIG