macvlan是kernel新支持的特性之一,需要Linux kernel v3.9–3.19和4.0+的支持。这种模式所配置的container网络同主机网络在同一个LAN里面,可以具有和主机一样的网络能力。
使用macvlan可以在主机的一个网络接口上配置多个虚拟的网络接口,这些网络接口有自己独立的MAC地址和IP地址。macvlan 下的container网络和主机在同一个网段中,共享同一个广播域。基于macvlan的联网方式,可以直接访问主机所在的LAN,并且没有其它诸如bridge等方式带来的bridge处理和地址翻译的负担,是一种高效直接的互联技术。
转载自https://blog.csdn.net/cloudvtech
macvlan可以在主机的网卡上绑定多个二层mac地址,每个mac地址对应主机网卡(主接口)的一个子接口,每个container可以绑定一个子接口作为自己的网卡接口。
根据子接口通信方式的不同,macvlan存在四种工作模式:
需要注意的是,如果使用macvlan模式,虽然主接口和子接口在同一LAN,但是在主机上通过主接口是没有办法直接和子接口通信的;需要额外建立一个子接口,把主接口的IP配置给这个子接口,这样才能借助原来主接口的IP和子接口进行通信。
转载自https://blog.csdn.net/cloudvtech
macvlan是CNI里面预先实现的插件,https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan
如果要为kubernetes配置macvlan CNI插件,需要经过如下一些步骤:
1.kubernetes配置
k8s master: 192.168.166.101
k8s node1: 192.168.166.102
k8s node2: 192.168.166.103
k8s node3: 192.168.166.104
2.下载CNI最新的发布
下载地址:https://github.com/containernetworking/plugins/releases
将下载的binary放置到每个node的/opt/cni/bin/目录
3.为kubelet配置CNI
在文件/etc/kubernetes/kubelet添加如下配置:
KUBELET_ARGS="--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
macvlan CNI插件的配置文件/etc/cni/net.d/10-maclannet.conf如下:
{
"name": "macvlannet",
"type": "macvlan",
"master": "ens33",
"mode": "vepa"
"isGateway": true,
"ipMasq": false,
"ipam": {
"type": "host-local",
"subnet": "192.168.166.0/24",
"rangeStart": "192.168.166.21",
"rangeEnd": "192.168.166.29",
"gateway": "192.168.166.2",
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
转载自https://blog.csdn.net/cloudvtech
1. 启动kubernetes POD deployment
在每个k8s node上面都启动一个busybox的replica
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
busybox-6l6rd 1/1 Running 0 1h 192.168.166.31 192.168.166.103
busybox-9j531 1/1 Running 0 1h 192.168.166.41 192.168.166.104
busybox-z6hdq 1/1 Running 0 1h 192.168.166.21 192.168.166.102
2. 测试子接口的ARP能力和IP联通性
在k8s master上可以ping通所有macvlan子接口对应的IP并且可以看到对应的mac地址:
在container里面可以看到对应mac地址和IP
[root@k8s-node1 ~]# docker exec -it 859ce6208e54 sh
/ # ip a
1: lo: mtu 65536 qdisc noqueue 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc noqueue
link/ether 26:16:fe:b4:02:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.166.21/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2416:feff:feb4:2a4/64 scope link
valid_lft forever preferred_lft forever
3. container内部对外联通性
可以起ping通其它主机上macvlan主接口和子接口IP,但是无法ping通本主机主接口IP:
4. 在主机网卡上可以看到如下mac地址:
[root@k8s-node1 ~]# ip maddr show ens33
2: ens33
link 01:00:5e:00:00:01 users 2
link 33:33:00:00:00:01 users 2
link 33:33:ff:34:7b:e9
link 26:16:fe:b4:02:a4
inet 224.0.0.1
inet6 ff02::1:ff34:7be9
inet6 ff02::1
inet6 ff01::1