4. Envoy 代理基础:Sidecar 注入原理、xDS 协议、端点发现拓扑

在 Istio 服务网格中,Envoy 代理是数据平面的核心执行单元。理解 Sidecar 的注入机制、xDS 控制协议以及端点发现拓扑,是进行网格拓扑故障排查的前提。本章将深入剖析这三个关键环节,帮助你在实际运维中快速定位代理层面的问题。

4.1 Sidecar 注入原理

Sidecar 注入是将 Envoy 代理容器自动添加到 Pod 中的过程。Istio 支持两种注入模式:手动注入和自动注入。自动注入依赖 Kubernetes 的 MutatingAdmissionWebhook。

4.1.1 注入流程

  1. Pod 创建请求:用户通过 kubectl 或 API 创建 Pod。
  2. Webhook 拦截:Kubernetes API Server 将请求发送给 Istiod 的 Sidecar Injector 服务。
  3. 策略判断:Injector 检查命名空间标签(istio-injection: enabled)或 Pod 注解(sidecar.istio.io/inject: "true")。
  4. 生成补丁:若满足条件,Injector 生成 JSON Patch,包含 Envoy 容器、初始化容器(istio-init)以及 Volume 挂载。
  5. 返回补丁:API Server 应用补丁,创建包含 Sidecar 的 Pod。
故障排查要点: 如果 Pod 未注入 Sidecar,首先检查命名空间标签和 Pod 注解是否正确;其次查看 Istiod 的 Injector 日志(istio-proxy 容器日志)确认 Webhook 是否被正确调用。

4.1.2 注入内容对比

组件 容器名称 作用 常见故障
Envoy 代理 istio-proxy 处理所有进出 Pod 的流量,执行路由、负载均衡、策略 启动失败、OOM、证书过期
初始化容器 istio-init 配置 iptables 规则,将流量重定向到 Envoy 权限不足(需 NET_ADMIN)、镜像拉取失败
Volume 挂载 istio-envoy (emptyDir) 存放 Envoy 的配置文件、证书和运行时数据 磁盘空间不足、权限错误

4.2 xDS 协议详解

xDS 是 Envoy 动态获取配置的协议族,Istiod 作为控制平面通过 xDS 向所有 Sidecar 下发配置。xDS 是“X Discovery Service”的缩写,X 代表不同的配置类型。

4.2.1 核心 xDS 类型

协议 全称 配置内容 故障排查场景
LDS Listener Discovery Service 监听器(端口、协议、过滤器链) 端口未监听、协议不匹配
RDS Route Discovery Service 路由规则(虚拟主机、匹配条件、目标集群) 路由不生效、流量转发错误
CDS Cluster Discovery Service 集群定义(上游服务、连接池、负载均衡策略) 集群未找到、连接池耗尽
EDS Endpoint Discovery Service 端点列表(Pod IP、端口、健康状态) 端点缺失、端点不健康
SDS Secret Discovery Service TLS 证书、私钥 证书过期、mTLS 握手失败

4.2.2 xDS 通信流程

Envoy 启动后,首先向 Istiod 发起 StreamAggregatedResources gRPC 流。Istiod 按顺序推送 LDS → RDS → CDS → EDS。Envoy 收到配置后,应用并回复 ACK/NACK。NACK 通常意味着配置校验失败,是排查配置错误的关键信号。

常见 NACK 原因: 路由规则引用了不存在的集群、监听器端口冲突、TLS 证书格式错误。排查时,查看 Envoy 的 /config_dump 接口和 Istiod 的 istio-proxy 日志中的 NACK 关键字。

4.3 端点发现拓扑

端点发现是网格拓扑中最动态的部分。Envoy 通过 EDS 实时获取后端服务的可用 Pod 列表。理解端点发现拓扑,有助于排查流量分发不均、服务不可达等问题。

4.3.1 端点发现流程

  • Kubernetes EndpointSlice:Istiod 监听 Kubernetes 的 EndpointSlice 资源,获取 Service 对应的 Pod IP 和端口。
  • 健康检查:Istiod 结合 Pod 的就绪探针(Readiness Probe)和 Istio 的主动健康检查,标记端点状态。
  • EDS 推送:Istiod 将端点列表通过 EDS 推送给所有需要访问该服务的 Envoy。
  • Envoy 负载均衡:Envoy 根据配置的负载均衡算法(如 ROUND_ROBIN、LEAST_REQUEST)将请求分发到端点。

4.3.2 端点发现拓扑图

下图展示了从 Service 到 Pod 的端点发现拓扑,以及 Envoy 如何通过 EDS 获取端点信息。

端点发现拓扑图 端点发现拓扑图 Kubernetes API Server EndpointSlice Istiod (控制平面) Envoy Sidecar Pod A v1 Pod B v1 Pod C v2 EDS 推送 说明: Istiod 监听 EndpointSlice 变化,通过 EDS 将端点列表推送给 Envoy。Envoy 根据负载均衡策略将请求分发到不同的 Pod。

4.4 故障排查实战要点

排查命令速查:
  • istioctl proxy-status:查看所有 Sidecar 与 Istiod 的 xDS 同步状态。
  • istioctl proxy-config endpoints <pod-name>.<namespace>:查看指定 Envoy 的端点信息。
  • istioctl proxy-config clusters <pod-name>.<namespace>:查看集群配置,确认端点是否被正确关联。
  • kubectl get endpointslices -n <namespace>:查看 Kubernetes 层面的端点切片。

当出现流量异常时,按照以下步骤排查:

  1. 确认 Sidecar 注入:检查 Pod 是否包含 istio-proxy 容器。
  2. 检查 xDS 同步:使用 istioctl proxy-status 确认 Envoy 是否收到最新配置。
  3. 验证端点列表:使用 istioctl proxy-config endpoints 对比实际 Pod IP 与预期是否一致。
  4. 查看健康状态:确认端点是否被标记为 HEALTHY,排除就绪探针失败导致的端点移除。