kubectl debug --profile, 이거 모르는 분 꽤 많더라
오늘 후배가 distroless 이미지로 돌아가는 파드를 디버깅하느라 새벽까지 헤매고 있길래 옆에서 한마디 했다. "그냥 --profile=netadmin 붙여." 그랬더니 표정이 묘했다. "그게 뭔데요?" 아... 이거 1.27에서 들어온 게 벌써 3년이 다 돼가는데 의외로 안 쓰는 사람이 많다. 짧게 정리한다.
무슨 문제를 푸는가
kubectl debug로 ephemeral container를 띄울 때 기본값은 권한이 거의 없다. 그래서 tcpdump나 iptables -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 떠야 할 때 쓰는데, 자주 쓸 일은 없다. 그냥 "이런 게 있다" 정도만 알아둬도 충분하다.
오늘은 여기까지. 혹시 본인이 만든 프로파일 공유하실 분 있으면 댓글 남겨주세요. 다른 팀은 뭘 쓰나 궁금하다.