3、Istio 服务网格基础:Sidecar 代理、Envoy 数据面、Pilot 控制面、流量管理核心资源

在 Knative 服务网格流量镜像与调试体系中,Istio 是承载流量劫持、路由与镜像的核心基础设施。本章从 Sidecar 代理注入机制、Envoy 数据面工作原理、Pilot 控制面服务发现与配置分发,以及流量管理核心资源(VirtualService、DestinationRule、Gateway)四个维度,建立服务网格的基础认知。

3.1 Sidecar 代理:透明流量劫持与注入机制

Sidecar 模式是 Istio 服务网格的基石。每个业务 Pod 启动时,Istio 通过 MutatingWebhook 自动注入一个 Envoy 代理容器,该代理透明地劫持所有进出 Pod 的流量,实现无侵入的流量管控、可观测性与安全策略。

组件 角色 关键行为
istio-init 容器 初始化 iptables 规则 在 Pod 启动前设置流量重定向规则,将入站/出站流量劫持到 Envoy
Envoy 容器 数据面代理 接收劫持流量,执行路由、负载均衡、熔断、镜像等策略
istio-proxy 进程 Sidecar 主进程 与 Pilot 控制面建立 xDS 连接,动态获取配置更新
注入验证命令: 使用 kubectl describe pod <pod-name> -n <namespace> 查看 Pod 是否包含两个容器(业务容器 + istio-proxy),以及 initContainers 中的 istio-init 容器。

3.2 Envoy 数据面:xDS 协议与动态配置

Envoy 是 Istio 默认的数据面代理,采用 xDS 协议从控制面 Pilot 获取动态配置。xDS 是 Istio 控制面与数据面之间的核心通信协议族,包含 LDS(监听器发现)、RDS(路由发现)、CDS(集群发现)、EDS(端点发现)等子协议。

Envoy 数据面 xDS 配置分发流程 Pilot 控制面 LDS 监听器发现 RDS 路由发现 CDS 集群发现 EDS 端点发现 Envoy Sidecar 代理 业务容器(App) xDS 协议使 Envoy 无需重启即可动态更新路由、集群和端点配置
关键理解: Envoy 通过 xDS 协议从 Pilot 拉取配置,实现监听器、路由、集群、端点的动态更新。在流量镜像场景中,RDS 负责定义镜像路由规则,CDS/EDS 负责定位目标集群与端点。

3.3 Pilot 控制面:服务发现与配置分发

Pilot 是 Istio 控制面的核心组件,负责从平台(Kubernetes)的服务注册中心获取服务信息,并将其转换为 Envoy 可理解的 xDS 配置,然后推送到所有 Sidecar 代理。Pilot 屏蔽了底层平台差异,为数据面提供统一的服务发现与流量管理抽象。

功能模块 职责 与 Knative 的关系
服务注册中心适配器 监听 Kubernetes Service/Endpoint 变化 Knative Service 自动创建 K8s Service,Pilot 感知并生成路由
配置转换引擎 将 VirtualService/DestinationRule 转为 Envoy 配置 流量镜像规则通过 VirtualService 定义,Pilot 转换为 RDS 配置
xDS 推送器 通过 gRPC 流推送配置到所有 Envoy 配置变更后秒级生效,支持灰度发布与流量镜像

3.4 流量管理核心资源

Istio 通过三个核心 CRD(自定义资源)实现精细化的流量管理:VirtualService 定义路由规则,DestinationRule 定义目标子集与负载均衡策略,Gateway 定义南北向流量入口。三者配合使用,构成 Istio 流量管理的完整骨架。

3.4.1 VirtualService:路由规则定义

VirtualService 是流量管理的核心资源,它定义了一组路由规则,决定流量如何匹配并转发到目标服务。在 Knative 流量镜像场景中,VirtualService 的 mirror 字段是核心配置入口。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: knative-service-vs
  namespace: default
spec:
  hosts:
  - my-service.default.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: my-service.default.svc.cluster.local
        subset: v1
      weight: 100
    mirror:
      host: my-service-mirror.default.svc.cluster.local
      subset: v2
    mirrorPercentage:
      value: 50.0
注意: mirrorPercentage 字段控制镜像流量的百分比,取值范围 0.0 ~ 100.0。在 Knative 场景中,镜像目标必须是一个独立的 Knative Service 或 Revision,避免镜像流量干扰主链路。

3.4.2 DestinationRule:目标子集与策略

DestinationRule 定义服务的子集(subset)划分以及流量策略(负载均衡、连接池、熔断等)。子集通常基于标签选择器(如 version: v1、version: v2)划分,供 VirtualService 引用。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    connectionPool:
      tcp:
        maxConnections: 100
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

3.4.3 Gateway:南北向流量入口

Gateway 管理进入网格的南北向流量(Ingress Gateway)和离开网格的流量(Egress Gateway)。在 Knative 中,通常使用 Istio Ingress Gateway 作为外部请求的统一入口,Gateway 与 VirtualService 绑定后,外部流量才能进入 Knative Service。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: knative-gateway
  namespace: knative-serving
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

3.5 核心资源关系与流量路径

Gateway、VirtualService、DestinationRule 三者形成从入口到目标服务的完整流量路径。Gateway 接收外部请求,VirtualService 定义路由与镜像规则,DestinationRule 提供子集划分与流量策略。

Istio 流量管理核心资源关系 Gateway VirtualService DestinationRule 定义入口与端口 定义路由与镜像规则 定义子集与策略 流量路径:外部请求 → Gateway → VirtualService → DestinationRule → 目标 Pod 在 Knative 流量镜像中,VirtualService 的 mirror 字段指向镜像目标,DestinationRule 定义主版本与镜像版本的子集
实践要点:
  • VirtualService 的 mirror 字段仅复制请求,不等待镜像响应,主链路无感知。
  • DestinationRule 的 subsets 必须与 Knative Revision 的标签对齐,否则镜像流量无法到达目标。
  • Gateway 的 hosts 字段在 Knative 中通常配置为通配符 "*",由 Knative 自身的 VirtualService 做进一步路由。

3.6 本章小结

Istio 服务网格通过 Sidecar 代理实现透明流量劫持,Envoy 数据面基于 xDS 协议动态接收 Pilot 控制面下发的配置,VirtualService、DestinationRule、Gateway 三个核心资源共同构建了从入口到目标服务的完整流量管理链路。理解这些基础组件与资源,是后续配置 Knative 流量镜像与调试的前提。