4. Envoy 代理基础:Sidecar 注入原理、xDS 协议、端点发现拓扑
在 Istio 服务网格中,Envoy 代理是数据平面的核心执行单元。理解 Sidecar 的注入机制、xDS 控制协议以及端点发现拓扑,是进行网格拓扑故障排查的前提。本章将深入剖析这三个关键环节,帮助你在实际运维中快速定位代理层面的问题。
4.1 Sidecar 注入原理
Sidecar 注入是将 Envoy 代理容器自动添加到 Pod 中的过程。Istio 支持两种注入模式:手动注入和自动注入。自动注入依赖 Kubernetes 的 MutatingAdmissionWebhook。
4.1.1 注入流程
- Pod 创建请求:用户通过 kubectl 或 API 创建 Pod。
- Webhook 拦截:Kubernetes API Server 将请求发送给 Istiod 的 Sidecar Injector 服务。
- 策略判断:Injector 检查命名空间标签(
istio-injection: enabled)或 Pod 注解(sidecar.istio.io/inject: "true")。 - 生成补丁:若满足条件,Injector 生成 JSON Patch,包含 Envoy 容器、初始化容器(
istio-init)以及 Volume 挂载。 - 返回补丁: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 获取端点信息。
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 层面的端点切片。
当出现流量异常时,按照以下步骤排查:
- 确认 Sidecar 注入:检查 Pod 是否包含
istio-proxy容器。 - 检查 xDS 同步:使用
istioctl proxy-status确认 Envoy 是否收到最新配置。 - 验证端点列表:使用
istioctl proxy-config endpoints对比实际 Pod IP 与预期是否一致。 - 查看健康状态:确认端点是否被标记为
HEALTHY,排除就绪探针失败导致的端点移除。