Kubectl로 쿠버네티스 노드 디버깅하기

Kubectl로 쿠버네티스 노드 디버깅하기 (Debugging Kubernetes Nodes With Kubectl)

이 페이지는 kubectl debug 명령을 사용해 쿠버네티스 클러스터에서 실행 중인 노드를 디버깅하는 방법을 보여드려요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

쿠버네티스 서버가 최소 1.2 버전이어야 해요. 버전을 확인하려면 kubectl version을 입력하세요.

Pod를 만들고 새 Pod를 임의의 노드에 할당할 권한이 있어야 해요. 또한 호스트의 파일시스템에 접근하는 Pod를 만들 수 있는 권한도 필요해요.

kubectl debug node로 노드 디버깅하기 (Debugging a Node using kubectl debug node)

kubectl debug node 명령을 사용해 문제를 해결하려는 노드에 Pod를 배포해요. 이 명령은 SSH 연결로 노드에 접근할 수 없는 시나리오에서 유용해요. Pod가 생성되면 Pod는 노드에서 대화형 셸을 엽니다. "mynode"라는 노드에서 대화형 셸을 만들려면 다음을 실행해요.

kubectl debug node/mynode -it --image=ubuntu
Creating debugging pod node-debugger-mynode-pdx84 with container debugger on node mynode.
If you don't see a command prompt, try pressing enter.
root@mynode:/#

debug 명령은 정보를 수집하고 문제를 해결하는 데 도움을 줘요. 사용할 수 있는 명령으로는 ip, ifconfig, nc, ping, ps 등이 있어요. 또한 mtr, tcpdump, curl 같은 다른 도구를 각각의 패키지 관리자에서 설치할 수도 있어요.

참고: 디버그 명령은 디버깅 파드가 사용하는 이미지에 따라 다를 수 있으며, 이 명령들은 설치가 필요할 수 있어요.

디버깅 Pod는 노드의 루트 파일시스템에 접근할 수 있으며, 이는 Pod의 /host에 마운트돼요. kubelet을 파일시스템 네임스페이스에서 실행한다면, 디버깅 Pod는 전체 노드가 아니라 그 네임스페이스의 루트를 봐요. 일반적인 Linux 노드의 경우 다음 경로를 살펴 관련 로그를 찾을 수 있어요.

  • /host/var/log/kubelet.log — 노드에서 컨테이너를 실행하는 책임이 있는 kubelet의 로그.
  • /host/var/log/kube-proxy.log — 트래픽을 Service 엔드포인트로 보내는 책임이 있는 kube-proxy의 로그.
  • /host/var/log/containerd.log — 노드에서 실행되는 containerd 프로세스의 로그.
  • /host/var/log/syslog — 시스템에 대한 일반 메시지와 정보를 보여줌.
  • /host/var/log/kern.log — 커널 로그를 보여줌.

노드에서 디버깅 세션을 만들 때 다음을 명심하세요.

  • kubectl debug는 노드의 이름을 기반으로 새 파드의 이름을 자동 생성해요.
  • 노드의 루트 파일시스템은 /host에 마운트돼요.
  • 컨테이너는 호스트 IPC, Network, PID 네임스페이스에서 실행되지만 파드는 privileged가 아니에요. 즉 일부 프로세스 정보를 읽는 것은 슈퍼유저에게만 제한되기 때문에 실패할 수 있어요. 예를 들어 chroot /host는 실패할 거예요. privileged 파드가 필요하다면 수동으로 만들거나 --profile=sysadmin 플래그를 사용해요.
  • 디버깅 프로파일(Debugging Profiles)을 적용해 디버깅 Pod에 securityContext 같은 특정 속성을 설정할 수 있어요.

정리하기 (Cleaning up)

디버깅 Pod 사용을 마치면 삭제해요.

kubectl get pods
NAME                          READY   STATUS       RESTARTS   AGE
node-debugger-mynode-pdx84    0/1     Completed    0          8m1s
# Change the pod name accordingly
kubectl delete pod node-debugger-mynode-pdx84 --now
pod "node-debugger-mynode-pdx84" deleted

참고: 노드가 다운되어 있으면(네트워크에서 연결이 끊기거나 kubelet이 죽어 재시작하지 않는 등) kubectl debug node 명령이 작동하지 않아요. 그런 경우 다운/연결 불가 노드 디버깅을 확인하세요.

더 알아보기 (Learn more)