QinQ,正式名称为 802.1Q-in-802.1Q,是由 IEEE 802.1ad 定义的一种网络技术。IEEE 802.1ad 扩展了 IEEE 802.1Q-1998 标准,并通过向已经标记了 802.1Q 的数据包引入额外的 802.1Q 标签来丰富 VLAN 功能。此方法也称为 VLAN 堆叠或双 VLAN。
在执行以下文档中的任何任务之前,请确保您已安装 SR-IOV 网络操作符。
在传统的 VLAN 设置中,帧通常包含单个 VLAN 标签,例如 VLAN-100,以及其他元数据,例如服务质量 (QoS) 位和协议信息。QinQ 引入第二个 VLAN 标签,其中服务提供商指定外部标签供其使用,从而提供灵活性,而内部标签仍然专用于客户的 VLAN。
QinQ 通过使用双 VLAN 标记来促进嵌套 VLAN 的创建,从而能够在网络环境中更精细地分割和隔离流量。这种方法在服务提供商网络中特别有价值,在这些网络中,您需要通过公共基础架构向多个客户提供基于 VLAN 的服务,同时确保流量的分离和隔离。
下图说明了 OpenShift Container Platform 如何使用 SR-IOV 和 QinQ 为容器化工作负载实现高级网络分段和隔离。
该图显示了在具有 SR-IOV 支持的工作节点中双 VLAN 标记 (QinQ) 如何工作。位于 pod 命名空间 ext0
中的 SR-IOV 虚拟函数 (VF) 由 SR-IOV 容器网络接口 (CNI) 使用 VLAN ID 和 VLAN 协议配置。这对应于 S-tag。在 pod 内部,VLAN CNI 使用主接口 ext0
创建子接口。此子接口使用 802.1Q 协议添加内部 VLAN ID,这对应于 C-tag。
这演示了 QinQ 如何在网络内实现更精细的流量分割和隔离。以太网帧结构在右侧详细说明,突出显示了 VLAN 标签、EtherType、IP、TCP 和有效负载部分的包含。QinQ 促进了基于 VLAN 的服务通过共享基础架构向多个客户的交付,同时确保流量分离和隔离。
OpenShift Container Platform SR-IOV 解决方案已支持在 SriovNetwork
自定义资源 (CR) 上设置 VLAN 协议。虚拟函数 (VF) 可以使用此协议设置 VLAN 标签,也称为外部标签。然后,Pod 可以使用 VLAN CNI 插件配置内部标签。
网卡 | 802.1ad/802.1Q | 802.1Q/802.1Q |
---|---|---|
英特尔 X710 |
不支持 |
支持 |
英特尔 E810 |
支持 |
支持 |
Mellanox |
不支持 |
支持 |
您已安装 OpenShift CLI (oc
)。
您可以作为具有 cluster-admin
角色的用户访问集群。
您已安装 SR-IOV 网络操作符。
使用以下内容创建一个名为 sriovnetpolicy-810-sriov-node-network.yaml
的文件
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: sriovnetpolicy-810
namespace: openshift-sriov-network-operator
spec:
deviceType: netdevice
nicSelector:
pfNames:
- ens5f0#0-9
nodeSelector:
node-role.kubernetes.io/worker-cnf: ""
numVfs: 10
priority: 99
resourceName: resource810
通过运行以下命令创建 SriovNetworkNodePolicy
对象
$ oc create -f sriovnetpolicy-810-sriov-node-network.yaml
打开一个单独的终端窗口,并通过运行以下命令监视 openshift-sriov-network-operator
命名空间中指定的节点的 SR-IOV 网络节点状态的同步状态
$ watch -n 1 'oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath="{.status.syncStatus}"'
同步状态指示从 InProgress
到 Succeeded
的更改。
创建一个 SriovNetwork
对象,并设置外部 VLAN(称为 S-tag 或 服务标签
),因为它属于基础设施。
您必须在交换机的中继接口上配置 VLAN。此外,您可能需要进一步配置某些交换机以支持 QinQ 标记。 |
使用以下内容创建一个名为 nad-sriovnetwork-1ad-810.yaml
的文件
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: sriovnetwork-1ad-810
namespace: openshift-sriov-network-operator
spec:
ipam: '{}'
vlan: 171 (1)
vlanProto: "802.1ad" (2)
networkNamespace: default
resourceName: resource810
1 | 将 S-tag VLAN 标签设置为 171 。 |
2 | 指定要分配给虚拟函数 (VF) 的 VLAN 协议。支持的值为 802.1ad 和 802.1q 。默认值为 802.1q 。 |
通过运行以下命令创建对象
$ oc create -f nad-sriovnetwork-1ad-810.yaml
创建一个具有内部 VLAN 的 NetworkAttachmentDefinition
对象。内部 VLAN 通常称为 C-tag 或 客户标签
,因为它属于网络功能
使用以下内容创建一个名为 nad-cvlan100.yaml
的文件
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: nad-cvlan100
namespace: default
spec:
config: '{
"name": "vlan-100",
"cniVersion": "0.3.1",
"type": "vlan",
"linkInContainer": true,
"master": "net1", (1)
"vlanId": 100,
"ipam": {"type": "static"}
}'
1 | 指定 pod 内的 VF 接口。默认名称为 net1 ,因为 pod 注释中未设置名称。 |
通过运行以下命令应用 YAML 文件
$ oc apply -f nad-cvlan100.yaml
按照此步骤验证节点上 QinQ 是否处于活动状态
使用以下内容创建一个名为 test-qinq-pod.yaml
的文件
apiVersion: v1
kind: Pod
metadata:
name: test-pod
annotations:
k8s.v1.cni.cncf.io/networks: sriovnetwork-1ad-810, nad-cvlan100
spec:
containers:
- name: test-container
image: quay.io/ocp-edge-qe/cnf-gotests-client:v4.10
imagePullPolicy: Always
securityContext:
privileged: true
通过运行以下命令创建测试 pod
$ oc create -f test-qinq-pod.yaml
进入 pod 所在的目标节点上的调试会话,并通过运行以下命令显示有关网络接口 ens5f0
的信息
$ oc debug node/my-cluster-node -- bash -c "ip link show ens5f0"
6: ens5f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether b4:96:91:a5:22:10 brd ff:ff:ff:ff:ff:ff
vf 0 link/ether a2:81:ba:d0:6f:f3 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 1 link/ether 8a:bb:0a:36:f2:ed brd ff:ff:ff:ff:ff:ff, vlan 171, vlan protocol 802.1ad, spoof checking on, link-state auto, trust off
vf 2 link/ether ca:0e:e1:5b:0c:d2 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 3 link/ether ee:6c:e2:f5:2c:70 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 4 link/ether 0a:d6:b7:66:5e:e8 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 5 link/ether da:d5:e7:14:4f:aa brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 6 link/ether d6:8e:85:75:12:5c brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 7 link/ether d6:eb:ce:9c:ea:78 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 8 link/ether 5e:c5:cc:05:93:3c brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust on
vf 9 link/ether a6:5a:7c:1c:2a:16 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
输出中的 vlan protocol 802.1ad
ID 指示该接口支持使用协议 802.1ad (QinQ) 进行 VLAN 标记。VLAN ID 为 171。