kubectl debug --profile, 이거 모르면 매번 privileged 파드 만들고 있는 거다
오늘 사내 채널에서 후배가 "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 한번 써보시라. 훨씬 깔끔하다.