从零搭建 Istio 服务网格

适用场景

需要统一服务间 mTLS、流量切分、重试超时、熔断和可观测性,但不想在每个应用里重复实现。适合已经运行在 Kubernetes 上、服务数量较多且有多团队协作的场景。

前置条件

步骤

  1. 安装 CLI 并检查环境:
istioctl version
istioctl x precheck
  1. 选择配置档安装。生产环境建议先落盘再审查:
istioctl install --set profile=default -y
kubectl -n istio-system get pods

资源紧张或希望降低 sidecar 开销时,可评估 ambient 模式;它使用 ztunnel 和 waypoint,不再为每个 Pod 注入 sidecar。

  1. 开启命名空间注入:
kubectl label namespace demo istio-injection=enabled
kubectl rollout restart deploy -n demo
kubectl get pods -n demo

Pod 应显示 2/2(应用容器 + istio-proxy)。

  1. 部署示例应用和网关:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl -n istio-system get svc istio-ingressgateway
  1. 配置目标规则和虚拟服务,先做 90/10 灰度:
kubectl apply -f - <<'EOF'
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts: [reviews]
  http:
  - route:
    - destination: {host: reviews, subset: v1}
      weight: 90
    - destination: {host: reviews, subset: v2}
      weight: 10
EOF
  1. 启用严格 mTLS:
kubectl apply -f - <<'EOF'
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT
EOF
  1. 接入可观测性:
istioctl dashboard kiali
istioctl dashboard prometheus
istioctl dashboard grafana

验证

回滚

常见坑

相关命令