×

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 网络操作符

关于 802.1Q-in-802.1Q 支持

在传统的 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 的服务通过共享基础架构向多个客户的交付,同时确保流量分离和隔离。

Diagram showing QinQ (double VLAN tagging)

OpenShift Container Platform SR-IOV 解决方案已支持在 SriovNetwork 自定义资源 (CR) 上设置 VLAN 协议。虚拟函数 (VF) 可以使用此协议设置 VLAN 标签,也称为外部标签。然后,Pod 可以使用 VLAN CNI 插件配置内部标签。

表 1. 支持的网络接口卡
网卡 802.1ad/802.1Q 802.1Q/802.1Q

英特尔 X710

不支持

支持

英特尔 E810

支持

支持

Mellanox

不支持

支持

为启用 SR-IOV 的工作负载配置 QinQ 支持

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您可以作为具有 cluster-admin 角色的用户访问集群。

  • 您已安装 SR-IOV 网络操作符。

步骤
  1. 使用以下内容创建一个名为 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
  2. 通过运行以下命令创建 SriovNetworkNodePolicy 对象

    $ oc create -f sriovnetpolicy-810-sriov-node-network.yaml
  3. 打开一个单独的终端窗口,并通过运行以下命令监视 openshift-sriov-network-operator 命名空间中指定的节点的 SR-IOV 网络节点状态的同步状态

    $ watch -n 1 'oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath="{.status.syncStatus}"'

    同步状态指示从 InProgressSucceeded 的更改。

  4. 创建一个 SriovNetwork 对象,并设置外部 VLAN(称为 S-tag 或 服务标签),因为它属于基础设施。

    您必须在交换机的中继接口上配置 VLAN。此外,您可能需要进一步配置某些交换机以支持 QinQ 标记。

    1. 使用以下内容创建一个名为 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.1ad802.1q。默认值为 802.1q
    2. 通过运行以下命令创建对象

      $ oc create -f nad-sriovnetwork-1ad-810.yaml
  5. 创建一个具有内部 VLAN 的 NetworkAttachmentDefinition 对象。内部 VLAN 通常称为 C-tag 或 客户标签,因为它属于网络功能

    1. 使用以下内容创建一个名为 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 注释中未设置名称。
    2. 通过运行以下命令应用 YAML 文件

      $ oc apply -f nad-cvlan100.yaml
验证
  • 按照此步骤验证节点上 QinQ 是否处于活动状态

    1. 使用以下内容创建一个名为 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
    2. 通过运行以下命令创建测试 pod

      $ oc create -f test-qinq-pod.yaml
    3. 进入 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。