Canary:真实流量权重与失败门禁
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| CI | Continuous Integration | 持续集成 |
| HPA | Horizontal Pod Autoscaler | Pod 水平自动扩缩容器 |
前置:共享基线。本实验采用 Gateway API 权重和明确的人工/CI 门禁,不是自动回滚控制器;基础蓝绿自动控制器见 Argo Rollouts。Gateway 权重是请求分流期望,长连接、粘性会话和低样本会偏离。
1. 只让 1% 请求进入候选版#
保存下面脚本为 weight.sh,在包含 route-stable.yaml、gate.py 的目录运行。此脚本仅适用于基线的一条 rules、两项 backendRefs;其他策略实验结束后先恢复基线路由。
#!/usr/bin/env bash
set -euo pipefail
weight=${1:?usage: weight.sh 1..100}
[[ "$weight" =~ ^[0-9]+$ ]] && ((weight >= 1 && weight <= 100))
patch=$(python3 - "$weight" <<'PYCODE'
import json,sys
n=int(sys.argv[1])
print(json.dumps([{'op':'replace','path':'/spec/rules/0/backendRefs/0/weight','value':100-n},
{'op':'replace','path':'/spec/rules/0/backendRefs/1/weight','value':n}]))
PYCODE
)
kubectl -n orders patch httproute orders-release --type=json -p "$patch"
kubectl -n orders get httproute orders-release -o yamlbash weight.sh 1确认 Route 当前状态有效、日志实际命中 candidate。持续运行业务负载,等待完整 10 分钟窗口;低流量延长观测,不降低最小样本到零。确认 stable 的错误率未恶化,排除共享数据库故障。
2. 每一档单独审批推进#
# 每一档至少等待完整指标窗口,业务测试也必须成功。
if ! python3 gate.py; then
kubectl apply -f route-stable.yaml
exit 1
fi
bash weight.sh 5按同样顺序推进 5→25→50→100;每次都重新等待窗口、检查真实版本分布、执行门禁和订单对账。100% 后继续观测至少一个业务峰值窗口,才把 candidate digest 作为新的 stable。1% 时也保持候选版足够副本,避免请求集中导致错误结论;HPA 分别管理,最低容量不能为零。
3. 故障演练与验收#
预生产候选版通过应用故障开关制造受控 5xx,禁止影响 stable。验证 gate 非零退出,再执行:
kubectl apply -f route-stable.yaml
kubectl -n orders get httproute orders-release -o yaml确认新请求回 stable、在途请求排空、没有重复扣款/丢消息,记录恢复耗时。门禁服务故障也停止晋级。CI 被取消/进程崩溃不会触发上面 if:生产另设独立超时看门狗,超时恢复 stable,并给值班告警;未实现前保持有人值守。
参考:Gateway API 流量拆分。