一、方案分析
在默认container 运行时(比如docker)的网络配置下,所有的container的数据包都会通过一个默认的bridge外加iptables的NAT进出,对于大流量或者大TPS的程序,基于Linux内核功能的bridge和NAT无疑会成为容器网络能力的瓶颈,可以使用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

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

4102

被折叠的 条评论
为什么被折叠?



