docker網絡問題的排查

docker network

具體見https://docs.docker.com/network/
先討論overlay, 近2天排查的是container之間的問題. 記錄一下經常使用的腳本和命令.
https://docs.docker.com/netwo...
下圖參考concept使用. 原圖來自於
https://cloud.tencent.com/info/dc89b384392e75a6c3614d2dee4088ad.html
但連接已失效.
image.pnghtml

concept

network namespace

網絡名字空間, 由linux kernel實現.
network namespace(網絡名字空間)是相互隔離的網絡視圖,每一個網絡名字空間都有獨立的網絡配置,好比:網絡設備、路由表等.
ip netns list 可列出network namespacelinux

veth pair

虛擬網卡接口對.
連接不一樣network namespacedocker

vxlan

跨機器通訊, 經過3層的udp協議, 模擬2層網絡.
docker container 也經過 veth pair 連接 container 和 overlay 的 network namespace.
全部的包都會發到br0網橋, 再經過vtep(VXLAN Tunnel End Point) 封包成udp協議發送至遠端主機, 就像在同一臺機器同樣.bash

排查經常使用命令

將docker的network namespace歸入ip netns管理

cd /var/run &&sudo ln -s /var/run/docker/netns netns
root@xxxxx:/home/xxxxx# ip netns list
9c91cd6debed (id: 6)
5a80a1c4887f (id: 13)
eb26f4d5b623 (id: 9)
1f2110b87988 (id: 4)
...

找到container的network namespace

#!/bin/bash

all_netns=$(ip netns | awk {'print $1'})
declare -A mac_to_netns
for one_netns in $all_netns
do
  mac_addr=$(ip netns exec $one_netns ifconfig | grep "\beth1\b" | awk {'print $NF'})
  # echo "mac1$mac_addr"
  if [ -n "$mac_addr" ]; then
    mac_to_netns[$mac_addr]=$one_netns
  fi
done

for container in $(docker ps --format '{{.Names}}'); do
  mac_addr=`docker exec $container cat /sys/class/net/eth1/address`
  # echo "$container: $mac_addr"
  if [ -n "$mac_addr" ]; then
    echo "$container:${mac_to_netns[$mac_addr]}"
  fi
done

找到container的veth.

#!/bin/bash

for container in $(docker ps --format '{{.Names}}'); do
    iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth*/iflink'`
    for net in $iflink;do
        net=`echo $net|tr -d '\r'`
        veth=`grep -l $net /sys/class/net/veth*/ifindex`
        veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
        if [ -n "$veth" ]; then
          echo $container:$veth
        fi
    done
done

抓特定container包

用上面腳本拿到container的namespace網絡

ip netns exec 0c9dbfeee12f tcpdump -i any host 192.168.xxx.xxx -w xx.cap

抓vxlan包

直接抓eth0, 能夠用udp, port 4789 篩選tcp

tcpdump -i eth0 host xxxx udp port 4789 -w xxx_vxlan.cap
相關文章
相關標籤/搜索