Shaping和流量路由
1)为什么这一切都是
Shaping and Routing-可管理可用性和可预测潜伏力的基础:- 稳定:我们不让"嘈杂的邻居"堵塞渠道。
- 公平性:Tenant/Class之间的优先事项和配额。
- 效率:将查询发送到处理速度更快/更便宜的位置。
- 变更控制:无风险的金丝雀/重量版本。
- 节省:优化egress/egress驻留和CDN缓存命中。
2)基本概念
2.1 Traffic shaping vs policing
Shaping-通过以目标速度缓冲和发送数据包来对齐流量(消除了"爆炸")。
Policing-"carate"过度(丢弃/标记)而没有缓冲。更硬,但更便宜。
2.2年级,队列和学科
优先级队列(PRIO),WFQ/DRR(公平分配),HTB(分层配额),CoDel/RED(缓冲区斗争),ECN(无底盘拥塞信号)。
在L7上,以RPS/连接符/字节限制和优先池的形式出现"队列"。
2.3限值算法
Token Bucket(rate r中添加了n个令牌;请求"浪费"k令牌)。
Leaky Bucket(固定流出;有利于平滑)。
全球/本地限制:本地-快速,全球-公平(Redis/etcd/per tenant)。
3) QoS在L3/L4
3.1个DSCP/ToS和服务类
按流量类型(交互、后端RPC、后台作业)标记数据包。
在数据中心,将DSCP策略与网络工厂/云协调。
3.2 Linux tc: HTB+fq_codel(草图)
bash
Clearing tc qdisc del dev eth0 root 2 >/dev/null true
Корневая HTB с 1Gbit tc qdisc add dev eth0 root handle 1: htb default 30 tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
Класс latency-critical 200Mbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 200mbit ceil 1gbit prio 0 tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
Класс background 100Mbit tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 1gbit prio 2 tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel
3.3 ECN/RED/BBR
ECN降低了峰值上的滴水;RED/CoDel限制缓冲区。
BBR(代替Cubic)通常会降低p99的潜伏期,尤其是在WAN/重队列之上。
4) L7路由(HTTP/gRPC/WS)
4.1漫游标准
路径/方法('/api/v1/','POST'),标题(客户端版本,幻灯片,金丝雀标记),cookie(A/B,sticky),JWT标签(tenant/role),geo/ASN,时间窗口,负载(outlier检测)。
协议:HTTP/2(多路复用),HTTP/3/QUIC(对数据包丢失的抵抗力),gRPC(bi-di streams),WebSocket(长寿命连接器)。
4.2加权拆分/金丝雀发行
"v1:95%","v2:5%",在"绿色"度量标准下自动提升。
截止:错误/潜在性/业务不变性。
Envoy(草图)
yaml route:
weighted_clusters:
clusters:
- name: svc-v1 weight: 95
- name: svc-v2 weight: 5
Istio
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService spec:
hosts: ["svc"]
http:
- route:
- destination: { host: svc, subset: v1, weight: 95 }
- destination: { host: svc, subset: v2, weight: 5 }
4.3 Sticky会话和consistent hashing
通过Cookie/IP/JWT ID进行会议关联。
针对缓存群集、杂乱无章的服务、门户限制进行一致性抢购。
Nginx
nginx upstream api {
hash $cookie_user_id consistent;
server 10. 0. 0. 1;
server 10. 0. 0. 2;
}
4.4地理和后遗症路由器
边缘上的GeoIP/ASN(CDN/edge)→最近的ROR/区域。
Latency-aware:定期健康样本+RTT测量→流量进入"最快"集群。
4.5 Outlier detection / circuit breaking
删除"不良"实例:最大响应,基本错误/潜伏。
电路断路器:连接限制/RPS/在队列中。
5)在网关/市政厅堆栈级别进行交通转换
5.1 Rate limiting
本地(per-pod):便宜但不公平的跨副本。
全局(Redis/etcd): per-tenant/API密钥公平性。
政策:按路线,按方法,按天数,爆破。
Envoy RLS(草图)
yaml typed_per_filter_config:
envoy. filters. http. ratelimit:
"@type": type. googleapis. com/envoy. extensions. filters. http. ratelimit. v3. RateLimit domain: "api"
rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rate_limit_cluster } }
5.2公平与优先事项
优先池:"side"> "system">"背景"。
DRR/WFQ等效于L7: 按客户端/tenant配额/权重。
5.3过载和保护
上载:超出预算时故障/降级。
Adaptive concurrency: p50/p95/queue-len的限制动态。
Server-side backpressure: 429/503 + Retry-After.
6)eBPF和CNI级别
6.1 Cilium/eBPF
内核中的过滤/路由:上下文卷轴较少,L3-L7策略较薄。
磁悬浮以实现稳定的分布。
Pod-pod QoS的eBPF程序(TC/XDP hooks)。
6.2 Calico/NetworkPolicies
L3/L4访问策略、基本优先级类别、与Kubernetes QoS的集成(Guaranteed/Burstable/BestEffort)。
7) Edge/CDN和API网关
CDN:缓存密钥(query/headers归一化),stale-wile-revalidate,原点保护(rate limit/bot过滤器)。
API网关:身份验证、配额/票价计划(按消费者)、SLA限制、地理路由、API版本。
WAF:在边缘过滤以避免浪费核心CPU。
8)异步总线/流媒体
Kafka/NATS/Pulsar:生产者/生产者配额,击球尺寸限制,通过拉格后压。
事件路由:分期密钥(tenant/idempotency-key),"闪烁"分期以实现均匀性。
Exactly-once ≈"有效一次":交易制作人+等效合成器。
9)Taymauts,retrai,backoff
Taymauts是端到端的:客户端<代理服务(反之亦然)。
Retrai:数量有限,带有指数后退,但没有暴风雨。
在回避中必须具有幂等性;否则-SAGA/赔偿。
Hedged/parallel requests(注意):改善p99、增加总流量。
10)可观察性和SLO
10.1个指标
rate_limit_hits, requests_queued, shed_requests_total, latency_ms{p50,p95,p99}, error_ratio, retry_attempts, outlier_ejections, queue_time_ms.
10.2 Tracing
穿过Correlation-ID;睡觉的原因类型:"retry" shed "throttle" queue"。
Links for retrais/hedges了解对子系统的影响。
10.3 Logi/报告
Drop/Shedding/限速摘要,路线热图。
正义神父的单独面板(公平索引)。
10.4个SLO示例
"p99 ≤ 300毫秒,载荷为95 percentile;shed ≤ 0.1%;error_ratio ≤ 0.5%».
"至少95%的配额在超载时保证给互动类。"
11)配置示例
11.1 Nginx: rate limit+burst+金丝雀拆分
nginx map $http_x_canary $canary { default 0; 1 1; }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
upstream api_v1 { server 10. 0. 0. 1; }
upstream api_v2 { server 10. 0. 0. 2; }
server {
location /api/ {
limit_req zone=perip burst=20 nodelay;
if ($canary) { proxy_pass http://api_v2; break; }
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_pass http://api_v1;
}
}
11.2 Envoy: circuit breaker + outlier detection
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 1000 max_pending_requests: 500 max_requests: 2000 outlier_detection:
consecutive_5xx: 5 interval: 10s max_ejection_percent: 50 base_ejection_time: 30s
11.3 Istio:配额常数(通过标签储备)
yaml apiVersion: security. istio. io/v1 kind: AuthorizationPolicy spec:
selector: { matchLabels: { app: api } }
rules:
- when:
- key: request. headers[x-tenant]
values: ["gold"]
Next - RateLimitPolicy in the limit provider with a large quota pool for "gold."
11.4 Kubernetes QoS hinta
保证关键子集(requests=limits)。
PodPriority&Preemption:关键的垫子会在短缺的情况下取代背景。
Topology Spread Constraints:按区域分布以实现可持续性。
12)反模式
全球眼界限→重要客户虚假的429/taymout。
Retrai没有猛烈的震动/偶然性→风暴。
时空混乱(客户端>服务器)→挂起和"双重工作"。
prod和实验的常见缓存/队列→数据污染。
没有常识的"总是粘稠"→不均匀的负载/热节点。
断开的outlier检测→"烂"实例破坏了本周的指标。
13)实施支票
- 分段流量:类/tenants/路线。
- 设定目标预算:RPS/连接/字节和 p95/p99。
- 启用rate limit(本地+全局)、circuit breaker、outlier检测。
- 根据度量标准调整金丝雀+自动收割机。
- 用指数后方+跳跃器来描述taymauts/retrai。
- 启用ECN/BBR(在可能的情况下)和egress fq_codel/HTB。
- "阴影"和实验的单独池/缓存/队列。
- Dashbords:限制,队列,潜伏期,公平度的度量。
- SLO和runbook: shedding/Back/Inside标准。
14) FAQ
问:选择什么:塑造还是警务?
A:对于自定义路径-shaping(无滴平滑)。对于服务类,"背景"/"bulk"是用于保护关键流的警务。
问:如何避免回避风暴?
答:Jitterized backoff,尝试限制,等效性,服务器提示"Retry-After",全球配额。
Q: sticky还是hashing?
A: Sticky-当用户需要会话/缓存时;hashing-当需要均匀性和稳定性时。
问:HTTP/3/QUIC有什么好处?
答:没有HOL TCP锁,对损失的抵抗力更好,恢复速度更快-显着降低p99/p999尾巴。
15)结果
有效的shaping和L7路由是一套一致的策略:优先级和配额,公平分配,安全限制和智能漫游,并得到可观察性和SLO的支持。按照所描述的做法(HTB/fq_codel/ECN在较低级别和Envoy/Istio/Nginx/eBPF在上层),您将获得可预测的潜伏尾巴,过载抵抗力和受控的安全版本。