Container网络方案之macvlan

本文探讨了如何使用macvlan提升docker容器的网络性能,以解决默认bridge网络的瓶颈问题。macvlan提供了独立的MAC地址和子网IP,可与IPVS整合实现高效负载均衡。然而,它限制了容器间通信且需要宿主机物理网卡置于混杂模式。文中还分享了macvlan配置和使用技巧。

一、方案分析

在默认container 运行时(比如docker)的网络配置下,所有的container的数据包都会通过一个默认的bridge外加iptablesNAT进出,对于大流量或者大TPS的程序,基于Linux内核功能的bridgeNAT无疑会成为容器网络能力的瓶颈,可以使用macvlan的功能来提高container的网络能力。

转载自https://blog.csdn.net/cloudvtech

二、为container配置macvlan

container实际上是使用Linux提供的network namespace的功能来建立container的网络功能, 包括协议栈、网卡、路由、iptable规则等都与其它的network namespace的独立。但如果使用docker container none network模式,那么这个container将不会具有任何网络资源,之后可以通过命令或者工具脚本为container实例配置macvlan网络。

可以使用https://github.com/jpetazzo/pipework/ 这个工具来为container配置网络:
docker run -d --name=nginx1 --net=none chr:nginx  
pipework eno16777736 nginx1 192.168.166.224/24@192.168.166.2 

这个命令实际上是

  • 在物理网卡eno16777736上建立了一个macvlan子接口
  • 为container创建network namespace
  • 将macvlan子接口放入container的network namespace
  • 在network namespace内配置IP和路由

经过配置之后,每个container实例都会具有独立的MAC地址,与主机网卡eno16777736处于同一个子网之内,具有独立的子网IP,可以为子网内的其它主机和交换设备感知:

root@e0d938b4de4a:/# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default  
    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 
    inet6 ::1/128 scope host  
       valid_lft forever preferred_lft forever 
22: eth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default  
    link/ether ca:65:8c:92:9c:44 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.166.224/24 brd 192.168.166.255 scope global eth1
       valid_lft forever preferred_lft forever 
    inet6 fe80::c865:8cff:fe92:9c44/64 scope link  
       valid_lft forever preferred_lft forever 

转载自https://blog.csdn.net/cloudvtech


三、macvlan的优缺点

优点:
  • 性能好,基本可以打到系统native的效果
  • 配置方便,只需要对container的network namespace进行简单的配置
  • 方便与IPVS进行整合,使用高效的负载均衡解决方案
缺点:
  • 无法与本机其它container进行通信
  • 需要把macvaln的宿主物理网卡切换到混杂模式

转载自https://blog.csdn.net/cloudvtech


四、container macvlan与IPVS的整合

IPVS是基于Linux内核的负载解决方案,IPVS的Direct Routing模式特别适合为小请求大回复模式的网络服务(比如视频流服务)进行负载均衡。在为container配置好macvlan之后,可以使用命令行将container配置为IPVS负载均衡的一个后端服务:
ID=e0d938b4de4a 
PID=$(docker inspect -f '{{.State.Pid}}' $ID) 
VNET="vnet${ID:0:8}" 
IP="192.168.166.111"
sudo mkdir -p /var/run/netns 
sudo ln -s /proc/$PID/ns/net /var/run/netns/$PID 
sudo ip link add $VNET type dummy 
sudo ip link set $VNET netns $PID 
sudo ip netns exec $PID ip link set dev $VNET name eth1 
sudo ip netns exec $PID ip link set eth1 up 
sudo ip netns exec $PID ip addr add "$IP/32" dev eth1 
sudo ip netns exec $PID ip rout add "$IP" dev eth1 scope link 

加入VIP之后的container内部网络情况:
root@e0d938b4de4a:/# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default  
    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 
    inet6 ::1/128 scope host  
       valid_lft forever preferred_lft forever 
22: eth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default  
    link/ether ca:65:8c:92:9c:44 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.166.224/24 brd 192.168.166.255 scope global eth1
       valid_lft forever preferred_lft forever 
    inet 192.168.166.111/32 scope global eth1
       valid_lft forever preferred_lft forever 
    inet6 fe80::c865:8cff:fe92:9c44/64 scope link  
       valid_lft forever preferred_lft forever 
23: vnete0d938b4: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default  
    link/ether 66:7b:db:eb:67:be brd ff:ff:ff:ff:ff:ff 


之后可以在IPVS director上加入container的IP作为负载均衡的一个后端服务器:
VIRTUAL_IP=192.168.166.111:80 
ipvsadm -A -t $VIRTUAL_IP -s wlc 
ipvsadm -a -t $VIRTUAL_IP -r 192.168.166.224 -g 


转载自https://blog.csdn.net/cloudvtech

五、container macvlan使用的tips

  • container的宿主机的网卡需要设置成promisc模式 (ifconfig eth0 promisc)
  • 载入macvlan内核模块(modprobe macvlan; lsmod | grep macvlan)
  • 如果是VMWare的虚拟机,需要将VMWare的虚拟交换机配置成promisc模式


转载自https://blog.csdn.net/cloudvtech






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值