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 资源及临时数据。保留差异报告和拒绝写入证据。