理解 Istio 与 Envoy 的服务网格架构
Istio 的服务网格架构明确划分为控制平面与数据平面。控制平面由 istiod 组件构成,负责服务发现、策略配置下发以及 mTLS 证书的生命周期管理;数据平面则由部署在每个业务 Pod 中的 Envoy 代理承担,负责实际的流量拦截、转发与遥测数据采集。当应用发起请求时,流量首先被 iptables 规则透明劫持至同 Pod 内的 Envoy Sidecar,Envoy 根据控制平面下发的 Listener 和 Cluster 配置进行路由决策,再将请求转发至目标服务。需要特别注意,Istio 并不替代 Kubernetes Service,而是通过监听 K8s API Server 获取 Service 与 Endpoint 信息,结合 CoreDNS 完成服务发现。Envoy 作为独立的高性能代理,与 K8s Service 的 kube-proxy 机制解耦,实现了更细粒度的七层流量治理。理解这一分层架构,是避免将 Istio 配置、Envoy 代理与原生 K8s 网络混淆的前提。
在 Kubernetes 中安装 Istio 并注入 Envoy Sidecar
在 Kubernetes 集群中部署 Istio 通常使用 istioctl install 命令,推荐采用 demo 或 default 配置文件完成基础组件安装。安装完成后,需为目标命名空间添加 istio-injection=enabled 标签以启用自动注入:kubectl label namespace default istio-injection=enabled。随后部署示例应用,Istio 的 Webhook 拦截器会在 Pod 创建时自动将 istio-proxy 容器注入到 Pod 定义中。可通过 kubectl get pod

配置 Envoy 流量治理与服务间通信
Istio 通过 VirtualService 和 DestinationRule 驱动 Envoy 实现精细化的流量治理。VirtualService 定义路由规则,如匹配特定 Header 或路径将流量导向不同版本;DestinationRule 则定义目标服务的负载均衡策略、连接池及流量策略(如超时、重试)。例如,为 reviews 服务配置灰度发布:创建 DestinationRule 划分 v1 和 v2 子集,再通过 VirtualService 设置 weight: 90 指向 v1,weight: 10 指向 v2。配置生效后,Envoy 会动态更新路由表,无需重启应用即可实现按比例分流。同时,可在 VirtualService 中声明 timeout: 3s 和 retries: { attempts: 3 },Envoy 将在代理层自动拦截慢请求并重试,显著提升系统韧性。通过 istioctl analyze 和 kubectl logs 可观察配置下发后的实际流量路径变化,验证路由是否按预期生效。

启用 mTLS 并验证 Istio 安全能力
Istio 的安全能力核心在于自动化的 mTLS 通信。istiod 内置 CA 负责为每个 Envoy Sidecar 签发短期 X.509 证书,并定期轮换。Envoy 在建立出站连接时自动携带客户端证书,并在入站时验证对端证书,实现服务间双向加密。通过创建 PeerAuthentication 资源可控制 mTLS 模式:mode: PERMISSIVE 允许明文与加密流量共存,便于平滑迁移;mode: STRICT 则强制拒绝所有未加密请求。验证 mTLS 是否生效,可使用 istioctl proxy-config listener

验证、排障与常见避坑
建立标准化的验证与排障流程是保障网格稳定运行的关键。首先执行 kubectl get pods 确认 Sidecar 注入成功,接着使用 istioctl proxy-status 检查 Envoy 配置同步状态,并通过 istioctl proxy-config route 验证路由表。若出现 503 或连接失败,优先检查 VirtualService 与 DestinationRule 是否匹配,以及目标 Pod 的 READY 状态。常见避坑点包括:Sidecar 默认占用约 100-200m CPU 和 128Mi 内存,需合理设置资源配额;K8s Service 端口未正确声明协议(如 appProtocol: http),会导致 Envoy 错误解析七层流量;外部服务未通过 ServiceEntry 注册,将被 Sidecar 拦截并丢弃;Sidecar 作用域默认拦截所有端口,可通过 traffic.sidecar.istio.io/includeInboundPorts 注解精确控制。结合 istioctl analyze 与 Envoy 管理端口(localhost:15000)的 /config_dump 接口,可逐层定位至网络、路由或应用层问题。


