kubernetes系列之三:kubernetes使用CNI macvlan作为网络插件
一、前言
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的工作模式
macvlan可以在主机的网卡上绑定多个二层mac地址,每个mac地址对应主机网卡(主接口)的一个子接口,每个container可以绑定一个子接口作为自己的网卡接口。
根据子接口通信方式的不同,macvlan存在四种工作模式:
- private mode:主接口会过滤掉交换机返回来的来自其子接口的报文,不同子接口之间无法互相通信。
- vepa(Virtual Ethernet Port Aggregator) mode: 发送出去的报文经过交换机,交换机再发送到对应的目标地址(即使目标地址就是主机上的其它macvlan子接口),也就是hairpin mode模式,这个模式需要主接口连接的交换机支持 VEPA/802.1Qbg 特性;这种方式允许一个主接口上的多个子接口借助外部交换机进行相互通信,而LAN里面的广播包也会被主接口forward到所有子接口。这个种方式的一个典型应用是如果在外部交换机上有一些策略,则可以使用VEPA模式让所有子接口交互的包都会经由外部交换机的处理,便于统一管理整个子网的所有物理和虚拟接口。
- bridge mode:通过主机上的macvlan bridge将主接口的所有子接口连接在一起,不同子接口之间能够不借助外部交换机而进行直接通信,不需要将报文发送到主机之外;因为所有子接口的mac地址都是已知的,所以macvlan bridge不需要mac地址学习和STP的能力,所以是一个高效的bridge实现。
- passthru mode:container可以直接使用主机的网络接口,并具有对接口进行参数调整的能力。
需要注意的是,如果使用macvlan模式,虽然主接口和子接口在同一LAN,但是在主机上通过主接口是没有办法直接和子接口通信的;需要额外建立一个子接口,把主接口的IP配置给这个子接口,这样才能借助原来主接口的IP和子接口进行通信。
转载自https://blog.csdn.net/cloudvtech
三、配置macvlan作为kubernetes的CNI实例
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
四、kubernetes运行POD使用macvlan网络
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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
转载自https://blog.csdn.net/cloudvtech
转载自https://blog.csdn.net/cloudvtech
更多推荐
所有评论(0)