IT/Kubernets

kubectl debug --profile, 이거 모르면 매번 privileged 파드 만들고 있는 거다

gfrog 2026. 7. 20. 18:13

오늘 사내 채널에서 후배가 "distroless 컨테이너 파드 안에서 tcpdump 뜨고 싶은데 어떻게 해요?" 라고 물어봐서 답해주다가, 생각보다 kubectl debug --profile 옵션을 모르는 사람이 많다는 걸 알았다. 나도 예전엔 급하면 그냥 securityContext.privileged: true 넣은 사이드카 파드 하나 붙여서 디버깅했는데, 지금은 그럴 필요가 없다.

프로필이 뭘 해주냐면

kubectl debug로 ephemeral container를 붙일 때 --profile 플래그 하나로 필요한 capability 조합을 미리 세팅해준다. 손으로 securityContext YAML을 쓰지 않아도 된다는 얘기다. 현재 지원되는 프로필은 다섯 개다.

  • general — 일반적인 디버깅용 기본값. 1.36부터 정식 default가 됐다
  • baseline — Pod Security baseline 기준을 지킴
  • restricted — restricted 기준까지 지킴. 클러스터 정책이 빡세면 이거
  • netadmin — NET_ADMIN, NET_RAW 붙여줌. tcpdump, iptables 볼 때
  • sysadmin — SYS_PTRACE, SYS_ADMIN 등 다 붙여줌. strace, mount 볼 때

실전 예시 두 개

distroless 파드에서 네트워크 문제 잡을 때. 대상 파드의 네트워크 네임스페이스를 그대로 공유하면서 nicolaka/netshoot 컨테이너를 붙인다.

kubectl debug -it my-app-7f8d-abc \
  --image=nicolaka/netshoot \
  --profile=netadmin \
  --target=my-app \
  -- bash

들어가서 바로 tcpdump -i eth0 port 5432 이런 거 뜨면 된다. --target을 넣어야 대상 컨테이너의 프로세스 트리를 볼 수 있다는 걸 자주 까먹는데, 이거 없으면 sidecar처럼 붙기만 하고 프로세스는 못 본다.

파드에 붙어서 프로세스 strace 하고 싶으면 sysadmin 프로필로.

kubectl debug -it my-app-7f8d-abc \
  --image=ubuntu \
  --profile=sysadmin \
  --target=my-app \
  -- bash

이후 strace -p <PID> 로 붙으면 된다. SYS_PTRACE가 있어서 다른 프로세스에 ptrace 가능.

한 가지 주의점

대상 파드가 non-root user로 실행되고 있으면, 프로필이 부여한 capability가 실제로 안 먹는 경우가 있다. 최근 kubectl issue tracker에도 관련 리포트가 올라와 있는데, sysadmin 프로필을 걸어도 uid가 non-zero면 SYS_ADMIN이 무력화되는 케이스다. 이럴 땐 어쩔 수 없이 --custom 플래그로 JSON patch 넣어서 uid를 0으로 오버라이드해야 한다. 이거 삽질하다가 시간 날린 적 있음.

혹시 아직도 privileged 파드 매니페스트 복붙해서 디버깅하고 있는 분이 있다면 --profile 한번 써보시라. 훨씬 깔끔하다.