2. Istio 核心概念回顾:VirtualService、DestinationRule、Gateway、Sidecar 原理

在深入 VS 快照与回滚护栏 之前,必须对齐 Istio 数据面与控制面的四个核心抽象。这些资源共同定义了流量如何进入网格、如何路由、如何负载均衡,以及 Sidecar 代理如何工作。理解它们之间的协作关系,是后续演练回退策略的基础。

核心认知: VirtualService 定义“路由逻辑”,DestinationRule 定义“目标策略”,Gateway 定义“入口边界”,Sidecar 定义“代理范围”。四者缺一不可。

2.1 四类资源的关系全景

下面的 SVG 展示了四类资源在 Istio 控制面与数据面之间的协作流程。请求从外部或内部发起,经过 Gateway 或直接进入 Sidecar,由 VirtualService 匹配规则并转发到 DestinationRule 定义的子集,最终到达 Pod。

Istio 核心资源协作关系图 Istio 核心资源协作关系 控制面 (istiod) VirtualService DestinationRule Gateway Sidecar 数据面 (Envoy Proxy) Sidecar (入站) 监听 15006 Sidecar (出站) 监听 15001 Gateway Proxy 监听 80/443 说明: istiod 将 VirtualService/DestinationRule/Gateway/Sidecar 配置转换为 Envoy 的 xDS 协议下发。 Sidecar 资源控制每个代理的监听端口和服务可见范围,是精细化隔离的关键。

2.2 VirtualService — 流量路由的核心

VirtualService 定义了如何将请求路由到特定版本或子集。它通过匹配 HTTP 头、URI、权重等条件,将流量分发到 DestinationRule 中定义的 subset。

字段 作用 典型值
hosts 匹配的目标服务名 reviews、reviews.default.svc.cluster.local
http HTTP 路由规则列表 match + route + rewrite
match 请求匹配条件 uri.prefix: /api、headers
route 目标子集与权重 destination.subset: v2、weight: 80
关键点: VirtualService 本身不定义目标 Pod 的版本标签;它引用 DestinationRule 中定义的 subset 名称。这种解耦使得路由策略与版本定义可以独立变更。

2.3 DestinationRule — 目标子集与负载均衡

DestinationRule 定义了服务的子集(subset)划分、负载均衡策略、连接池大小以及TLS 设置。它是 VirtualService 路由的“落地”配置。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews-dr
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    connectionPool:
      tcp:
        maxConnections: 100
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
配置项 说明 回滚关注点
subsets 基于标签划分版本子集 子集名称变更会导致 VS 路由失效
trafficPolicy.loadBalancer 负载均衡算法 切换算法可能影响流量分布
trafficPolicy.tls 服务间 mTLS 模式 误关闭 mTLS 会导致连接失败

2.4 Gateway — 网格入口边界

Gateway 管理南北向流量,即从网格外部进入的请求。它配置在网格边缘,通常与 VirtualService 绑定,决定哪些外部请求可以进入内部服务。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "bookinfo.example.com"
回滚陷阱: 如果 Gateway 的 selector 指向了错误的 ingressgateway Pod 标签,或者 hosts 配置了不存在的域名,整个入口流量将中断。回滚演练中必须验证 Gateway 的 selector 与 ingressgateway 的标签匹配。

2.5 Sidecar — 代理范围与隔离

Sidecar 资源控制每个 Envoy 代理的监听端口、可访问的服务范围以及流量捕获模式。默认情况下,每个 Pod 中的 Sidecar 会监听所有端口并转发所有流量;通过 Sidecar 资源可以精细化限制。

字段 默认行为 自定义后效果
workloadSelector 匹配命名空间下所有 Pod 只匹配特定标签的 Pod
ingress 监听所有端口 (15006) 只监听指定端口,减少攻击面
egress 允许访问所有服务 只允许访问指定 host,实现微隔离
回滚关联: 在 VS 快照回滚场景中,如果 Sidecar 资源限制了 egress 范围,而回滚后的 VirtualService 引用了被限制的服务,流量将被拒绝。因此回滚前必须检查 Sidecar 的 egress 配置是否覆盖目标服务。

2.6 四类资源在回滚场景中的依赖关系

下面的 SVG 聚焦于回滚操作时四类资源的依赖链,帮助理解为什么修改 VirtualService 后需要同时检查 DestinationRule 和 Sidecar 的状态。

回滚场景资源依赖链 回滚场景资源依赖链 Gateway VirtualService DestinationRule Sidecar 回滚检查清单: 1. Gateway 的 host 是否匹配 VS 的 host? 2. VS 引用的 subset 是否在 DR 中存在? 3. Sidecar 的 egress 是否允许访问目标服务? 4. 回滚后的配置是否与现有 Sidecar 冲突?

2.7 小结:回滚演练前的知识准备

  • VirtualService 是回滚操作的主要对象,快照保存的是它的完整 YAML。
  • DestinationRule 必须与 VS 的 subset 定义保持一致,否则回滚后路由失效。
  • Gateway 的 host 和 selector 决定了外部流量能否进入,回滚后需验证入口连通性。
  • Sidecar 的 egress 范围决定了回滚后的服务能否访问下游依赖,是常被忽略的“隐形护栏”。