23.9. 为启用 SR-IOV 的工作负载配置 QinQ 支持
QinQ (正式称为 802.1Q-in-802.1Q)是由 IEEE 802.1ad 定义的联网技术。IEEE 802.1ad 扩展了 IEEE 802.1Q-1998 标准,并通过向已使用 802.1Q 标记的数据包引入额外的 802.1Q 标签增强 VLAN 功能。此方法也称为 VLAN 堆栈或双 VLAN。
23.9.1. 关于 802.1Q-in-802.1Q 支持
在传统的 VLAN 设置中,帧通常包含一个 VLAN 标签,如 VLAN-100,以及其他元数据,如服务质量 (QoS) 位和协议信息。QinQ 引入了第二个 VLAN 标签,其中服务提供商为其使用指定外部标签,提供它们的灵活性,而内部标签则保留给客户的 VLAN 专用。
QinQ 通过使用双 VLAN 标记促进嵌套 VLAN 的创建,从而在网络环境中实现更精细的分段和流量隔离。这种方法对于您需要通过通用基础架构向多个客户提供基于 VLAN 的服务的服务供应商网络特别有用,同时确保流量隔离和隔离。
下图演示了 OpenShift Container Platform 如何使用 SR-IOV 和 QinQ 实现容器化工作负载的高级网络分段和隔离。
图显示双 VLAN 标记 (QinQ) 如何在支持 SR-IOV 的 worker 节点上工作。位于 pod 命名空间中的 SR-IOV 虚拟功能 (VF),ext0
由带有 VLAN ID 和 VLAN 协议的 SR-IOV Container Network Interface (CNI) 配置。这与 S-tag 对应。在 pod 中,VLAN CNI 使用主接口 ext0
创建一个子接口。此子接口使用 802.1Q 协议添加内部 VLAN ID,该协议对应于 C-tag。
这演示了 QinQ 如何在网络内启用更精细的流量分段和隔离。帧结构在右侧详细介绍,突出显示包含 VLAN 标签、EtherType、IP、TCP 和 Payload 部分的包含。QinQ 促进通过共享基础架构向多个客户提供基于 VLAN 的服务,同时确保流量隔离和隔离。
OpenShift Container Platform SR-IOV 解决方案支持在 SriovNetwork
自定义资源 (CR) 上设置 VLAN 协议。虚拟功能 (VF) 可以使用此协议来设置 VLAN 标签,也称为外部标签。然后,Pod 可以使用 VLAN CNI 插件来配置内部标签。
NIC | 802.1ad/802.1Q | 802.1Q/802.1Q |
---|---|---|
Intel X710 | 否 | 支持 |
Intel E810 | 支持 | 支持 |
Mellanox | 否 | 支持 |
其他资源
23.9.2. 为启用 SR-IOV 的工作负载配置 QinQ 支持
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 SR-IOV Network Operator。
流程
使用以下内容创建一个名为
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
对象,并设置名为 S-tag 或Service Tag
的外部 VLAN,因为它属于基础架构。重要您必须在交换机的中继接口上配置 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
运行以下命令来创建对象:
$ oc create -f nad-sriovnetwork-1ad-810.yaml
使用内部 VLAN 创建
NetworkAttachmentDefinition
对象。内部 VLAN 通常被称为 C-tag 或Customer Tag
,它属于 Network Function:使用以下内容,创建一个名为
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 的目标节点上进入 debug 会话,运行以下命令显示网络接口
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。