ipvlan l2
- 升级内核
ubuntu20.04
root@zbb-test-aap:~# uname -r
5.4.0-71-generic
- 实验:
参考: https://kernel.taobao.org/2019/11/ipvlan-for-kubernete-net/
macvlan 和 ipvlan的区别, macvlan 不同子接口拥有不同的mac, 而 ipvlan 不同子接口,不同ip,同一mac
2.1 ipvlan 官方教程
https://www.kernel.org/doc/html/latest/networking/ipvlan.html
create IPvlan link in L2 bridge mode:
ip link add link eth0 name ipvl0 type ipvlan mode l2 bridge
- Example configuration:
+=============================================================+
| Host: host1 |
| |
| +----------------------+ +----------------------+ |
| | NS:ns0 | | NS:ns1 | |
| | | | | |
| | | | | |
| | ipvl0 | | ipvl1 | |
| +----------#-----------+ +-----------#----------+ |
| # # |
| ################################ |
| # eth0 |
+==============================#==============================+
Create two network namespaces - ns0, ns1:
ip netns add ns0
ip netns add ns1
Create two ipvlan slaves on eth0 (master device):
ip link add link ens3 ipvl0 type ipvlan mode l2
ip link add link ens3 ipvl1 type ipvlan mode l2
Assign slaves to the respective network namespaces:
ip link set dev ipvl0 netns ns0
ip link set dev ipvl1 netns ns1
Now switch to the namespace (ns0 or ns1) to configure the slave devices
For ns0:
(1)
ip netns exec ns0 bash
(2)
ip link set dev ipvl0 up
(3)
ip link set dev lo up
(4)
ip -4 addr add 127.0.0.1 dev lo
(5)
IPADDR=10.119.0.124/21
ip -4 addr add $IPADDR dev ipvl0
(6)
ROUTER=10.119.0.1
ip -4 route add default via $ROUTER dev ipvl0
ip -4 route add 169.254.169.254 via 10.119.0.10 dev ipvl0
For ns1:
(1) ip netns exec ns1 bash
(2) ip link set dev ipvl1 up
(3) ip link set dev lo up
(4) ip -4 addr add 127.0.0.1 dev lo
(5) ip -4 addr add $IPADDR dev ipvl1
(6) ip -4 route add default via $ROUTER dev ipvl1
############################
- 首先参考ipvlan-ref了解 pod基于ipvlan的使用方式
在以上基础上,为了做到node直通pod,需要在node也建一个子接口并配置ip以及路由
参考如下命令
ip link add link eth0 name ipvl0 type ipvlan mode l2 bridge
ip link add link ens3 ipvl0 type ipvlan mode l2
ip link set dev ipvl0 up
IPADDR=10.119.0.124/21
ip -4 addr add $IPADDR dev ipvl0
ROUTER=10.119.0.1
ip -4 route add default via $ROUTER dev ipvl0
ip -4 route add 169.254.169.254 via 10.119.0.10 dev ipvl0
## node上操作
# ipvl 子接口配置ip 和eth1 一致
ip addr add 172.22.0.22/32 dev ipvl_1
# terway需要eth1有ip
ip addr add 172.22.0.22/16 dev eth1
# pod ip配置路由,实现node本地基于eth1 ipvla 子接口直通pod
ip route add 172.22.1.8/32 via 0.0.0.0 dev ipvl_1 proto kernel scope
# node 内核配置,关闭反向路径校验,让node可以转发pod访问svc ip的流量,不丢该包
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
sysctl -a | grep rp_filter
确认都已关闭
# pod内部操作
pod内部添加svc访问的路由操作:
ip route add 172.29.0.0/16 dev eth0
pod内部添加访问localdns的路由操作:
ip route add 169.254.25.10/16 dev eth0
扩展:
基于同样的模式, linux-bridge ovs-bridge在node也搞一个子接口,也是可以pod访问node本地的svc以及localdns的。
ipvlan网卡表现:
一旦一张网卡启用ipvlan 模式之后:
- 从外部一个节点ping 该node上的ipvlan 主网卡无法ping 通
- 从node 内部 基于该网卡ping外部也无法工作
基于以上,该网卡的ip是无效的,应该被"借"到网卡子接口
网友评论