Istio 服务网格¶
一句话概述:Istio 是 K8s 上最流行的服务网格(Service Mesh),在微服务之间自动注入 Sidecar 代理,统一处理流量管理、安全通信、可观测性,应用代码不用改。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| 服务网格 | 管理微服务之间通信的基础设施层 |
| Sidecar | 每个 Pod 里自动注入一个 Envoy 代理容器 |
| Envoy | 高性能代理,Istio 用它来拦截和管理所有流量 |
| VirtualService | 定义流量路由规则(A/B 测试、金丝雀发布) |
| DestinationRule | 定义目标服务的策略(负载均衡、熔断) |
| Gateway | 管理进入网格的外部流量(类似 Ingress) |
| mTLS | 服务间双向 TLS 加密,自动管理证书 |
安装配置¶
# 下载 Istio
curl -L https://istio.io/downloadIstio | sh - # 下载最新版
cd istio-*
export PATH=$PWD/bin:$PATH # 把 istioctl 加到 PATH
# 安装到 K8s 集群
istioctl install --set profile=demo # demo 配置(适合学习)
# 可选 profile:minimal / default / demo
# 开启自动 Sidecar 注入(对指定命名空间)
kubectl label namespace default istio-injection=enabled # 新建的 Pod 自动注入 Envoy
# 安装可观测性组件
kubectl apply -f samples/addons/ # 安装 Kiali、Prometheus、Grafana、Jaeger
基本使用¶
流量管理(金丝雀发布)¶
# virtual-service.yaml - 流量路由
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-app
spec:
hosts:
- my-app # 目标服务名
http:
- route:
- destination:
host: my-app
subset: v1 # 90% 流量到 v1
weight: 90
- destination:
host: my-app
subset: v2 # 10% 流量到 v2(金丝雀)
weight: 10
---
# destination-rule.yaml - 定义子集
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-app
spec:
host: my-app
subsets:
- name: v1
labels:
version: v1 # 匹配 version=v1 标签的 Pod
- name: v2
labels:
version: v2 # 匹配 version=v2 标签的 Pod
常用命令¶
istioctl analyze # 分析配置问题
istioctl dashboard kiali # 打开 Kiali 可视化面板
istioctl dashboard grafana # 打开 Grafana 监控面板
kubectl get virtualservices # 列出虚拟服务
kubectl get destinationrules # 列出目标规则
高级用法¶
熔断器¶
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-service
spec:
host: my-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100 # 最大连接数
http:
h2UpgradePolicy: DEFAULT
http1MaxPendingRequests: 100 # 最大等待请求
http2MaxRequests: 100 # 最大并发请求
outlierDetection:
consecutive5xxErrors: 3 # 连续 3 个 5xx 错误
interval: 30s # 检测间隔
baseEjectionTime: 30s # 剔除时间
常见报错¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
| Sidecar 没注入 | 命名空间没开启注入 | kubectl label ns default istio-injection=enabled |
| 503 错误 | 路由规则不匹配 | 检查 VirtualService 和 DestinationRule |
| mTLS 失败 | 证书问题 | istioctl analyze 诊断 |
速查表¶
istioctl install --set profile=demo # 安装
istioctl analyze # 诊断
istioctl dashboard kiali # Kiali 面板
istioctl dashboard grafana # 监控面板
istioctl proxy-status # 代理状态
istioctl proxy-config route <pod> # 路由配置
kubectl label ns <ns> istio-injection=enabled # 开启注入
参考:Istio 官网 | Istio 文档 | Istio 入门教程