임시 디버깅 용기를 사용하여 Kubernetes 크레인에서 네트워크 유량 포착
7013 단어 networkingkubernetestutorial
실행 중인 Pod에 대해 tcpdump 실행
며칠 전에 나는 응용 프로그램과 특사 사이드카 에이전트 사이의 네트워크 데이터를 디버깅해야 하는 상황에 부딪혔다.다행히도 응용 프로그램 이미지는 Ubuntu를 기반으로 하고 중요하지 않은 개발 집단이기 때문에 용기의 셸과
kubectl exec
에 apt install tcpdump
을 넣을 수 있습니다.현재 나는 이미
tcpdump
를 설치했다. 나는 그것을 운행하고 출력을 파이프를 통해 로컬 기계로 전송할 수 있다. Wiresharkkubectl exec my-app-pod -c nginx -- tcpdump -i eth0 -w - | wireshark -k -i -
만약 내가 이렇게 말한다면, 이 영화는 상당히 유창해서, 나로 하여금 마치 Hackers 배역처럼 느끼게 한다.😎하지만 이것도 문제가 있다.😳
kubectl exec
실행 중인 Pod에 인터넷에서 온 임의의 소프트웨어를 설치해야 한다.인터넷에 연결된 개발 환경은 좋지만 생산 과정에서 할 수 있는 일은 아닐 수도 있습니다.distroless
기본 이미지를 사용하거나 buildpack로 구축한다면 나는 apt install
할 수 없다.tcpdump
다시 만들려면pod를 다시 만들어야 합니다.만약 버그가 복제하기 어렵다면, 이것은 결코 이상적이지 않다.tcpdump
가 항상 선택되는 것은 아니다.응용 프로그램의 초기 용기 이미지를 만들 때 항상 사용할 수 있도록 포함하지 않는 이유는 무엇입니까?이 경로는 이미지를 팽창시킨다. 우리가 이미지에 포함하는 불필요한 패키지가 많을수록 잠재적인 공격 방향량이 많아진다.그럼 저희가 뭘 할 수 있을까요?
다행히도 Kubernetes의 최신 버전은 debugging running pods에 알파 기능을 제공했다.
임시 디버깅 용기
Kubernetes 1.16은 새로운 Ephemeral Containers 특성을 가지고 있어 우리의 용례에 매우 적합하다.임시 용기에 대해 우리는 새로운 임시 용기를 요청할 수 있습니다. 그 위에 기존 크레인에서 실행할 그림을 선택할 수 있습니다.이것은 우리가 프로그램의 1차 이미지를 경량으로 유지하고 필요할 때 우리가 가장 좋아하는 모든 디버깅 도구를 사용하여 다시 이미지를 추가할 수 있다는 것을 의미한다.
다음 예시에 대해 저는 my
mando
app를 사용합니다. 이것은 mando-655449598d-fqrvb
의Pod로 실행됩니다.Gobuildpack you can read more on that here 으로 구축된 것이기 때문에 최소한의 이미지를 가진 응용 프로그램의 완벽한 예입니다.어떻게 사용하기 어려운지 보여주기 위해서, 우선 전통적인 방식으로 셸을 열어 봅시다.
kubectl exec -it mando-655449598d-fqrvb -- /bin/sh
error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "3ca55f9b6457995be6c6254a8d274706e42d89f431956b5b02ad9eade5e5f788": OCI runtime exec failed: exec failed: container_linux.go:370: starting container process caused: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown
아니오/bin/sh
?이것은 매우 거칠다.busybox
이미지를 사용하여 임시 용기가 있는 셸을 제공합니다.kubectl alpha debug -it mando-655449598d-fqrvb --image=busybox --target=mando -- /bin/sh
If you don't see a command prompt, try pressing enter.
/ # echo "hello there"
hello there
/ # ls
bin dev etc home proc root sys tmp usr var
이제 우리는 조개껍질과 유사한 각종 활동을 할 수 있다!그러나 우리의 용례에 대해 우리는 네트워크 데이터 패키지를 포획하기를 희망한다.네트워크 문제 해결에 최적화된 이미지를 사용합니다:
nicolaka/netshoot
.우리는
kubectl alpha debug
runtcpdump
과 함께 사용할 수 있으며, 출력을 파이프를 통해 우리의 로컬 Wireshark로 전송할 수 있습니다. 우리가 이전에 한 것처럼!다음은
tcpdump
를 사용하여 eth0
인터페이스에서 패킷을 캡처하는 구체적인 예입니다.kubectl alpha debug -i mando-655449598d-fqrvb --image=nicolaka/netshoot --target=mando -- tcpdump -i eth0 -w - | wireshark -k -i -
내가 Istio를 나의 서비스 격자로 사용하기 때문에
eth0
포획 데이터 패키지는 주로 특사 측차 대리와의 통신량을 나타낸다.만약 우리가 에이전트와 mando
응용 프로그램 자체 간의 통신을 디버깅하고 싶다면, lo
인터페이스에 대해 같은 일을 할 수 있다.kubectl alpha debug -i mando-655449598d-fqrvb --image=nicolaka/netshoot --target=mando -- tcpdump -i lo -w - | wireshark -k -i -
나는 그룹에서 서비스 격자 상호작용을 디버깅할 때 이 두 명령이 모두 매우 귀중하다는 것을 발견했다.주의사항
Kubernetes 1.19까지 임시 용기는 여전히 알파 특성이므로 생산 집단에 사용하는 것을 권장하지 않습니다.따라서 환경에서는 아직 액세스할 수 없습니다.알파 특성으로서 이 특성의 인터페이스와 기능은 쉽게 변경될 수 있으므로 현재의 실현에 지나치게 의존하지 마세요!이것은 매우 유용한 기능이지만, 나는 그들이 그것을 완전히 삭제할지 의심스럽다.
하지만 오늘도 미리 방문할 수 있는 방법이 많다.
GKE와 같은 위탁 관리 Kubernetes 서비스를 사용하고 있다면, 다양한 실험 기능을 사용할 수 있는 (지원되지 않는) alpha cluster 을 만들 수 있습니다.나는 다른 위탁 관리 제품에 대해 그리 익숙하지 않지만, 그들은 어떤 형식의alpha 발표 경로를 가지고 있을 가능성이 높다.
또는 로컬
kind
클러스터를 실행 중인 경우 다음 kind
구성을 사용하여 임시 컨테이너here를 활성화하는 방법을 보여 줍니다.kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
EphemeralContainers: true
사용자 정의 kubeadm
배치된 집단을 사용한다면, configure the Kubernetes control plane components 로고를 사용하여 실행할 수 있습니다.선택
만약 어떤 이유로 임시 용기를 사용할 수 없고, 데이터 패키지를 정말 포착하고 싶다면, 절망하지 마십시오!😌
또한
--feature-gates=EphemeralContainers=true
를 참조하십시오.대상 Pod와 같은 네트워크 이름 공간을 공유하는 새 용기를 만들고 패키지를 포획할 수 있는 특권 Pod을 만들 수 있습니다.특권pod를 실행할 수 없고, tcpdump를 용기 이미지에 추가할 수 없다면,...
나는 네가 방법을 생각해 낼 것이라고 믿는다.
행운을 빕니다.🙂
표지 사진 대출기: Taylor Vick위Unsplash
Reference
이 문제에 관하여(임시 디버깅 용기를 사용하여 Kubernetes 크레인에서 네트워크 유량 포착), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/downey/capturing-network-traffic-from-a-kubernetes-pod-with-ephemeral-debug-containers-57md텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)