跳转至

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 入门教程