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(端点发现)等子协议。
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 提供子集划分与流量策略。
- VirtualService 的
mirror字段仅复制请求,不等待镜像响应,主链路无感知。 - DestinationRule 的
subsets必须与 Knative Revision 的标签对齐,否则镜像流量无法到达目标。 - Gateway 的
hosts字段在 Knative 中通常配置为通配符"*",由 Knative 自身的 VirtualService 做进一步路由。
3.6 本章小结
Istio 服务网格通过 Sidecar 代理实现透明流量劫持,Envoy 数据面基于 xDS 协议动态接收 Pilot 控制面下发的配置,VirtualService、DestinationRule、Gateway 三个核心资源共同构建了从入口到目标服务的完整流量管理链路。理解这些基础组件与资源,是后续配置 Knative 流量镜像与调试的前提。