⏱️ 阅读时间:4 分钟
🎯 核心话题:配置结构、匹配规则 (Match)、路由权重 (Weight)、治理策略
🧩 适用场景:编写 YAML、配置灰度发布、设置超时重试
🃏 卡片 1:配置骨架概览
一个完整的 VirtualService 配置,其结构就像搭建一个多层汉堡,每一层都有其特定作用:
spec:
hosts: # 1. 目标服务是谁?
- reviews.prod.svc.cluster.local
gateways: # 2. 规则在哪生效?
- my-gateway
http: # 3. 流量怎么走?(核心逻辑)
- match: ...
route: ...
- hosts: 指定规则应用的目标服务。建议始终使用 FQDN (全限定域名),也支持
* 通配符。
- gateways:
mesh (默认): 规则仅在 Service Mesh 内部生效。
<gateway-name>: 规则仅在指定的 Ingress 网关生效。
- 两者都写:规则在网格内部和网关双重生效。
🃏 卡片 2:Match 匹配机制 (避坑必读)
Istio 的匹配逻辑遵循 “从上到下,一击即中” 的原则。这意味着流量会按顺序尝试匹配 match 规则,一旦命中第一条,便会执行对应的路由,后续规则将被忽略。
⚠️ 配置黄金法则:
务必先写精确匹配 (Specific),后写泛化匹配 (General)。
如果顺序颠倒,前面的宽泛规则会“吞噬”掉所有流量,导致后面的细粒度规则永远无法生效。
http:
- match:
- uri: { exact: /login } # ✅ 精确匹配/login的路径放前面
route: ...
- match:
- uri: { prefix: / } # ✅ 匹配所有路径的兜底规则放最后
route: ...
🃏 卡片 3:Route 路由目标与权重
route 字段决定了流量最终的去向,是实现流量管理(如金丝雀发布)的核心。
- destination: 定义目标服务。
host: 服务的目标 FQDN。
subset: 子集/版本 (⚠️ 注意:此 subset 必须先在 DestinationRule 资源中定义)。
- weight: 流量权重,取值范围 0-100。
💡 如何配置金丝雀发布?
route:
- destination: { host: reviews.prod.svc.cluster.local, subset: v1 }
weight: 90 # 90% 的流量流向老版本 v1
- destination: { host: reviews.prod.svc.cluster.local, subset: v2 }
weight: 10 # 10% 的流量流向新版本 v2
通过在 Service Mesh 中灵活运用 VirtualService,你可以轻松实现无代码侵入的流量切分与灰度发布。
🃏 卡片 4:请求修改 (Rewrite/Redirect)
在转发流量前,VirtualService 还允许你对请求本身进行修改:
- Rewrite (重写): 在代理层内部修改请求的路径等信息,客户端对此无感知。
- 典型场景:对外暴露的 API 路径为
/api/v1/users,通过重写将其内部转发到服务的 /v1/users 路径。
- Redirect (重定向): 返回 301 或 302 状态码,指示客户端重新向新地址发起请求。
- 典型场景:实现 HTTP 到 HTTPS 的强制跳转,或旧版 API 接口的迁移引导。
🃏 卡片 5:内置治理策略
VirtualService 的强大之处在于,你可以直接在路由规则中嵌入弹性能力配置,而无需修改应用代码:
- ⏳ 超时 (Timeout):
timeout: 5s (请求超过5秒未响应则直接返回 504 错误)。
- 🔄 重试 (Retries):
retries:
attempts: 3 # 最多重试 3 次
perTryTimeout: 2s # 每次重试尝试等待 2 秒
retryOn: connect-failure,503 # 在连接失败或返回503状态码时触发重试
- 💉 故障注入 (Fault): 请仅在测试环境使用! 用于模拟上游服务故障。
fault:
delay: { percentage: { value: 10 }, fixedDelay: 5s } # 对10%的请求注入5秒延迟
掌握这些配置项,你就能在 云原生 架构中,通过声明式配置高效地管理服务间的通信、提升应用韧性。
本文内容梳理自笔者的技术专栏,更多深入的 云原生 与实践案例,欢迎在 云栈社区 交流探讨。
|