kubeovn vpc-nat-gw 相关 qos

6 阅读3分钟

iptables-eip-qos-conformance-e2e 测试包含 两种 QoS 更新场景

QoS 更新场景总结

1. EIP QoS 更新 (eipQoSCases 函数)

在 "eip qos" 测试用例中,包含以下更新场景:

步骤操作描述
1创建 QoS Policy创建 eipLimit (10 Mbps) 的 QoS
2更新 QoS Policy 规则将同一 QoS Policy 的限速从 eipLimit 更新到 updatedEIPLimit (15 Mbps)
3重建 NAT GW Pod验证 QoS 在 Pod 重建后依然生效
4切换 QoS Policy创建新的 QoS Policy (newEIPLimit = 20 Mbps),将 EIP 关联的 QoS Policy 切换为新的
5移除 QoS Policy从 EIP 移除 QoS Policy

2. NAT GW (NIC) QoS 更新 (defaultQoSCases 函数)

在 "default nic qos" 测试用例中:

步骤操作描述
1创建 QoS Policy绑定到 NAT GW 的 net1 接口
2重建 NAT GW Pod验证 QoS 在 Pod 重建后依然生效
3移除 QoS Policy从 NAT GW 移除 QoS Policy

注意: defaultQoSCases 没有 更新 QoS Policy 规则 的场景(只有绑定/解绑)。


缺失的更新场景

如果你需要测试 NAT GW QoS 的更新(类似 EIP QoS 的更新方式),当前测试没有覆盖以下场景:

  1. 更新绑定到 NAT GW 的 QoS Policy 规则(修改 BandwidthLimitRules
  2. 切换 NAT GW 关联的 QoS Policy 到另一个 QoS Policy

需要我为你添加这些缺失的更新场景吗?

读取 ,行 280 到 355

根据代码分析:

defaultQoSCases 与 EIP QoS 的关系

不会直接影响 EIP 的 QoS 配置,但 会影响 EIP 流量的实际限速效果。原因如下:

两种 QoS 的区别

属性defaultQoSCases (NIC QoS)eipQoSCases (EIP QoS)
绑定对象VpcNatGatewayIptablesEIP
BindingTypeQoSBindingTypeNatGwQoSBindingTypeEIP
Interfacenet1(明确指定)无(不指定接口)
Priority3(低优先级)1(高优先级)
作用范围所有经过 net1 接口的流量仅针对特定 EIP 的流量

流量限速的优先级匹配

priorityQoSCases 测试可以看出,QoS 规则按 Priority 值匹配:

Priority 1 (EIP QoS) > Priority 2 (特定 IP QoS) > Priority 3 (NIC 默认 QoS)

实际效果

  1. 如果 EIP 有自己的 QoS Policy

    • EIP QoS(Priority=1)优先生效
    • NIC QoS(Priority=3)被忽略
  2. 如果 EIP 没有 QoS Policy

    • NIC QoS(Priority=3)会对所有经过 net1 的流量生效
    • 包括 EIP 的流量

总结

defaultQoSCases 测试的是 NAT GW 网卡级别的 QoS,它:

  • 不会修改 EIP CR 的 QoS 配置
  • 会影响 EIP 流量的实际限速(当 EIP 没有独立 QoS 时,NIC QoS 作为兜底策略生效)

这就是为什么 priorityQoSCases 测试中会验证:当移除 EIP QoS 后,流量会匹配到 NIC QoS 规则。

搜索正则表达式 QoSPolicy.*Spec (**/pkg/apis/**),6 个结果

读取

搜索正则表达式 QoSPolicy.*string (**/pkg/apis/**),8 个结果

读取

读取

QoS Policy 绑定机制

QoS Policy 是通过在 IptablesEIPVpcNatGatewayspec.qosPolicy 字段指定 QoS Policy 的名称来绑定的。

绑定方式

                    ┌─────────────────────┐
                        QoSPolicy CR     
                       (qos-policies)    
                                         
                     spec:               
                       bindingType: EIP     声明类型
                        NATGW          
                       bandwidthLimit... 
                    └─────────────────────┘
                              
                               通过名称引用
           ┌──────────────────┴──────────────────┐
                                                
                                                
┌──────────┴───────────┐           ┌─────────────┴──────────┐
   IptablesEIP CR                   VpcNatGateway CR     
   (iptables-eips)                  (vpc-nat-gateways)   
                                                         
 spec:                            spec:                  
   qosPolicy: "xxx"    ◄─────       qosPolicy: "yyy"     
   natGwDp: "gw-xxx"                vpc: "vpc-xxx"       
   ...                              ...                  
└──────────────────────┘           └────────────────────────┘

1. 绑定到 EIP

apiVersion: kubeovn.io/v1
kind: IptablesEIP
metadata:
  name: my-eip
spec:
  natGwDp: "vpc-nat-gw-1"        # 关联的 NAT GW
  qosPolicy: "eip-qos-policy"    # ← 绑定 QoS Policy 名称
  externalSubnet: "external-net"

2. 绑定到 VPC NAT Gateway

apiVersion: kubeovn.io/v1
kind: VpcNatGateway
metadata:
  name: vpc-nat-gw-1
spec:
  vpc: "custom-vpc"
  subnet: "overlay-subnet"
  externalSubnets:
    - "external-network"
  lanIp: "10.0.0.254"
  qosPolicy: "natgw-qos-policy"  # ← 绑定 QoS Policy 名称

QoS Policy 定义

apiVersion: kubeovn.io/v1
kind: QoSPolicy
metadata:
  name: eip-qos-policy
spec:
  bindingType: EIP       # EIP 或 NATGW
  shared: false          # 是否可被多个资源共享
  bandwidthLimitRules:
    - name: "eip-ingress"
      rateMax: "10"       # Mbps
      burstMax: "10"
      priority: 1
      direction: ingress
    - name: "eip-egress"
      rateMax: "10"
      burstMax: "10"
      priority: 1
      direction: egress

关键字段说明

字段说明
spec.bindingTypeEIPNATGW,声明 QoS Policy 的用途
spec.sharedtrue 时可被多个 EIP/NatGW 使用
spec.bandwidthLimitRules[].interface指定接口(如 net1),EIP QoS 通常不指定
spec.bandwidthLimitRules[].priority优先级,数字越小优先级越高

在测试中的用法

// 创建 QoS Policy
qosPolicy := framework.MakeQoSPolicy(qosPolicyName, false, apiv1.QoSBindingTypeEIP, rules)
qosPolicyClient.CreateSync(qosPolicy)

// 绑定到 EIP
eipClient.PatchQoSPolicySync(eipName, qosPolicyName)

// 绑定到 NAT GW
vpcNatGwClient.PatchQoSPolicySync(natgwName, qosPolicyName)

// 解绑(设置为空字符串)
eipClient.PatchQoSPolicySync(eipName, "")