IT/Kubernets

kubectl debug --profile, 이거 모르는 분 꽤 많더라

gfrog 2026. 6. 9. 12:11
SMALL

thumbnail

오늘 후배가 distroless 이미지로 돌아가는 파드를 디버깅하느라 새벽까지 헤매고 있길래 옆에서 한마디 했다. "그냥 --profile=netadmin 붙여." 그랬더니 표정이 묘했다. "그게 뭔데요?" 아... 이거 1.27에서 들어온 게 벌써 3년이 다 돼가는데 의외로 안 쓰는 사람이 많다. 짧게 정리한다.

무슨 문제를 푸는가

kubectl debug로 ephemeral container를 띄울 때 기본값은 권한이 거의 없다. 그래서 tcpdumpiptables -L 같은 걸 돌리면 그냥 막힌다. 우리 팀에서도 처음엔 sidecar로 netshoot을 띄워놓던 시절이 있었는데, 그건 그것대로 메모리 잡아먹고 보안팀이 싫어한다.

--profile 플래그는 이런 류의 권한 세트를 미리 정의해놓은 프리셋이다. 1.27에서 alpha로 들어와서 1.30/1.31 쯤에 정착했고, 커스텀 프로파일은 1.31에서 베타, 1.32에서 GA됐다.

자주 쓰는 두 가지

네트워크 디버깅:

kubectl debug -it my-pod \
  --image=nicolaka/netshoot \
  --target=my-app \
  --profile=netadmin

netadmin 프로파일은 NET_ADMIN, NET_RAW capability를 붙여준다. tcpdump, ip route, conntrack 다 된다. 서비스 메시 사이드카 사이에서 트래픽이 어디로 새는지 볼 때 진짜 자주 쓴다.

루트 권한이 필요한 시스템 레벨 디버깅:

kubectl debug -it my-pod \
  --image=ubuntu \
  --target=my-app \
  --profile=sysadmin

sysadmin은 사실상 privileged에 가깝다. /proc/<pid>/로 들어가서 파일 디스크립터 보거나, strace 걸 때 유용하다. 다만 securityContext.runAsNonRoot: true로 강제된 파드에서는 uid가 강제로 0이 안 돼서 일부 동작이 안 먹는 케이스가 있다. 이건 kubectl 이슈 트래커에도 올라와 있는 알려진 한계라 미리 알아두면 좋다.

노드 자체를 디버깅하고 싶다면

이건 좀 다른 얘긴데, 같은 명령에 노드를 타겟으로 잡으면 노드 호스트 네임스페이스로 들어갈 수 있다.

kubectl debug node/ip-10-0-1-23 -it --image=ubuntu

쉘 안에서 /host 마운트로 노드 파일 시스템에 접근 가능하다. SSH 안 열려있는 EKS Auto Mode나 GKE Autopilot 노드에서 거의 유일한 진입 수단이다. 보안팀이 SSH는 닫아놨는데 RBAC은 안 막아놓은 환경이라면 사실상 백도어이기도 하니, 이건 거꾸로 권한 정책 점검할 때 체크 포인트로 쓸 수 있다.

커스텀 프로파일

1.32 GA된 기능. YAML로 ephemeral container spec을 직접 정의해서 넘길 수 있다.

kubectl debug -it my-pod \
  --image=ubuntu \
  --custom=./debug-profile.yaml \
  --profile=general

내부적으로 base 프로파일에 patch를 얹는 방식이라 --profile과 같이 써야 한다. 우리 팀에서는 CAP_PERFMON 붙은 프로파일 하나 만들어두고 perf 떠야 할 때 쓰는데, 자주 쓸 일은 없다. 그냥 "이런 게 있다" 정도만 알아둬도 충분하다.


오늘은 여기까지. 혹시 본인이 만든 프로파일 공유하실 분 있으면 댓글 남겨주세요. 다른 팀은 뭘 쓰나 궁금하다.

BIG