什么是 Multus-underlay¶
Multus-underlay 基于 Multus 并搭配一些 Underlay 类型的 CNI 插件(如 MacVLAN 或 SR-IOV CNI 等),可为 Pod 插入多张网卡。 此外,Multus-underlay 还解决了 Underlay CNI 的一些通信问题。 比如当 MacVLAN 作为 CNI 时,它无法与集群 ClusterIP 直接通信,并且它也无法直接与主机 MacVLAN Master 接口通信的(这是 Linux MacVLAN 技术的限制)。
Warning ⚠️
目前 Multus-underlay 已经被标记为 deprecated 状态, 可能在未来被移除, 目前已经不再更新。
解决的问题¶
- Underlay CNI 类型的 Pod 无法访问集群 ClusterIP
- Underlay CNI 类型的 Pod 无法通过健康检测
包含的组件¶
Multus-underlay 包含下面几个组件:
- Multus:调度多个 CNI 插件,按需为 Pod 插入一张或者多张网卡
- Meta-plugins:包括 veth 和 Router 两个插件,解决 Underlay CNI 的一些通信问题
- SR-IOV CNI(可选):可选安装 SR-IOV CNI,但需要硬件支持
Meta-plugins¶
Meta-plugins 包含两个 Meta 插件。 分别是 veth 和 Router,它们以 CNI-Chain 的方式被 CRI 调用。在 MacVLAN/SR-IOV 类的插件调用完成之后再调用, 通过在 Pod 的 NetNs 中设置一些规则,解决各种通信问题。
veth-Plugin¶
veth 插件与 ptp 有些类似,
通过在 Pod NetNs 中添加一对 veth-Peer 设备,并劫持来自主机、集群中的流量从 veth 设备通过。
而集群南北向流量仍然从 eth0
通过。下面是 veth 插件搭配 MacVLAN 的 multus CRD 实例的配置示例:
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-standalone
namespace: kube-system
spec:
config: |-
{
"cniVersion": "0.3.1",
"name": "macvlan-standalone",
"plugins": [
{
"type": "macvlan",
"master": "enp4s0f0np0", # macvlan 主接口
"mode": "bridge",
"ipam": {
"type": "spiderpool", # ipam 使用 spiderpool
"log_level": "DEBUG",
"log_file_path": "/var/log/spidernet/spiderpool.log",
"log_file_max_size": 100,
"log_file_max_age": 30,
"log_file_max_count": 10
}
},{
"type": "veth", # veth 以 cni-chain 的方式调用
"service_hijack_subnet": ["172.96.0.0/18","2001:4860:fd00::/108"], # 集群 service的网段, 包括 IPv4 和 IPv6
"overlay_hijack_subnet": ["10.240.0.0/12","fd00:10:244::/96"], # 集群 pod 的网段集合
"additional_hijack_subnet":[], # 可自定义的网段,访问此集合的网段的数据包将会先从 veth 设备送往主机, 再由主机进行转发。
"rp_filter": {
"set_host": true,
"value": 0
},
"migrate_route": -1, # 取值范围`-1,0,1`, 默认为 -1, 表示是否将新增网卡的默认路由移动到一个新的 route table中去。-1 表示通过网卡名自动迁移(eth0 < net1 < net2),0 为不迁移,-1表示强制迁移。
"log_options": { # 日志写入文件
"log_level": "debug",
"log_file": "/var/log/meta-plugins/veth.log"
}
}
]
}
Router-Plugin¶
Router 插件通过在 Pod Netns 中设置一些路由规则,使来自主机、集群内的数据包从 Pod 的 eth0(默认 CNI 创建的网卡)转发,而来自集群外的数据包从 MacVLAN/SR-IOV 创建的网卡转发。 下面是 Router 插件搭配 MacVLAN 的 Multus CRD 实例的配置示例:
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-vlan0-overlay
namespace: kube-system
spec:
config: |-
{
"cniVersion": "0.3.1",
"name": "macvlan-overlay", # macvlan 主接口
"plugins": [
{
"type": "macvlan",
"master": "enp4s0f0np0",
"mode": "bridge",
"ipam": {
"type": "spiderpool", # ipam 使用 spiderpool
"log_level": "DEBUG",
"log_file_path": "/var/log/spidernet/spiderpool.log",
"log_file_max_size": 100,
"log_file_max_age": 30,
"log_file_max_count": 10
}
},{
"type": "router", # router 插件 以 cni-chain 的方式调用
"overlay_interface": "eth0",
"migrate_route": -1, # 取值范围`-1,0,1`, 默认为 -1, 表示是否将新增网卡的默认路由移动到一个新的 route table 中去。-1 表示通过网卡名自动迁移(eth0 < net1 < net2),0 为不迁移,1 表示强制迁移。
"skip_call": false,
"service_hijack_subnet": ["172.96.0.0/18","2001:4860:fd00::/108"], # 集群 service的网段, 包括 IPv4 和 IPv6
"overlay_hijack_subnet": ["10.240.0.0/12","fd00:10:244::/96"], # 集群 pod 的网段集合
"additional_hijack_subnet":[], # 可自定义的网段。访问此集合的网段的数据包将会先从 eth0 设备送往主机, 再由主机进行转发。
"rp_filter": {
"set_host": true,
"value": 0
},
"log_options": {
"log_level": "debug",
"log_file": "/var/log/meta-plugins/router.log"
}
}
]
}