Istio 在 1.16 至 1.25 版本中的核心价值在于:将原本嵌入在业务代码中的非功能性需求——如流量控制、熔断降级、安全通信等能力——从应用中剥离,交由 Sidecar(基于 Envoy)统一管理。这种架构实现了“业务无感知、运维可管控”的服务治理闭环,让开发者专注业务逻辑,运维团队掌控系统稳定性。
本文将以“技术原理 + 实操流程 + 可复用案例”为主线,用通俗语言解析 Istio 的关键机制,避免术语堆砌,并涵盖 1.16 到 1.25 各版本间的演进差异。
自 Istio 1.16 起,控制平面全面采用 Istiod 单进程模式,整合了早期版本中 Pilot、Citadel 等多个组件的功能。到 1.25 版本,Istiod 进一步提升了性能和兼容性,整体架构可概括为:“大脑”(Istiod)指挥“手脚”(Envoy)完成任务。
由一系列代理实例构成,即每个 Pod 中注入的 Sidecar 容器(Envoy),负责实际处理所有进出服务的网络流量。这些代理充当“智能流量阀门”,拦截并转发请求,实现精细化控制。
Envoy
核心为 Istiod,承担三大职责:
Istiod
传统 Kubernetes Service 仅支持直连,无法实现灰度发布或按条件分流。Istio 通过以下方式实现灵活路由:
Envoy 根据这两类资源配置执行具体的流量分发动作。其中,Istio 1.25 引入了 TrafficPolicy 简化配置,减少冗余规则定义。
VirtualService
DestinationRule
default
当某个下游服务因高负载而响应变慢甚至宕机时,若上游持续调用,极易引发雪崩效应。例如订单服务调用商品服务失败导致自身资源耗尽。Istio 的解决方案是:
DestinationRule
VirtualService
fault
传统的 HTTP 明文传输存在数据窃听和身份伪造风险。Istio 基于 SPIFFE 标准构建自动化的双向 TLS 认证体系:
VirtualService
istioctl 工具;product-service(含 v1/v2 版本)和 order-service(发起调用),模拟典型微服务交互场景。istioctl
product
order
该流程适用于 Istio 1.16 至 1.25 所有版本,其中 1.25 对权限模型和 CRD 定义进行了优化。
istioctl 命令行工具;istioctl install 部署 Istiod 控制平面组件;为测试命名空间打上标签,使其中的新建 Pod 自动注入 Envoy Sidecar:
# 以1.25.0为例(1.16-1.20只需替换版本号)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.25.0 sh -
cd istio-1.25.0
cp bin/istioctl /usr/local/bin/
# 验证安装
istioctl version --remote=false # 输出对应版本即成功
# 1.16-1.20:默认配置安装(需注意K8s版本兼容性)
istioctl install --set profile=default -y
# 1.25:适配K8s 1.30-1.33,无需跳过版本检查(官方原生支持)
istioctl install --set profile=default -y
kubectl label namespace default istio-injection=enabled
部署两个核心服务:product-service 提供商品信息(包含 v1 和 v2 两个版本),order-service 模拟订单系统,调用前者获取数据。
编写 Deployment 和 Service 资源清单,分别启动两个版本的应用实例。
product-service
# product.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: product-v1
spec:
replicas: 2
selector:
matchLabels:
app: product
version: v1
template:
metadata:
labels:
app: product
version: v1
spec:
containers:
- name: product
image: nginx:alpine
ports:
- containerPort: 80
command: ["/bin/sh", "-c"]
args: ["echo 'product v1' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: product-v2
spec:
replicas: 2
selector:
matchLabels:
app: product
version: v2
template:
metadata:
labels:
app: product
version: v2
spec:
containers:
- name: product
image: nginx:alpine
ports:
- containerPort: 80
command: ["/bin/sh", "-c"]
args: ["echo 'product v2' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
---
apiVersion: v1
kind: Service
metadata:
name: product-service
spec:
selector:
app: product
ports:
- port: 80
targetPort: 80
kubectl apply -f product.yaml
创建订单服务的 Deployment 并暴露 Service 接口。
order-service
# order.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 2
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
containers:
- name: order
image: curlimages/curl:latest
command: ["/bin/sh", "-c"]
args: ["while true; do echo 'order call product: ' && curl -s product-service; sleep 5; done"]
kubectl apply -f order.yaml
检查各 Pod 的容器列表,若显示包含业务容器和 istio-proxy 容器,则表明注入成功。
READY
2/2
kubectl get pods
通过配置 VirtualService 和 DestinationRule 实现基于权重的流量拆分,常用于灰度上线或 A/B 测试场景。
案例背景
某电商平台包含三个核心微服务:
user-service(用户服务)order-service(订单服务)product-service(商品服务)这些服务部署在 Kubernetes 1.33 集群中,需满足以下治理需求:
案例实施步骤
1. 部署服务并注入 Sidecar
确保各服务的 Pod 成功注入 Istio Sidecar 代理。
user/order/product 表明当前环境中的服务均已包含 istio-proxy 容器。在 Istio 1.25 版本与 K8s 1.33 组合下,Sidecar 自动注入无需额外权限配置。
2. 配置 product-service 灰度发布
通过
DestinationRule 创建 DestinationRule,定义 product-service 的 v1 和 v2 子集;
再使用
VirtualService 创建 VirtualService,初始设置 20% 流量导向 v2 版本,完成验证后调整权重至 100%,实现平滑升级。
3. 配置 order-service 熔断保护
在
order-service 的 DestinationRule 资源中添加连接池限制策略 http1MaxPendingRequests:10,控制最大并发请求量,避免因过载导致雪崩效应。
4. 配置全局 mTLS 并对接外部 CA
参考后续“步骤 5”中的场景 2 方案,启用严格 mTLS 模式,并与 Vault 等外部证书机构集成,实现证书生命周期集中管控。
5. 配置故障注入规则
向
user-service 的 VirtualService 添加 fault 故障注入策略,具体配置如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user-vs
spec:
hosts:
- user-service
http:
- fault:
delay:
percentage:
value: 50 # 50%请求注入延迟
fixedDelay: 500ms
route:
- destination:
host: user-service
用于模拟 user-service 响应延迟,测试 order-service 在异常情况下的稳定性与降级能力。
案例效果总结
要求大部分请求走稳定版 v1,少量流量进入 v2 进行验证测试。
1. 创建 DestinationRule 定义服务子集
# product-dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: product-dr
spec:
host: product-service # 对应K8s Service名称
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # 子集内负载均衡策略
subsets:
- name: v1
labels:
version: v1 # 匹配v1版本Pod
- name: v2
labels:
version: v2 # 匹配v2版本Pod
执行部署操作:
kubectl apply -f product-dr.yaml
2. 创建 VirtualService 设置流量权重
# product-vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: product-vs
spec:
hosts:
- product-service
http:
- route:
- destination:
host: product-service
subset: v1
weight: 80 # 80%流量到v1
- destination:
host: product-service
subset: v2
weight: 20 # 20%流量到v2
应用配置:
kubectl apply -f product-vs.yaml
3. 效果验证
查看 order-service 的日志输出,可观察到约 80% 的响应来自:
product v1
其余 20% 来自:
product v2
整体分布符合预期:
kubectl logs -f <order-pod-name> order
目标:当 product-service 接收的并发请求超过 5 个时,Envoy 自动拒绝后续请求,防止服务资源耗尽。
更新 DestinationRule 添加熔断策略
修改
product-dr.yaml 文件,在 trafficPolicy 相关字段中加入熔断配置。该语法在 Istio 1.16 至 1.25 版本间保持一致:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: product-dr
spec:
host: product-service
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
connectionPool: # 熔断核心配置
tcp:
maxConnections: 10 # 最大TCP连接数
http:
http1MaxPendingRequests: 5 # 最大等待请求数(超过则熔断)
maxRequestsPerConnection: 1 # 单连接最大请求数
outlierDetection: # 异常实例剔除
consecutiveErrors: 3 # 连续3次错误标记为异常
interval: 30s # 检测间隔
baseEjectionTime: 1m # 剔除时长
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
执行更新命令:
kubectl apply -f product-dr.yaml
验证熔断是否生效
利用
fortio 工具发起高并发压测(使用 Istio 自带镜像):
# 部署fortio客户端
kubectl run fortio --image=fortio/fortio --command -- sleep 3600
# 并发10个请求(超过阈值5)
kubectl exec -it fortio -- fortio load -c 10 -qps 0 -t 60s http://product-service
结果中出现部分 503 错误码,表明熔断策略已成功触发,系统具备自我保护能力。
Istio 在不同版本对 mTLS 的默认行为有所不同:
PERMISSIVE 模式,允许明文和加密流量共存;STRICT 模式,强制启用双向 TLS 加密,并支持接入外部 CA。场景 1:在 1.16-1.20 中开启命名空间级强制 mTLS
# peerauth-1.20.yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default-peerauth
namespace: default
spec:
mtls:
mode: STRICT # 强制该命名空间内服务加密通信
部署配置:
kubectl apply -f peerauth-1.20.yaml
场景 2:在 1.25 中启用强制 mTLS 并对接外部 CA(生产推荐配置)
# 1. 先配置外部CA(以Vault为例,需提前部署Vault)
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: istiocontrolplane
spec:
meshConfig:
certificates:
- secretName: vault-ca-cert # 外部CA证书secret
certSigningRequest:
csrParameters:
names:
- C: CN
ST: Guangdong
L: Foshan
O: IT
OU: DevOps
components:
pilot:
k8s:
env:
- name: PILOT_CERT_PROVIDER
value: vault # 指定CA为Vault
---
# 2. 全局强制mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: global-peerauth
namespace: istio-system
spec:
mtls:
mode: STRICT
selector:
matchLabels:
istio: system # 全局生效
执行部署:
kubectl apply -f istio-ca.yaml
验证 mTLS 是否生效
# 查看Envoy证书
istioctl pc secrets <product-pod-name> -n default
# 尝试明文访问(会失败,说明强制加密生效)
kubectl exec -it <order-pod-name> -- curl -s <product-pod-ip>:80
| 能力维度 | 1.16-1.20 特性 | 1.25 特性(核心升级) |
|---|---|---|
| 控制平面 | Istiod 单体进程,仅支持内置 CA | Istiod 性能优化,支持对接外部 CA(如 Vault) |
| 流量治理 | 支持基础权重分配与路径路由 | 新增 路由机制,减少配置冗余 |
| mTLS 证书管理 | 证书每 1 小时自动轮换 | 支持最长 24 小时轮换周期,可自定义策略 |
| Kubernetes 兼容性 | 支持 K8s 1.22 - 1.29 | 原生支持 K8s 1.30 - 1.33,完美适配 1.33 |
| 可观测性 | 集成 Prometheus 与 Grafana | 原生支持 OpenTelemetry,链路追踪更高效便捷 |
扫码加好友,拉您进群



收藏
