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 的更新方式),当前测试没有覆盖以下场景:
- 更新绑定到 NAT GW 的 QoS Policy 规则(修改
BandwidthLimitRules) - 切换 NAT GW 关联的 QoS Policy 到另一个 QoS Policy
需要我为你添加这些缺失的更新场景吗?
根据代码分析:
defaultQoSCases 与 EIP QoS 的关系
不会直接影响 EIP 的 QoS 配置,但 会影响 EIP 流量的实际限速效果。原因如下:
两种 QoS 的区别
| 属性 | defaultQoSCases (NIC QoS) | eipQoSCases (EIP QoS) |
|---|---|---|
| 绑定对象 | VpcNatGateway | IptablesEIP |
| BindingType | QoSBindingTypeNatGw | QoSBindingTypeEIP |
| Interface | net1(明确指定) | 无(不指定接口) |
| Priority | 3(低优先级) | 1(高优先级) |
| 作用范围 | 所有经过 net1 接口的流量 | 仅针对特定 EIP 的流量 |
流量限速的优先级匹配
从 priorityQoSCases 测试可以看出,QoS 规则按 Priority 值匹配:
Priority 1 (EIP QoS) > Priority 2 (特定 IP QoS) > Priority 3 (NIC 默认 QoS)
实际效果
-
如果 EIP 有自己的 QoS Policy:
- EIP QoS(Priority=1)优先生效
- NIC QoS(Priority=3)被忽略
-
如果 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 是通过在 IptablesEIP 或 VpcNatGateway 的 spec.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.bindingType | EIP 或 NATGW,声明 QoS Policy 的用途 |
spec.shared | true 时可被多个 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, "")