[k8s] 컨테이너 디버깅

k8s 환경에서 뭘 굴리다보면 실제 파드, 컨테이너 환경에 대해서 실시간으로 뭔가를 확인해야 할 필요가 종종 있다.




컨테이너 접속

컨테이너에 직접 접속해서 액션을 하려면, 다음과 같이 kubectl exec 명령을 사용하면 된다.
docker cli와 인터페이스가 거의 같다.

kubectl exec -it server-name /bin/sh

그러면 쉘로 진입해서 이런저런 작업들을 해볼 수 있게 된다.





컨테이너 내부에서 명령 실행

꼭 들어가서 보는게 아니라도 ping이나 curl 같은 단발성 명령을 날리고 싶을 수도 있을 것이다.
그러면 이것도 exec 명령을 통해 처리할 수 있다.

kubectl exec -it server-name -- 명령어...

다만 유의할 점은, exec 명령은 컨테이너 내부에서 동작하는 것이기 때문에 호스트에 도구가 있더라도 컨테이너 내부에 없으면 사용할 수 없다는 것이다.
그래서 ping 같은게 이미지 내에 없으면 그냥 못쓴다.




컨테이너에 파일 옮기기

컨테이너에 직접 실행파일이나 기타 테스트를 위한 파일을 옮겨서 확인을 해보는 방법도 있다.

kubectl cp 명령을 사용하면 호스트 시스템의 파일을 컨테이너 내로 바로 복사할 수 있다.

kubectl cp /usr/bin/ping 파드명:/usr/bin/ping

단, 실행파일의 경우에는 그냥 옮긴다고 해서 실행이 보장되지는 않는다는 점을 유의한다. 실행파일의 필요조건에는 .so 같은 별도의 악세서리들이 존재하기 때문이다.




디버깅 컨테이너 사용

kubectl debug 기능을 사용하면 디버깅용 컨테이너를 띄워서 현황 조사에 응용할 수 있다.
Pod에는 여러개의 컨테이너를 띄울 수 있고, 각각의 컨테이너가 리소스를 공유한다는 점을 응용한 방법이다.

그래서 top 같은 도구를 이용한 시스템 리소스 확인 같은 문제에는 사용할만하다.

다음과 같이 사용하면 된다.

kubectl debug -it --container=debug-container --image=alpine --target=파드명 파드명

그럼 컨테이너가 바로 실행되고


기존 파드를 보면 컨테이너만 하나 추가로 붙어있는 것을 볼 수 있다.

그럼 기본 alpine 환경으로 컨테이너가 떴으니까, 필요한거 설치하고 하면서 이래저래 둘러보면 된다.




로그 확인하기

파드, 컨테이너의 로그를 확인하려면 logs 명령을 사용한다.

kubectl logs 파드명

근데 이렇게 하면 딱 그 시점에 나온 최근 로그만 잘라서 본다.

실시간으로 로그를 계속 확인하고 싶다면 -f 플래그를 주면 된다.

로그를 다루는 방법에 대해서는 따로 상세하게 다뤄보겠다.



참조
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_debug/
https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_debug/
https://medium.com/datamindedbe/debugging-running-pods-on-kubernetes-2ba160c47ef5