3、Istio 核心概念:数据平面与控制平面,Envoy 代理,Istiod 组件,流量管理模型

好,咱们今天聊聊 Istio 的核心概念。说实话,刚接触 Service Mesh 那会儿,我也被一堆术语搞得头晕。什么数据平面、控制平面,听着就高大上。但说白了,它就是一套帮你管理微服务通信的「交通系统」。

我个人习惯把 Istio 拆成两大部分来看:一个是干活的,一个是管事的。干活的叫数据平面,管事的叫控制平面。咱们一个一个说。

数据平面 vs 控制平面

数据平面,其实就是一组智能代理。在 Istio 里,这些代理就是 Envoy。它们以 Sidecar 的形式跟你的业务容器跑在同一个 Pod 里。每个请求进来,都得先经过 Envoy 再转发到业务容器。你想想看,这样一来,所有流量都在 Envoy 的掌控之下。

我在项目中遇到过一个问题:业务团队抱怨延迟增加了。排查了半天,发现是 Envoy 的默认配置没调优。嗯,这里要注意,Envoy 虽然强大,但默认配置不一定适合你的场景。

控制平面,就是负责下发指令的大脑。在 Istio 1.5 之后,控制平面被整合成了一个组件——Istiod。它负责管理证书、下发配置、收集指标。说白了,你写的那些 YAML 文件,最终都是交给 Istiod 去解析,然后转换成 Envoy 能理解的配置。

核心关系:

  • 数据平面:执行策略,处理流量
  • 控制平面:制定策略,下发配置
  • 两者通过 xDS 协议通信
控制平面 Istiod 组件 数据平面 Pod 1 业务容器 Envoy 代理 Pod 2 业务容器 Envoy 代理 xDS 协议 xDS 协议 流量

Envoy 代理:数据平面的核心

Envoy 是 Istio 数据平面的默认代理。它不是 Istio 独有的,但 Istio 把它用到了极致。Envoy 是用 C++ 写的,性能很好。它支持热重启,动态配置,这些特性在云原生环境里特别实用。

Envoy 的核心能力包括:

  • 服务发现:自动发现上游服务实例
  • 负载均衡:支持多种算法,比如轮询、最少连接
  • 健康检查:主动探测后端是否存活
  • 熔断:防止故障扩散
  • 指标收集:生成详细的请求指标

我的经验:Envoy 的日志默认是关闭的。如果你在调试阶段,记得开启访问日志。我曾经因为没开日志,排查一个 503 错误花了整整一天。命令很简单:在 Istio 配置里设置 accessLogFile: /dev/stdout

Istiod:控制平面的核心

Istiod 是 Istio 1.5 之后引入的「大一统」组件。它把原来分散的 Pilot、Mixer、Citadel 等功能全部整合到了一起。为什么要这么做?说白了,就是为了简化部署和运维。

Istiod 主要干这几件事:

功能模块 职责描述
Pilot 服务发现、流量管理配置下发
Citadel 证书签发、身份认证
Galley 配置验证、处理
Sidecar Injector 自动注入 Envoy Sidecar

你想想看,以前要维护三个组件,现在一个 Istiod 全搞定。运维成本降低了不少。我记得刚升级到 1.5 的时候,团队里还有人担心稳定性。实际跑下来,发现比之前更稳了。

流量管理模型

Istio 的流量管理模型,说白了就是通过 CRD(自定义资源)来定义流量规则。你不需要改代码,只需要写 YAML 文件。这对开发团队来说,简直是福音。

核心的流量管理资源有这几个:

  • VirtualService:定义路由规则,比如根据 header 分流
  • DestinationRule:定义目标策略,比如负载均衡、连接池
  • Gateway:管理入口流量,类似 Ingress
  • ServiceEntry:注册外部服务到网格内
  • Sidecar:控制 Sidecar 的监听端口和转发规则

举个实际例子。假设你要做金丝雀发布,把 10% 的流量引到新版本:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
  - my-service
  http:
  - match:
    - headers:
        version:
          exact: v2
    route:
    - destination:
        host: my-service
        subset: v2
  - route:
    - destination:
        host: my-service
        subset: v1
      weight: 90
    - destination:
        host: my-service
        subset: v2
      weight: 10

避坑指南:我曾经在配置 VirtualService 时,忘了写 subset 对应的 DestinationRule。结果流量全乱了,新版本一个请求都没收到。记住:VirtualService 和 DestinationRule 是配合使用的,缺一不可。

流量管理的核心逻辑其实很简单:

  1. 请求到达 Sidecar(Envoy)
  2. Envoy 根据 VirtualService 规则匹配路由
  3. 根据 DestinationRule 确定目标策略
  4. 转发到目标服务实例

整个过程对业务代码完全透明。你想想看,这有多爽?开发只管写业务逻辑,运维只管配流量规则。各司其职,互不干扰。

嗯,这一章的内容就到这里。记住:数据平面是 Envoy,控制平面是 Istiod,流量管理靠 CRD。这三个点抓住了,Istio 的大门就算敲开了。


公众号:蓝海资料掘金营,微信deep3321