在虚拟接口上启用 VLAN 子接口支持
总结 虚拟化网络功能 (VNF) 和容器化网络功能 (CNF) 工作负载通常需要在单个接口上提供多个虚拟网络服务。云原生 Contrail® 网络™ 支持虚拟接口上的 VLAN 子接口。
VLAN 子接口概述
VLAN 子接口是网络级别的虚拟(或物理)接口的逻辑划分。VLAN 子接口是接收和转发 802.1Q VLAN 标记的 3 层接口。您可以将多个 VLAN 标记分配给单个虚拟接口。当数据包到达该接口时,数据包关联的 VLAN 标记会指定数据包的路由为哪个 VLAN。您可以使用 VLAN 子接口将流量路由到多个 VLAN 以用于服务。
API 变更
本节提供有关配置 VLAN 子接口时发生的 API 调用的信息。
在云原生 Contrail 网络中配置 VLAN 子接口时,Kubernetes 会使用新的properties
或 VLAN 标记更新VirtualMachineInterface
该字段。更新后,VirtualMachineInterface
对象将根据现有 VLAN 标记引用其他VirtualMachineInterface
对象。
云原生 Contrail 网络将 Contrail 经典版中的字段定义 properties
为 virtualMachineInterfaceProperties
。
网络定义变更
本节提供有关为 Pod 内的虚拟接口创建子接口时所需的网络定义增强功能的信息。
在 kube-manager
中PodController
,观察 Pod 事件会读取应用于它的网络定义。Kube-manager
解析每个网络选择元素并创建关联的 VMI(虚拟机接口)。父层 VMIS 是仅net.juniper.contrail.interfacegroup
附加在 YAML 文件中的标记的网络元素。子接口是带有 YAML 文件中附加和net.juniper.contrail.vlan
标记的网络元素net.juniper.contrail.interfacegroup
。
以下两个标记可增强部分中的 cni-args
网络定义:
-
net.juniper.contrail.interfacegroup
-
接口组两个或多个接口。
-
父层接口是仅与此标记关联的网络选择元素。
-
子接口是与此标记和 VLAN 标记关联的网络选择元素。
-
net.juniper.contrail.vlan
-
指定子接口上的 VLANID。
-
VLAN 子接口属于其父层接口。用户必须指定子接口连接到的名称空间。请考虑以下示例:
示例 1
apiVersion: v1 kind: Pod metadata: name: my-pod namespace: my-namespace annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "parent-vn", "namespace": "vn-ns", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1"} ... }, { "name": "subitf-vn", "namespace": "vn-ns", "cni-args": { "net.juniper.contrail.vlan": 100, "net.juniper.contrail.interfacegroup": "eth1"}, ... }, ...
示例 1 显示了指定的 cni-args
Pod 注释。此示例配置在 Pod 内创建以下三个 VMI 和三个 IIP(接口 IP):
-
VMI,用于默认 Pod 网络 eth0 的 IIP
-
VMI,iIP,用于 eth1
parent-vn
(父层接口) -
VMI,用于 eth1.100 的 IIP(
subitf-vn
子接口)
配置用例
本节提供不同有效和无效的父层和子接口配置的示例。
有效配置
配置无效
有效配置 1:一个父子接口:一个子接口:
apiVersion: v1 kind: Pod metadata: name: vlan100-0 namespace: vlan-project annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vlan-parent-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "100", "net.juniper.contrail.interfacegroup": "eth1" } }, ...
有效配置 2:一个父子接口,多个子接口:
apiVersion: v1 kind: Pod metadata: name: vlan100-0 namespace: vlan-project annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vlan-parent-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn2", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "200", "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "100", "net.juniper.contrail.interfacegroup": "eth1" } } ]
有效配置 3:多个家长、多个子接口:
apiVersion: v1 kind: Pod metadata: name: vlan100-0 namespace: vlan-project annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vlan-parent-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn2", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "200", "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "100", "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vlan-subintf-vn4", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "100", "net.juniper.contrail.interfacegroup": "eth2" } }, { "name": "vlan-subintf-vn3", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth2" } } ]
无效配置 1:同一网络上的多个接口:
apiVersion: v1 kind: Pod metadata: name: vlan100-0 namespace: vlan-project annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn1", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vn1", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.vlan": "200", "net.juniper.contrail.interfacegroup": "eth1" } }, ]
配置无效 2:两个接口相同 interfacegroup
,但没有 VLAN
apiVersion: v1 kind: Pod metadata: name: vlan100-0 namespace: vlan-project annotations: k8s.v1.cni.cncf.io/networks: | [ { "name": "vn1", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, { "name": "vn2", "namespace": "vlan-project", "cni-args": { "net.juniper.contrail.interfacegroup": "eth1" } }, ]