在K8s調試網絡問題時間經常需要tcpdump 容器內虛擬網卡,歸納一下主要是以下2種方法可以實現。
1, 如果pod 內容器已經安裝有bash。
參照https://community.pivotal.io/s/article/How-to-get-tcpdump-for-containers-inside-Kubernetes-pods?language=en_US .
1.1 kubectl get pod podname_xxx -o json
獲取pod 所處host 和 containerID
1.2 docker exec containerID /bin/bash -c 'cat /sys/class/net/eth0/iflink'
在host上獲取容器內eth0 iflinkid
1.3 ip link |grep iflinkid
獲取虛擬網卡的name
1.4 tcpdump -i vethxxx
2, 如果pod 內容器沒有安裝有bash。
2.1 同1.1 獲取host
2.2 docker ps|grep pause|grep podname_xxx
獲取pod裏面pause 容器的containerID
2.3 docker inspect 容器的containerID |grep SandboxKey
獲取pause 容器的網絡命名空間ID nsID
2.4 ln -s /var/run/docker/netns /var/run/netns
映射nsID 容器網絡命名空間映射出來.
2.5 ip netns exec nsID ifconfig 或者 ip netns exec nsID tcpdump -i eth0
這樣就可以在host 執行容器網絡命名空間的veth設置和抓包。