饮墨

子安饮墨馀三斗,留与卿儿作赋来

Istio Ambient Mesh 实战:告别 Sidecar,服务网格轻量化落地

痛点:Sidecar 模式的运维之痛

Istio 从诞生起就以 Sidecar(Envoy)注入为核心架构。每个 Pod 旁边跑一个 Envoy 代理,虽然实现了透明流量劫持,但在生产中带来了真实的运维负担:

  • 资源开销大:每个 Pod 多吃 100-200MB 内存、0.1-0.5 vCPU,千级 Pod 集群下额外资源成本可观
  • 升级复杂:Sidecar 版本与数据面绑定,升级需重启所有注入 Pod,灰度困难
  • 启动延迟:Pod 启动时需等待 Sidecar Ready,init container 注入 iptables 规则增加 2-5s 启动时间
  • HBONE 兼容性差:某些 Job、CronJob、DaemonSet 场景不适合注入 Sidecar

2024 年 Istio 1.22 正式将 Ambient Mesh 标记为 GA,提供了一种无 Sidecar 的服务网格方案。到 2026 年,Ambient 模式已经在众多生产环境验证,成为 Istio 的推荐部署模式。

方案:Ambient Mesh 双层代理架构

Ambient Mesh 用两个基础设施组件替代 Sidecar:

┌─────────────────────────────────────────────────┐
│  L4 层:ztunnel(每节点 DaemonSet)              │
│  - mTLS 加密(SPIFFE 身份)                     │
│  - L4 授权策略                                  │
│  - 零配置,自动劫持节点上所有 Ambient Pod 流量   │
└─────────────────────────────────────────────────┘
              │ 需要 L7 能力时 ▼
┌─────────────────────────────────────────────────┐
│  L7 层:Waypoint Proxy(按 namespace/SA 部署)   │
│  - HTTP 路由、重试、超时                         │
│  - L7 授权策略、请求级遥测                       │
│  - 按需创建,不需要 L7 的服务完全跳过            │
└─────────────────────────────────────────────────┘

核心优势:

对比维度 Sidecar 模式 Ambient 模式
内存开销/Pod 100-200MB 0(ztunnel 共享节点资源)
升级方式 需重启业务 Pod ztunnel 滚动更新,无需重启
L7 能力 默认全开 按需启用 Waypoint
mTLS Sidecar 负责 ztunnel 节点级自动完成
适用范围 需排除特殊 workload 全量覆盖,无需注入

实操步骤

第 1 步:安装 Istio Ambient 模式

# 下载 istioctl(>= 1.24)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.24.0 sh -
export PATH=$PWD/istio-1.24.0/bin:$PATH

# 安装 ambient profile
istioctl install --set profile=ambient -y

# 验证组件
kubectl get pods -n istio-system
# 应看到:istiod, ztunnel(DaemonSet), istio-cni(DaemonSet)

第 2 步:将 Namespace 纳入 Ambient Mesh

# 给目标 namespace 打标签即可,无需重启 Pod
kubectl label namespace production istio.io/dataplane-mode=ambient

# 验证:所有 Pod 流量已被 ztunnel 接管(mTLS 自动生效)
istioctl ztunnel-config workloads

# 测试 mTLS 状态
kubectl exec -n production deploy/frontend -- \
  curl -s http://backend:8080/health | head -5
# 流量已加密,tcpdump 抓包验证:
# kubectl debug node/<node> -it --image=nicolaka/netshoot -- \
#   tcpdump -i any -A port 15008 | grep -c "HTTP"  # 应为0(已加密)

第 3 步:按需部署 Waypoint Proxy(L7 能力)

# 仅在需要 HTTP 路由/L7 策略的 namespace 创建 waypoint
istioctl waypoint apply -n production --enroll-namespace

# 查看 waypoint deployment
kubectl get gateway -n production
# NAME        CLASS            ADDRESS        READY
# waypoint    istio-waypoint   10.96.x.x      True

# 应用 L7 授权策略示例:仅允许 frontend 访问 backend 的 GET /api/*
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: backend-l7-policy
  namespace: production
spec:
  targetRefs:
  - kind: Service
    group: ""
    name: backend
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/production/sa/frontend"]
    to:
    - operation:
        methods: ["GET"]
        paths: ["/api/*"]
EOF

第 4 步:监控与可观测性

# ztunnel 指标(Prometheus 自动采集)
# 关键指标:
#   istio_tcp_connections_opened_total    - L4 连接数
#   istio_tcp_sent_bytes_total            - 流量字节
#   istio_request_duration_milliseconds   - waypoint L7 延迟

# Grafana Dashboard 导入 Istio 官方 Ambient 面板 ID:21436

# 查看 ztunnel 日志排查连接问题
kubectl logs -n istio-system -l app=ztunnel --tail=50 -f

避坑指南

1. ztunnel 资源配置不当导致节点网络抖动

ztunnel 以 DaemonSet 运行在每个节点,处理该节点所有 Ambient Pod 的 mTLS。高流量节点需调整资源:

# 通过 IstioOperator 或 Helm values 调整
spec:
  components:
    ztunnel:
      k8s:
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "2"
            memory: "2Gi"

经验值:单节点 200+ Pod、总带宽 > 1Gbps 时,ztunnel 至少给 1 vCPU + 1Gi 内存。

2. Waypoint 与 Sidecar 混用时的流量路径冲突

迁移过程中可能出现同一 namespace 既有 Sidecar Pod 又有 Ambient Pod 的情况。规则:

  • Ambient Pod → Sidecar Pod:流量经 ztunnel 出,经 Sidecar 入,正常工作
  • Sidecar Pod → Ambient Pod:流量经 Sidecar 出,ztunnel 接收,正常工作
  • :不要对已注入 Sidecar 的 Pod 所在 namespace 同时打 istio.io/dataplane-mode=ambient,会造成双重劫持

正确迁移顺序:先移除 Sidecar 注入标签 → 滚动重启移除 Sidecar → 再打 Ambient 标签。

3. NetworkPolicy 与 ztunnel 流量劫持的兼容问题

ztunnel 使用 HBONE(HTTP/2 over port 15008)传输加密流量。如果集群有严格的 NetworkPolicy,需放行:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ztunnel-hbone
  namespace: production
spec:
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: istio-system
    ports:
    - protocol: TCP
      port: 15008
  policyTypes:
  - Ingress

总结

Istio Ambient Mesh 是服务网格架构的一次重大演进:

  1. 资源节省 40-60%:消除每 Pod 一个 Envoy 的内存/CPU 开销,中大型集群年省数万美元
  2. 运维复杂度下降:升级不影响业务 Pod,无需协调应用团队重启
  3. 渐进式采用:L4(mTLS + 策略)零成本自动获得,L7 按需 Waypoint 精确投放
  4. 迁移路径清晰:可逐 namespace 切换,Sidecar 与 Ambient 可共存于同一集群

适用场景推荐

  • 成本敏感的大规模集群(500+ Pod)
  • 只需 mTLS 加密不需要复杂 L7 路由的微服务
  • Job/CronJob 等短生命周期 workload 的安全通信

暂缓场景:需要 EnvoyFilter 自定义扩展、WebSocket 长连接精细控制的场景,当前 Waypoint 支持度仍在完善中。

生产落地建议:先在非核心 namespace 启用 Ambient,观察 ztunnel 资源消耗和延迟指标 1-2 周,确认无异常后逐步全量推广。

您还没有登录,请登录后发表评论。