Shadow:隔离副作用的流量镜像

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
API Application Programming Interface 应用程序编程接口
DNS Domain Name System 域名系统
HTTP Hypertext Transfer Protocol 超文本传输协议
ID Identifier 标识符
PII Personally Identifiable Information 个人可识别信息
SA Service Account 服务账号,供程序或工作负载使用的身份

前置:共享基线。镜像请求的响应不返回用户,但候选应用仍真实执行请求。只读 GET 也可能更新缓存、发送审计事件;不能只凭 HTTP 方法判定安全。

1. 先隔离 shadow 环境#

从基线 release.json 复制候选 Deployment/Service,改名 orders-shadow、独占 release_track: shadow。使用新 SA orders-shadow,仅授予影子数据库只读权限;Secret 替换为 orders-shadow-runtime,连接脱敏数据库/缓存和独立队列。移除生产云身份映射。NetworkPolicy 出口仅允许 DNS、影子依赖、监控,支付/邮件出口拒绝;不能仅依赖 SHADOW_MODE=true。

按基线 apply、等待 Ready;从真实镜像请求确认影子服务能读数据,试写必须被数据库拒绝,调用外部支付必须失败。业务 token、PII、cookie 不能直接复制到较低信任环境;本实验仅镜像已脱敏的预生产测试租户。

2. 配置精确路径镜像#

复制 route-stable.yaml 为 route-shadow.yaml,替换 spec.rules。确认真实服务的 /api/catalog 是已审查的只读接口;若没有,改成实际安全接口。

rules:
  - matches:
      - method: GET
        path: {type: Exact, value: /api/catalog}
    filters:
      - type: RequestMirror
        requestMirror:
          backendRef: {name: orders-shadow, port: 80}
    backendRefs: [{name: orders-stable, port: 80}]
  - backendRefs: [{name: orders-stable, port: 80}]
kubectl apply --dry-run=server -f route-shadow.yaml
kubectl apply -f route-shadow.yaml
kubectl -n orders get httproute orders-release -o yaml
curl --fail-with-body "$BASE_URL/api/catalog"

这里镜像匹配路径的全部请求,先控制测试流量和容量;不假设镜像有可靠投递保证。若需百分比采样,先检查选定 Gateway API/实现的 RequestMirror 扩展支持。

3. 结果与恢复#

使用 request ID 关联 stable/shadow 日志,离线比对响应摘要、业务字段、耗时;网关不会自动帮你比较两份响应。去除时间戳等非确定字段,规定容许差异。验证 POST/支付路径从未进入 shadow,影子故障不改变用户响应且未拖垮入口。

恢复 kubectl apply -f route-stable.yaml,确认镜像计数停止,再删除 shadow 资源及临时数据。保留差异报告和拒绝写入证据。

参考:Envoy Gateway mirroring。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭