IT/Kubernetes

kubernetes pod debugging 방법 5가지

엘티엘 2022. 3. 6. 23:37

kubernetes 를 사용하다보면 pod 를 debugging 할일이 있다.

일반적으로 application을 디버깅을 하기 위해서는 application이 실행되는 서버에 접속해서 로그를 확인거나, application의 api를 호출해야 한다. 그런데, kubernetes에서는 대부분의 pod들이 클러스터 내에서만 접속이 가능하기 때문에 외부에서 접속하거나, api를 호출할수 없는 경우가 상당수이다.

1. pod가 정상적으로 실행되지 않을때 - kubectl decribe

kubectl describe po [pod 이름]

pod가 실행되기전 에러가 발생한다면, describe 명령을 사용한다. pod가 왜 정상적으로 실행되지 않았는지 원인을 추정해볼수 있다. 마지막 출력내용을 보면 에러가 발생한 이유를 확인할 수 있다. 아래 사진은 nginx:alpn 이라는 이미지를 찾을수 없다는 에러이다.

2. pod의 로그를 확인하고 싶을때 - kubectl logs

kubectl logs [pod 이름]

pod의 실행로그를 확인하고 싶다면 logs 명령어를 사용한다. 실행 로그를 확인하면서 디버깅해볼수 있다. 아래와 같이 로그를 확인할 수 있다.

3. pod에 접속하고 싶을때 - kubectl exec

kubectl exec [pod 이름] -c [container 이름] -- [명령어]
kubectl exec -it [pod 이름] -c [container 이름] -- /bin/sh

pod에 접속해서 직접 명령을 내리고 싶다면 exec 명령어를 사용한다. 일반적인 pod 는 클러스터 내에서만 api 호출이 가능하기 때문에 클러스터내 다른 pod를 통해서 api 호출 테스트 등을 할 수 있다.

아래사진은 nginx-pod에 접속해서 ls -al 명령어를 내린 화면이다. pod내 파일리스트가 정상적으로 출력되는것을 볼 수 있다. ls -al 명령을 실행하고 container를 바로 빠져나온다. (container 이름을 지정하지 않으면 첫번째 container가 지정된다.)

명령을 한번 내리는것으로 끝나지 않고 ssh 로 접속한것처럼 container내 터미널 환경을 계속해서 사용하고 싶을수 있다. 이럴 경우는 -it 옵션과 /bin/sh 커맨드를 추가한다. 아래사진은 nginx-pod에 접속해서 shell 환경에서 ls -al 명령어를 내린 화면이다. 참고로 continer 이름을 지정하지 않으면 첫번째 container가 선택된다. 다만 쉘이 없는 이미지를 사용한다면 shell 환경에 접속할 수 없다.

4. 임시 pod 만들기 - kubectl exec 

kubectl run -it --restart=Never --rm [pod 이름] --image=busybox
######### ip port 연결 확인 #########
# nc -z -v -w 2 [svc] [port]

kubectl run -it --restart=Never --rm [pod 이름] --image=nginx -- /bin/bash
######### ip port 연결 확인 #########
# nc -z -v -w 2 [svc] [port]
######### api 확인 #########
# curl [ip]

디버깅을 위한 pod를 클러스터내에 임시로 생성해서 접속 및 api 호출을 확인해 볼수 있다. 위 명령어를 사용하면 pod를 생성하고 쉘 환경이 생성된다. --restart=Naver 및 --rm 옵션을 사용하면 쉘 환경에서 빠져나오면 pod가 바로 delete된다. busybox 이미지를 사용할 경우 nc 명령어를 통해 통신여부를 확인할수 있다. nginx 이미지를 사용하면 curl 명령어까지 사용할수 있어 api 까지 테스트 할수 있다.

5. 노드에서 임시 pod 만들기 - kubectl debug

kubectl debug node/mynode -it --image=nginx

 

node를 선택해서 임시 pod를 생성할수 있다. 이후 curl 명령어 등을 사용해서 api 시험을 할수 있다. 다만 pod를 직접 삭제해야 한다.

반응형