目录
文章目录
MACVLAN
MACVLAN 是 Linux Kernel 的新特性,在 Linux kernel v3.9-3.19 和 v4.0+ 版本中支持。
通过 MACVLAN 可以将一个 Physical Network Interface 虚拟成多个 Virtual Network Interfaces(虚拟网络子接口),这些 VNIs 可以拥有自己独立的 MAC/IP 地址,且与主机网络处在同一个 LAN 里面,共享同一个广播域。
粗略的看,MACVLAN 与 Bridge 很类型,但相比,MACVLAN 没有了 Bridge 带来的 MAC 地址学习和翻译的负担,是一种高效直接的互联技术。
再仔细看看,根据子通信方式的不同,MACVLAN 有四种工作模式:
-
Private mode(私有模式):主接口会过滤掉交换机返回来的来自其子接口的报文,不同子接口之间无法互相通信。
-
VEPA(Virtual Ethernet Port Aggregator)mode / Hairpin mode(发夹流量模式):主接口发送出去的报文经过交换机,交换机再发送到对应的目标地址,即使目标地址就是主接口上的其它子接口。这个模式需要主接口连接的交换机支持 VEPA/802.1Qbg 特性。这种方式允许一个主接口上的多个子接口借助外部交换机进行相互通信,而 LAN 里面的广播包也会被主接口转发到所有子接口。这个种方式的一个典型应用是如果在外部交换机上有一些策略(e.g. 流量检测),则可以使用 VEPA 模式让所有子接口交互的包都会经由外部交换机的处理,便于统一管理整个子网的所有物理和虚拟接口。
-
Bridge mode(桥模式):通过 Host 上的 MACVLAN Bridge 将主接口的所有子接口连接在一起,不同子接口之间能够不借助外部交换机而进行直接通信,不需要将报文发送到 Host 之外;另外,因为所有子接口的 MAC 地址都是已知的,所以 MACVLAN Bridge 也不需要 MAC 地址学习和 STP 的能力,所以是一个高效的 Bridge 实现。
-
Passthru mode(直通模式):将主接口直通到 Container。Container 可以直接使用主机的网络接口,并具有对接口进行参数调整的能力。
可见,MACVLAN 具有非常类型 SR-IOV PF/VFs 网卡的特性。
NOTE:虽然 MACVLAN 主接口和子接口在同一个 LAN,但是在 Host 上通过主接口是没有办法直接和子接口通信的。需要额外建立一个子接口,把主接口的 IP 配置给这个子接口,这样才能借助原来主接口的 IP 地址和子接口进行通信。
使用 MACVLAN CNI
基于 Linux Kernel MACVLAN feature,将 VNI 子接口交给 Pod 使用,作为 Pod Network Namespace 的一个 Interface。
- 下载 CNI:https://github.com/containernetworking/plugins/releases
- 把 CNI 的 binary 放置到每个 Node 的 /opt/cni/bin/。
- 为每个 Node 配置 kubelet:
$ vi /etc/kubernetes/kubelet
...
KUBELET_ARGS="--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
- MACVLAN CNI 的配置文件:
{
"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" }
]
}
}