美文网首页我的专题
docker网络深度研究

docker网络深度研究

作者: 带马界的神秘人 | 来源:发表于2017-08-15 17:25 被阅读60次

    环境

    centos7
    yum install bridge-util tcpdump

    linux network namespace

    network namespace能创建多个隔离网络空间,每个空间都有各自独立的网卡和网络信息。

    ## 查看网络空间
    ip netns add NAME
    ## 设置网络空间名称
    ip netns set NAME NETNSID
    ## 删除网络空间
    ip [-all] netns delete [NAME]
    ## 获取当前网络空间 或者指定id的网络空间名称
    ip netns identify [PID]
    

    默认的网络空间namespace 是default,可以进入其他网络空间执行程序

    ## 进入testns执行
    ip netns exec testns bash
    ## 查看testns地址
    ip addr
    ## 退出testns网络空间
    exit
    

    veth pair

    如果把网络空间比喻成两个路由器,veth pair就是连接两个路由器的网线,可以让隔离的网络空间产生联系。

    veth pair
    ## 添加veth pair
    ip link add veth1 type veth peer name veth2
    ## 这样命令执行后会产生两个link设备 veth1 veth2,可以比喻成网线的两头
    ## 将veth1留在default命名空间里 将veth2放到testns命名空间里
    ## 移动veth2 并启动
    ip link set veth2 netns testns up
    ## 启动veth1
    ip link set veth1 up
    ## 设置veth1的ip
    ip addr add 10.0.0.1/24 dev veth1
    ## 设置veth2的ip
    ip netns exec testns ip addr add 10.0.0.2/24 dev veth2 
    

    ping测试

    ping 10.0.0.2
    ip netns exec testns ping 10.0.0.1
    

    bridge

    网桥可以将多个网络设备的网络连通起来,实现ip转发。即所有的ip包都发给桥接网卡,桥接网卡决定ip包流向哪个子网卡。类似交换机的功能。

    网桥示意图
    ## 添加一个桥接网卡
    brctl addbr mybr0
    ## 添加一个网卡
    brctl addif  veth1
    ## 删除veth1的ip
    ip addr del 10.0.0.1/24 dev veth1
    ## 设置mybr0的网络地址
    ip addr add 10.0.0.1/24 dev mybr0
    

    这样veth1,veth2就完全最为一个网线的作用了
    testns连接外网

    ip netns exec testns ip ro add default via 10.0.0.2
    

    container network

    linux docker的网络利用的就是network namespace。

    ## 添加软件连接
    ln -s /var/run/docker/netns /var/run/netns
    ## 查看docker的网络设备
    docker network ls
    ## 查看netns
    ip netns list
    

    可以看见docker的每一个网卡就是network namespace,网卡的id和网络空间是一致的。
    docker容器对外网的访问也是用的桥接网卡

    ## 会看见一个docker0的桥接网卡和一些veth的网卡
    ip addr
    

    docker利用的docker0桥接和veth pair让docker容器上网和访问docker宿主机

    VXLAN

    VXLAN(Virtual Extensible LAN),是一种网络虚似化技术,试图改进大型云计算的部署时的扩展问题.可以说是对vlan的一种扩展,由于vlan Header头部限长是12bit, 导致vlan的限制个数是2^12=4096个,无法满足日益增长的需求.目前 VXLAN 的报文 Header 内有 24 bit,可以支持 2^24次方的 VNI 个数(VXLAN中通过 VNI 来识别,相当于VLAN ID).
    docker的overlay网络利用的是vxlan,linux高版本内置的叠加网络类型。

    ## 查看docker的swarm网络
    docker network ls
    ##输出
    NETWORK ID          NAME                DRIVER              SCOPE
    c96794a02093        bridge              bridge              local
    5f0hj8eutx3o        ingress             overlay             swarm
    izlz6tjselmy        mynet               overlay             swarm
    
    ## 这里有两个swarm网络
    
    ## 软连接
    ln -s /var/run/docker/netns /var/run/netns
    
    ## 查看netns
    ip netns
    ## 输出
    b082687d2205 (id: 25)
    1-izlz6tjsel (id: 9)
    1-5f0hj8eutx (id: 0)
    
    ## 进入mynet网络命名空间 id 1-izlz6tjsel
    ip netns exec 1-izlz6tjsel  bash
    ## 查看地址
    ip addr
    ## 输出
    2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
        link/ether 1a:8a:ce:06:fe:95 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.1/24 scope global br0
           valid_lft forever preferred_lft forever
    559: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN 
        link/ether 5a:62:26:73:8a:55 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    587: veth4@if586: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP 
        link/ether b2:aa:51:60:a3:38 brd ff:ff:ff:ff:ff:ff link-netnsid 10
    ## 可以看见br0的桥接网卡和vxlan0的vxlan网卡和veth4的veth网卡
    ## 查看veth4的网卡对应网卡
    ethtool -S veth4
    ## 输出
    NIC statistics:
         peer_ifindex: 586
    ## 根据link-netnsid 10 可以看出网卡插到了命名空间id10了 
    ## 查看命名空间
    ip netns  list-id
    ## 输出
    nsid 10 (iproute2 netns name: a728e382a976)
    nsid 11 (iproute2 netns name: f5ccfdfe9b81)
    ## 查看a728e382a976的网络信息
    ip netns exec a728e382a976 ip a
    ## 输出
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    586: eth0@if587: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
        link/ether 02:42:0a:00:00:37 brd ff:ff:ff:ff:ff:ff link-netnsid 2
        inet 10.0.0.55/24 scope global eth2
           valid_lft forever preferred_lft forever
        inet 10.0.0.36/32 scope global eth2
           valid_lft forever preferred_lft forever
    588: eth1@if589: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
        link/ether 02:42:ac:13:00:0c brd ff:ff:ff:ff:ff:ff link-netnsid 1
        inet 172.19.0.12/16 scope global eth1
           valid_lft forever preferred_lft forever
    
    ## 可以看见586对应的eth0对应的就是这里veth4
    ## 查看eth1对应的网卡 ,这里的link-netnsid 1已经不是正确的了,因为这个是docker容器的网络空间序号,当前并不在docker容器内。
    ## 执行ethtool
    ip netns exec a728e382a976 ethtool -S eth1
    ## 输出
    NIC statistics:
         peer_ifindex: 589
    ## 退出mynet空间
    exit
    ## 查看默认网络空间的589
    ip link |grep 589
    ## 输出
    589: veth0641ce3@if588: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP mode DEFAULT 
    ## 查看网桥信息
    brctl show
    ## 输出
    bridge name bridge id       STP enabled interfaces
    docker_gwbridge     8000.02423beaac26   no      veth0641ce3
                                veth1fa0be1
                                veth23e5fec
                                veth3196c2e
                                veth3d96fa6
                                veth4377740
                                veth9378d7a
                                vetha114976
                                vetha964f01
                                vethbd20bb9
    
    ## 可以看见 这个veth是属于docker_gwbridge的
    

    通过上述观察可以画出下图

    网络示意图

    相关文章

      网友评论

        本文标题:docker网络深度研究

        本文链接:https://www.haomeiwen.com/subject/tiadrxtx.html