본문으로 바로가기

[DevOps] k8s sniff 를 사용한 pod의 tcp 패킷 캡처

category IT/DevOps 2023. 8. 20. 16:56
반응형

Intro

MSA구조의 아키텍처가 도입되면서 인프라와 서버가 작은 단위로 쪼개지면서 그 작은 서버간의 네트워크 통신에 대한 추적과 가시화 그리고 이에 대한 트러블슈팅이 중요해지고 있습니다. 기존 모놀리식 구조의 인프라 형태를 보면 LB → Server 구조의 비교적 심플한 구조였다면, MSA구조에 LB → Server(node) → ingress controller→ (svc)→ pod 와 같이 홉이 더 많아지고 복잡 해졌습니다. 따라서 원하는대로 동작하지 않는 경우 트러블 슈팅을 위해서 어느 홉까지 통신이 되고 있는지 확인 해야하는 일들이 종종 발생하게 됩니다.

k8s sniff 란?

k8s sniff는 k8s pod의 TCP통신 패킷을 캡처해주는 유틸리티 입니다. 물론 kubectl exec 를 통해 pod에 직접 들어가서 tcpdump같은 것을 사용해도 됩니다. 하지만 만약 pod가 패키지 설치 권한이 없는 형태의 이미지 이거나, 설치 권한이 있다해도 패키지 repository 리스트가 명확히 정의 되지 않거나 한다면 tcpdump를 설치하는데에 힘을 빼야하는 경우가 많이 있습니다. 또 pod에서 패킷을 캡처한 파일을 로컬 pc나 다른 서버로 옮기려고 할때도 번거롭게 됩니다.

오늘 설명드릴 k8s sniff를 이용하면 pod에서 사용하는 이미지가 무엇이든 영향없이 pod간 통신 패킷을 로컬 pc에 저장할 수 있습니다.

k8s sniff 설치하기

k8s sniff를 설치 하기 위해서는 krew라는 kubernetes 플러그인 매니저를 설치해야합니다.

  1. mac os에서 아래와 같은 명령어 실행
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)
  1. .bashrc or .zshrc 에 아래 명령어 추가
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
  • sniff install
kubectl krew insatll sniff

k8s sniff 사용법

  • 아래와 같이 tcpdump를 할 namespace와 pod를 입력하고 -o 옵션에 패킷을 저장할 경로를 적어주면 끝
kubectl sniff -n test example-pod -p --image docker.io/hamravesh/ksniff-helper:v3 --tcpdump-image docker.io/maintained/tcpdump:latest -o ~/temp/example-capture.pcap

그러면 저장한 pcap 형태의 tcp패킷 파일은 어떻게 확인할 수 있을 까요? 일반적으로 실무에서 와이어샤크라는 프로그램을 많이 사용합니다. 다음시간에는 와이어 샤크를 설치해서 pcap 파일의 tcp 패킷을 확인하는 방법을 알아 보도록 하겠습니다.

반응형