在虚拟接口上启用 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-argsPod 注释。此示例配置在 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"
}
},
]