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在上層),您將獲得可預測的潛伏尾巴,過載抵抗力和受控的安全版本。