第 2 章:Istio 入门与核心实践

本文简要梳理了 Istio 在 Kubernetes 上的部署流程、核心组件、流量控制、弹性与可观测性等关键知识点,适合作为学习和实践 Istio 的入门笔记。

Istio 安装与环境准备

Istio 作为服务网格的代表,主要解决云原生环境下服务间通信、流量治理和可观测性等问题。推荐在本地通过 Docker Desktop 启用 Kubernetes 进行实验,分配 8GB 内存和 4 核 CPU 可获得更好体验。

  • 安装 Kubernetes(如 Docker Desktop)
  • 下载并解压 Istio 发行版(以 1.13.0 为例):
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.13.0 sh -
cd istio-1.13.0
  • 验证 istioctl 工具可用:
./bin/istioctl version
  • 检查集群环境:
istioctl x precheck
  • 安装 Istio(demo 配置):
istioctl install --set profile=demo -y
  • 查看控制平面组件:
kubectl get pod -n istio-system
  • 安装可观测性等支撑组件:
kubectl apply -f ./samples/addons

Istio 控制平面与核心组件

Istio 控制平面主要由 istiod 组件负责,承担配置下发、服务发现、证书颁发等职责。其核心组件包括:

  • istiod:配置管理与下发,负责将用户声明式配置转为 Envoy 代理可识别的格式。
  • 入口/出口网关(Ingress/Egress Gateway):管理集群边界流量。
  • 支撑组件(如 Prometheus、Grafana、Jaeger、Kiali):提供可观测性和可视化能力。
图 1: Istio 控制平面及支持组件
图 1: Istio 控制平面及支持组件

配置示例

以流量路由为例,Istio 通过自定义资源(CRD)实现流量控制:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog-service
spec:
  hosts:
    - catalog.prod.svc.cluster.local
  http:
    - match:
        - headers:
            x-dark-launch:
              exact: "v2"
      route:
        - destination:
            host: catalog.prod.svc.cluster.local
            subset: v2
    - route:
        - destination:
            host: catalog.prod.svc.cluster.local
            subset: v1

应用部署与 Sidecar 注入

以 ACME 公司的在线商店为例,部署 catalogwebapp 服务:

  • 创建命名空间并启用自动注入:
kubectl create namespace istioinaction
kubectl label namespace istioinaction istio-injection=enabled
  • 部署服务:
kubectl apply -f services/catalog/kubernetes/catalog.yaml
kubectl apply -f services/webapp/kubernetes/webapp.yaml
  • 验证 Pod 中已自动注入 istio-proxy Sidecar:
kubectl get pod
  • 端口转发访问 webapp:
kubectl port-forward deploy/webapp 8080:8080

浏览器访问 http://localhost:8080 可查看 UI。

图 2: webapp 用户界面
图 2: webapp 用户界面

流量引入与路由控制

通过 Istio 入口网关将外部流量引入集群:

kubectl apply -f ch2/ingress-gateway.yaml
  • 获取入口地址并访问服务:
curl http://localhost:80/api/catalog/items/1
  • 检查路由配置:
istioctl proxy-config routes deploy/istio-ingressgateway.istio-system

可观测性与分布式追踪

Istio 默认集成 Prometheus、Grafana、Jaeger 等工具,实现服务间流量的可观测性和追踪。

  • 端口转发访问 Grafana:
istioctl dashboard grafana
  • 端口转发访问 Jaeger:
istioctl dashboard jaeger
  • 通过 Dashboard 查看服务流量、延迟、调用链等指标。

图 3: Grafana 主界面
图 3: Grafana 主界面
图 4: Jaeger 跟踪界面
图 4: Jaeger 跟踪界面

弹性与故障注入

Istio 支持通过 VirtualService 配置重试、超时等弹性策略,无需修改应用代码。

  • 注入故障模拟脚本:
./bin/chaos.sh 500 50
  • 配置重试策略:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog
spec:
  hosts:
    - catalog
  http:
    - route:
        - destination:
            host: catalog
      retries:
        attempts: 3
        perTryTimeout: 2s
  • 应用配置后,客户端可自动重试,提升服务可用性。

版本发布与流量灰度

通过 DestinationRule 和 VirtualService 实现多版本部署与灰度流量控制:

  • 部署 v2 版本:
kubectl apply -f services/catalog/kubernetes/catalog-deployment-v2.yaml
  • 定义 DestinationRule:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: catalog
spec:
  host: catalog
  subsets:
    - name: version-v1
      labels:
        version: v1
    - name: version-v2
      labels:
        version: v2
  • 配置 VirtualService,实现基于请求头的流量分流:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog
spec:
  hosts:
    - catalog
  http:
    - match:
        - headers:
            x-dark-launch:
              exact: "v2"
      route:
        - destination:
            host: catalog
            subset: version-v2
    - route:
        - destination:
            host: catalog
            subset: version-v1
  • 通过带特定 Header 的请求访问 v2,其余流量仍走 v1。

总结

  • Istio 通过 Sidecar 代理和控制平面组件,实现服务间流量治理、弹性和可观测性。
  • 支持声明式配置流量路由、重试、超时等策略,简化微服务治理。
  • 集成可观测性工具,便于监控和追踪服务调用链。
  • 支持多版本部署与灰度发布,提升上线安全性和灵活性。
  • 适合在 Kubernetes 等云原生环境下构建高可用、可观测的微服务体系。

参考文献

  1. Istio 官方文档 - istio.io
  2. Istio in Action 源码 - github.com
  3. SPIFFE 标准 - spiffe.io

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区