Istio流量管理配置
🔍 Istio 简介
Istio 是一种开源服务网格,可透明地分层到现有的分布式应用程序上,提供统一且高效的方式来保护、连接和监控服务,几乎无需更改服务代码即可实现以下功能:
- 双向 TLS 加密、基于身份的认证与鉴权,保障集群内服务通信安全
- 支持 HTTP、gRPC、WebSocket 和 TCP 的自动负载均衡
- 精细化流量控制(路由、重试、故障转移、故障注入)
- 可插拔的策略引擎,支持访问控制、限流、配额等
- 对集群入口/出口流量的自动指标采集、日志记录与链路追踪
⚙️ 工作机制
Istio 架构主要包括:
控制平面
负责接收用户定义的流量规则(如 VirtualService),并将这些规则动态下发到数据平面中的代理(Envoy)中。
数据平面
由一组代理组成,拦截服务之间的所有网络流量,执行负载均衡、认证、路由等任务。Istio 提供两种数据平面运行模式:
- Sidecar 模式:每个 Pod 部署一个 Envoy 代理,与应用容器并肩运行
- Ambient 模式:节点级 Layer 4 代理 + 可选的命名空间级 Layer 7 Envoy,用于更轻量的部署方式
🔁 流量劫持机制:从 iptables 到 eBPF
Istio 使用 iptables 或 eBPF 规则来劫持和重定向 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
✅ 匹配顺序说明
- 规则自上而下匹配,先匹配成功即应用该规则
- 当前配置意图如下:
/service/api/public/*
→ 路由到后端服务/service/*
→ 路由到认证服务
- 若匹配顺序颠倒,
/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
📚 参考文献与官方资料
- Istio 官方文档
🔗 https://istio.io/latest/docs/ - Istio GitHub 仓库
🔗 https://github.com/istio/istio - 流量管理概念详解
🔗 Traffic Management Concepts - Envoy 官方文档
🔗 https://www.envoyproxy.io/docs/envoy/latest/ - Ambient Mesh:无 Sidecar 数据平面解读
🔗 Introducing Ambient Mesh - Kubernetes 网络与 kube-proxy 原理
🔗 Kubernetes Networking Concepts
如需将此文档整理为 PDF 或发布为 Wiki/文档站,可继续告诉我,我也可协助生成对应版本。