Istio流量管理配置

🔍 Istio 简介

Istio 是一种开源服务网格,可透明地分层到现有的分布式应用程序上,提供统一且高效的方式来保护、连接和监控服务,几乎无需更改服务代码即可实现以下功能:

  • 双向 TLS 加密、基于身份的认证与鉴权,保障集群内服务通信安全
  • 支持 HTTP、gRPC、WebSocket 和 TCP 的自动负载均衡
  • 精细化流量控制(路由、重试、故障转移、故障注入)
  • 可插拔的策略引擎,支持访问控制、限流、配额等
  • 对集群入口/出口流量的自动指标采集、日志记录与链路追踪

⚙️ 工作机制

Istio 架构主要包括:

控制平面

负责接收用户定义的流量规则(如 VirtualService),并将这些规则动态下发到数据平面中的代理(Envoy)中。

数据平面

由一组代理组成,拦截服务之间的所有网络流量,执行负载均衡、认证、路由等任务。Istio 提供两种数据平面运行模式:

  • Sidecar 模式:每个 Pod 部署一个 Envoy 代理,与应用容器并肩运行
  • Ambient 模式:节点级 Layer 4 代理 + 可选的命名空间级 Layer 7 Envoy,用于更轻量的部署方式

🔁 流量劫持机制:从 iptables 到 eBPF

Istio 使用 iptableseBPF 规则来劫持和重定向 Pod 的入站/出站流量到 Envoy 代理。

流量转发过程如下:

1. iptables 规则劫持

  • 入口流量:流量被重定向到 Envoy 的 15006 端口
  • 出口流量:流量被重定向到 Envoy 的 15001 端口

2. Envoy 处理逻辑

  • Envoy 根据配置(如 VirtualService、DestinationRule)进行流量路由、负载均衡等处理
  • 最终转发到目标容器或外部服务

📥 外部流量进入 Pod 的完整路径

外部请求 → Gateway → VirtualService → DestinationRule → Kubernetes Service
→ (Sidecar iptables 劫持) → Envoy → 目标 Pod

各组件职责:

  • VirtualService:定义“去哪里”(路由规则)
  • DestinationRule:定义“怎么去”(负载均衡策略、熔断)
  • Sidecar iptables:确保所有流量经过 Envoy
比较维度 DestinationRule Sidecar iptables
配置层级 应用层策略(L7) 网络层劫持(L3/L4)
生效阶段 路由决策之后 路由决策之前(强制流量经过 Envoy)
配置方式 Kubernetes CRD 资源定义 Pod 初始化时由 istio-init自动注入

❓ 为什么不是在 Kubernetes Service 层拦截?

  • Service 是虚拟概念:由 kube-proxy 实现的四层负载均衡,仅支持基于 IP/端口的转发,无法实现 L7 层的高级路由逻辑(如 HTTP 头路由)
  • Pod 是实际的执行单元:只有进入 Pod 后,才能基于应用层信息(如 URI、Header)做出更精细的控制决策

🛠️ 基础参考配置示例

📌 Gateway 与 VirtualService 示例(服务路由)

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: [网关资源名称]
  namespace: [命名空间]
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: [虚拟服务名称]
  namespace: [命名空间]
spec:
  gateways:
    - [网关资源名称]
  hosts:
    - "*"
  http:
    - match:
        - uri:
            prefix: /service/api/public/
      rewrite:
        uri: /api/public/
      route:
        - destination:
            host: [后端服务名称].[命名空间].svc.cluster.local
    - match:
        - uri:
            prefix: /service/
      headers:
        request:
          set:
            X-Custom-Header: "%REQ(:PATH)%"
      route:
        - destination:
            host: [认证服务名称].[命名空间].svc.cluster.local

✅ 匹配顺序说明

  1. 规则自上而下匹配,先匹配成功即应用该规则
  2. 当前配置意图如下:
    • /service/api/public/* → 路由到后端服务
    • /service/* → 路由到认证服务
  3. 若匹配顺序颠倒,/service/api/public/ 可能会被错误匹配

🧪 路径测试用例

请求路径 匹配结果
/service/api/public/test 命中规则 1
/service/dashboard 命中规则 2
/service 命中规则 2

🔧 补充参考配置

1️⃣ DestinationRule:连接池与版本子集配置

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: [目标服务名称]-dr
  namespace: [命名空间]
spec:
  host: [目标服务名称].[命名空间].svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http1MaxPendingRequests: 1000
        maxRequestsPerConnection: 100
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

2️⃣ VirtualService 灰度发布(按流量百分比)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: canary-route
spec:
  hosts:
    - [服务名称]
  http:
    - route:
        - destination:
            host: [服务名称]
            subset: v1
          weight: 80
        - destination:
            host: [服务名称]
            subset: v2
          weight: 20

3️⃣ 流量镜像(Shadow Traffic)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mirror-traffic
spec:
  hosts:
    - [服务名称]
  http:
    - route:
        - destination:
            host: [服务名称]
            subset: v1
      mirror:
        host: [服务名称]
        subset: v2

📚 参考文献与官方资料

  1. Istio 官方文档
    🔗 https://istio.io/latest/docs/
  2. Istio GitHub 仓库
    🔗 https://github.com/istio/istio
  3. 流量管理概念详解
    🔗 Traffic Management Concepts
  4. Envoy 官方文档
    🔗 https://www.envoyproxy.io/docs/envoy/latest/
  5. Ambient Mesh:无 Sidecar 数据平面解读
    🔗 Introducing Ambient Mesh
  6. Kubernetes 网络与 kube-proxy 原理
    🔗 Kubernetes Networking Concepts

如需将此文档整理为 PDF 或发布为 Wiki/文档站,可继续告诉我,我也可协助生成对应版本。