服务质量:重写和标记以实现 QoS
总结 CN2 23.4 版支持 IPv4 和 IPV6 的 MPLS 封装类型(MPLSoUDP、MPLSoGRE)的服务质量 (QoS) 标记和重写功能。
CN2 部署中主要用例的 QoS
在 CN2 部署中,Pod 到 Pod 的流量源于与云原生网络功能 (CNF) 关联的 Pod,遍历交换矩阵,止于与出口设备(如 vRouter 或 SDN 网关)关联的不同网络或 Pod。虚拟路由器接收入口数据包,并准备在下游设备上进行差分处理。vRouter 不妨碍任何差异化调度。相反,CN2 会为下游网络设备实施数据包标记和重写,以便对差异化流量进行查询和调度。
CN2 的 QoS 解决了两个主要用例:
用例 1:隧道端点上的 Pod 使用的数据包
当来自与 CNF 关联的 Pod 的数据包到达入口 vRouter 时,将发生此用例。vRouter 引用与 vRouter 关联的 VMI 或 VN 配置中的 QoS 设置,其中 VN 配置优先。如果存在 QoS 设置,vRouter 将对传入 QoS 位执行重写功能。此重写功能可确保将传入的 QoS 值重写为配置中指定的等效 QoS 值,并在数据包的内部标头中标记这些值。
然后,vRouter 会为下游隧道准备数据包的外部报头。在称为传播的过程中,vRouter 引用数据包内部报头中的 QoS 值,并将这些值转换为数据包的外部报头。此过程很重要,因为隧道接口仅在实现 QoS 期间引用数据包的外部报头。例如,根据配置规范,传入 DSCP 值可能会转换为数据包外部标头中的 MPLS 值。
然后,通过 MPLSoUDP 或 MPLSoGRE 对数据包进行封装,以进行隧道传输。连接到隧道端点/vRouter 的容器使用数据包。当连接到出口 vRouter 或 SDN 网关的 Pod 使用数据包时,下游设备会在下游设备上实现由外部标头中的 QoS 值确定的 QoS 实现(差分服务)。
请注意,在此用例中,由于数据包遍历 MPLS 隧道并在隧道端点上使用,因此将忽略数据包的内部标头。
用例 2:由 SDN 网关转发的数据包
此用例与上述第一个用例类似。但是,在这种情况下,隧道端点上的设备不会使用数据包。相反,它将数据包路由到 SDN 网关,后者进一步将其转发到另一个网络。在此用例中,入口虚拟路由器还会根据 VMI 或 VN QoS 配置重写(覆盖)数据包内部标头中的 QoS 值,并将这些值传播到外部标头以进行隧道传输。随后对数据包进行封装,出口设备通过 SDN 网关将其转发至另一个网络中的设备。SDN 网关解封装数据包的外部报头,访问内部报头,并将数据包使用修改后的 QoS 值转发到下游。
鉴于这两个主要用例,重写最好理解为将传入的 QoS 值覆盖为 QoS 配置中指定的等效 QoS 值的过程。最好将传播理解为确保向下游设备转换或复制数据包的 QoS 值以执行一致 QoS 实现的过程。对于 CN2,传播发生在 MPLS 隧道接口的数据包外部标头中。
重写和标记
如前所述,处理 QoS 位的机制称为重写(一种称为标记的特定实现)和传播(一种称为转换的特定实现)。本部分提供有关重写和一种称为标记的重写形式的信息。
传入数据包可能不包含任何 QoS 值。换句话说,数据包中存在默认值 DSCP 零 (0)。QoS DSCP 值为 0 的数据包通常会得到尽力而为的处理。如果配置指定要映射到值 0 的值,则此覆盖作称为标记。换句话说,当 DSCP 值 0 存在时,将进行标记。发生这种情况时,CN2 会覆盖数据包内部报头中的 0 入口 QoS DSCP 值,并根据配置在外部报头中创建一个 QoS 值。此外,可能还需要根据配置更改 [1-63] 范围内的 QoS 值,这称为重写。
数据包重写策略包括:
-
从 DSCP 到 DSCP(仅适用于下行网络也可以是标准 IP,需要 DSCP 值的 IP)
-
从 EXP 到 EXP(仅适用于 MPLS 数据包)
传播和转换
由于下行隧道接口仅访问数据包的外部报头,因此位于内部报头中的数据包 QoS 值将被转换或复制到外部报头,以便在隧道期间保持一致的 QoS 实现。传播与下一跃点配合使用,将 QoS 位写入数据包的外部报头中,以便在隧道期间实现下游设备的 QoS。QoS 值通过复制现有值或转换来传播。
对于只了解 EXP 值的设备,DSCP 值没有意义。为了解决此问题,配置指定了等效的 DSCP 和 EXP 值,以便于理解这两种值类型。请注意,尽管值是等效的,但它们属于不同的类型。例如,配置可能会指定 DSCP 值及其等效的 QoS 值,但尽管这些值在技术上是等效的,但它们的位类型不同。在传播的上下文中,转换意味着将 QoS 值从内部标头转换为位于外部标头中的替代类型。例如,在下游设备上,DSCP 值可能会转换为 EXP 值,反之亦然,以确保下游的 QoS 一致。
数据包传播策略在配置中指定,并连接到隧道和接口。传播策略包括:
-
从 DSCP 到 EXP(仅适用于 IP)
-
从 EXP 到 DSCP(仅适用于 MPLS 数据包)
基于流量模式的数据包处理
由于 CN2 部署中的数据包通过 MPLSoUDP 或 MPLSoGRE 隧道传输,因此大部分流量是 IP 到 IP。
鉴于这种流量模式,必须在以下级别配置和实施流量策略:
VN 级别(与该 VN 关联的所有入口接口)
虚拟机接口 (VMI)
CN2 支持数据包重写/标记和传播,以在数据包从源地址传输到目标地址时管理和实施数据包策略、QoS 设置和协议。
配置 QoS
配置全局和命名空间 QoS 设置,并将配置与 VN 或 VMI 相关联。使用一系列按特定顺序应用的 YAML 文件应用配置。按以下指定的顺序应用以下 YAML 文件。请注意,这些文件是示例配置。
GlobalQoS图格
此文件创建一个全局 QoS 对象,以便为后续配置对象创建分层设置。
apiVersion: core.contrail.juniper.net/v6
kind: GlobalQoSConfig
metadata:
name: default-global-qos-config
spec:
controlTrafficDscp:
control: 10
analytics: 20
Forwarding类
此文件显示了两个转发类 (fc-1, fc-2) 的示例。特定的 DSCP 和 MPLS EXP 值与这些类相关联。这些值决定了 QoS 阻碍,并决定了如何处理与这些类关联的流量。
apiVersion: core.contrail.juniper.net/v6 kind: ForwardingClass metadata: name: fc-1 spec: forwardingClassId: 99 forwardingClassDscp: 23 forwardingClassMplsExp: 4 --- apiVersion: core.contrail.juniper.net/v6 kind: ForwardingClass metadata: name: fc-2 spec: forwardingClassId: 100 forwardingClassDscp: 10 forwardingClassMplsExp: 4
QoS-Map 索引
以下文件显示了在命名空间中定义的 QoS 映射索引。覆盖数据包内部报头中的 QoS 位或将 QoS 位转换为外部报头需要建立 QoS 映射索引。QoS 映射索引指定从传入 QoS 值到下游设备所需的另一个值的映射。此映射在转发类中定义。用于指定如何重写 QoS 位的配置称为 QoS-Map 索引。
换言之,QoS-Map 索引和转发类定义了数据包遍历期间 QoS 值的转换。注意dscpEntries和mplsExpEntries字段。通过嵌套和keyforwardingClassId字段,您可以将 DSCP 和 MPLS EXP 值与特定的转发类相关联。此命名空间内的流量的差异处理是基于这些设置实现的。
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: "core.contrail.juniper.net/v6"
kind: QoSConfig
metadata:
name: test-qos-config
namespace: test
spec:
qosConfigType: fabric
dscpEntries:
qosIdForwardingClassPairList:
- key: 24
forwardingClassId: 100
mplsExpEntries:
qosIdForwardingClassPairList:
- key: 6
forwardingClassId: 100
将 QoS 配置连接到 VN
该文件将创建一个示例 VN 对象 (zone-1)。记下该 qosConfigReference 字段。此 VN 和此 VN 中的所有接口都与 中指定的 test-qos-configQoS 配置相关联。
apiVersion: core.contrail.juniper.net/v6
kind: VirtualNetwork
metadata:
namespace: vn-static-route
name: zone-1
spec:
v4SubnetReference:
- apiVersion: core.contrail.juniper.net/v6
kind: Subnet
namespace: vn-static-route
name: zone-1-static-v4-subnet
qosConfigReference:
- apiVersion: core.contrail.juniper.net/v6
kind: QOSPolicy
namespace: qos-ns
name: test-qos-config
将 QoS 配置转换为 VMI
此文件在示例命名空间 ()contrail 中创建一个 VMI 对象。记下该 qosConfigReference 字段。此 VMI (virtualmachineinterface-create-test) 引用了来自 test-qos-translation的 QoS 配置。
apiVersion: core.contrail.juniper.net/v6
kind: VirtualMachineInterface
metadata:
namespace: contrail
name: virtualmachineinterface-create-test
spec:
virtualMachineInterfaceMacAddresses:
macAddress:
- 00:11:22:33:44:55
virtualNetworkReference:
apiVersion: core.contrail.juniper.net/v1
kind: VirtualNetwork
namespace: contrail
name: virtualnetwork-sample
qosConfigReference:
- apiVersion: core.contrail.juniper.net/v6
kind: QOSPolicy
namespace: qos-ns
name: test-qos-translation
验证 QoS 配置
使用以下命令验证是否已创建 QoS 配置及其关联对象:
-
qosmap --dump-fc:显示配置的FC(转发类)及其映射的DSCP值。例如,在命名空间 QoS 配置中,DSCP 值 24 映射到 光纤通道 100。 -
qosmap --dump-qos:显示配置的 QoS 值及其映射的转发类。例如,在 命名空间 QoS 配置中,EXP 值 6 映射到 光纤通道 100。
QoS 流量行为
传入 QoS 数据包的处理方式如下:忽略关联传入数据包的最后两位 QoS。例如,当转换为二进制时,0x60 的十六进制值为 0110 0000。最后两位被忽略,留下 011000,转换为十进制 24。然后,十进制 24 映射到确定 QoS 实现的 DSCP 值。此映射过程发生在网络中的下游设备之间。