Istio Ambient 模式中的透明流量拦截过程详解

本文是关于 Istio Ambient 模式的系列文章的第一篇,介绍了如何通过透明流量拦截实现无需 Sidecar 的服务网格。详细分析了 Istio CNI Node Agent、ztunnel 以及 Pod 网络命名空间的交互过程。

阅读原文请转到:https://jimmysong.io/blog/istio-ambient-traffic-interception/

这是我关于 Istio ambient 模式系列文章的第一篇。在接下来的几篇中,我将深入探讨 ambient 模式的关键组件及其工作原理,包括 ztunnel 如何将流量转发到 waypoint proxy,waypoint proxy 如何处理流量,以及通过 bookinfo 示例完整理解流量路径的操作。由于流量拦截是服务网格的基础功能,因此我选择从它开始,为大家提供扎实的理解基础。

Istio ambient 模式是一种无需在每个 pod 中注入 sidecar 的服务网格实现方式。它通过在 pod 的网络命名空间内配置透明流量拦截和重定向,使应用程序无需修改即可享受服务网格的功能。以下内容将详细解析透明流量拦截的实现过程,涉及组件如 Istio CNI Node Agentztunnel网络命名空间iptables 规则,并通过流程图和示意图进行说明。

背景知识

Linux 网络命名空间

网络命名空间(Network Namespace) 是 Linux 内核的功能,用于隔离不同进程的网络环境。每个网络命名空间都有独立的网络设备、IP 地址、路由表和 iptables 规则。容器技术(如 Docker、Kubernetes)利用网络命名空间为每个容器(或 pod)提供独立的网络栈。

Istio CNI Node Agent

Istio CNI Node Agent 是 ambient 模式中的核心组件之一,负责在 Kubernetes 节点上检测加入 ambient 网格的 pod,并为这些 pod 配置流量重定向规则。需要注意的是,这里使用的是 Istio CNI Node Agent,而非传统的 Istio CNI 插件。Node Agent 是一个守护进程,与 ztunnel 协同工作,而不是直接参与网络插件的工作。

ztunnel

ztunnel 是 ambient 模式中的重要组件,以 DaemonSet 的形式运行在每个节点上,负责:

  • • 接收并处理被重定向的流量;

  • • 实现 L4 层的策略,如 mTLS 加密和访问控制;

  • • 与控制平面通信以获取配置和证书。

HBONE(基于 HTTP 的隧道协议)

HBONE(HTTP-Based Overlay Network Encapsulation) 是 Istio 引入的协议,用于在 ztunnel 和 waypoint proxy 之间传输任意 TCP 流量。HBONE 利用 HTTP/2 和 HTTP/3 的多路复用及加密特性,提高通信效率和安全性。

流量拦截过程详解

在 ambient 模式下,应用程序 pod 无需修改代码,也不需要注入 sidecar。流量拦截和重定向的主要过程发生在 pod 的网络命名空间 内部,这种方式避免了与底层 CNI 的冲突。以下是其步骤概览:


Istio ambient 模式的流量拦截过程

流量拦截详细步骤

    1. pod 启动与网络配置
  • • Kubernetes 创建 pod 时,通过 Container Runtime Interface(CRI)调用底层 CNI 插件(如 Calico、Cilium)为 pod 配置网络。

  • • 此时,pod 的网络命名空间(netns)已经建立。

  1. Istio CNI Node Agent 配置流量重定向
  • • Istio CNI Node Agent 监测到新 pod 被标记为 ambient 模式(通过标签 istio.io/dataplane-mode=ambient)。

  • • 进入 pod 的网络命名空间,设置 iptables 规则以拦截流量。

  • • 将网络命名空间的文件描述符(FD)传递给 ztunnel。

  1. ztunnel 在 pod 网络命名空间中启动监听套接字
  • • ztunnel 接收到网络命名空间的 FD,在其中启动监听套接字以处理重定向的流量。
  1. 透明流量拦截与处理
  • • 应用程序发出的流量被 pod 内的 iptables 规则拦截,并透明地重定向到 ztunnel。

  • • ztunnel 对流量执行策略检查、加密等处理后转发到目标服务。

  • • 返回的响应流量通过 ztunnel 解密并返回给应用程序。

想了解更多关于 Istio CNI 处理 iptables 的细节请见我的另一篇博客 Istio ambient 模式中的 iptables 规则解析1

ztunnel 日志分析

你可以通过下面的命令查看所有 ztunnel 日志中有关流量拦截的记录,可以帮助你理解 ztunnel 的运行原理:

go 复制代码
kubectl -n istio-system logs -l app=ztunnel | grep -E "inbound|outbound"

你将看到例如下面的输出,注意里面的 inboundoutbound 是相对于 ztunnel 而言的。

入站流量示例

go 复制代码
2024-11-16T10:33:01.410751Z info access connection complete src.addr=10.28.2.19:58000 src.workload="bookinfo-gateway-istio-64fc6d75d6-s442s" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/bookinfo-gateway-istio" dst.addr=10.28.2.18:15008 dst.hbone_addr=10.28.2.18:9080 dst.service="productpage.default.svc.cluster.local" dst.workload="productpage-v1-57ffb6658c-tgbjs" dst.namespace="default" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-productpage" direction="inbound" bytes_sent=9603 bytes_recv=2052 duration="2110ms"

该日志描述了从 bookinfo-gateway-istioproductpage 的入站流量。流量经过 ztunnel 的 15008 端口,使用了 HBONE 隧道加密,身份通过 SPIFFE 确认。

出站流量示例

go 复制代码
2024-11-16T10:32:59.360677Z info access connection complete src.addr=10.28.2.18:51960 src.workload="productpage-v1-57ffb6658c-tgbjs" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/bookinfo-productpage" dst.addr=10.28.2.14:15008 dst.hbone_addr=34.118.226.6:9080 dst.service="details.default.svc.cluster.local" dst.workload="waypoint-7594b5b786-vgjwz" dst.namespace="default" dst.identity="spiffe://cluster.local/ns/default/sa/waypoint" direction="outbound" bytes_sent=794 bytes_recv=414 duration="40ms"

此日志描述了 productpage pod 访问 details 服务时的出站流量。流量由 ztunnel 使用 HBONE 隧道转发到 waypoint pod(15008 端口)。

总结

Istio ambient 模式通过 Istio CNI Node Agent 和 ztunnel 的协作,实现了无需 sidecar 的透明流量拦截。其关键特性包括:

  • 兼容性强:避免与底层 CNI 冲突。

  • 简化运维:无需修改应用程序代码,降低资源消耗。

  • 安全性高:通过 HBONE 实现端到端的加密传输。

后续文章中,我将进一步探讨 Istio ambient 模式的高级功能,包括 L7 流量路径分析和网络拓扑构建过程,敬请期待。

参考

  • • Maturing Istio Ambient: Compatibility Across Various Kubernetes Providers and CNIs2

  • • Istio Ambient Mesh 介绍3

  • • Kubernetes 官方文档:网络插件4

  • • HBONE5

  • • ztunnel traffic redirection6


引用链接

[1] Istio ambient 模式中的 iptables 规则解析: https://jimmysong.io/blog/istio-ambient-pod-iptables-injection/
[2] Maturing Istio Ambient: Compatibility Across Various Kubernetes Providers and CNIs: https://istio.io/latest/blog/2024/inpod-traffic-redirection-ambient/
[3] Istio Ambient Mesh 介绍: https://istio.io/latest/blog/2022/introducing-ambient-mesh/
[4] Kubernetes 官方文档:网络插件: https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/
[5] HBONE: https://istio.io/latest/docs/ambient/architecture/hbone/
[6] ztunnel traffic redirection: https://istio.io/latest/docs/ambient/architecture/traffic-redirection/

相关推荐
laoli_coding10 小时前
系统部署之框架选型方案
微服务·云原生·架构
蜀道山老天师13 小时前
一文吃透 K8s:Deployment 滚动更新与版本回滚
云原生·容器·kubernetes
hhb_61814 小时前
云原生AI工作流分布式调度实战
人工智能·云原生
阿里云云原生14 小时前
明文不扩散,日志仍可用:阿里云可观测敏感数据保护方案
云原生
J_yyy14 小时前
【关于微服务的深入理解】
微服务·云原生·架构
梦想的颜色15 小时前
【Docker 原理】Docker 数据持久化完全指南:三种挂载原理、数据卷实操、数据库落地实战
docker·云原生·数据持久化·volume·数据卷·容器挂载
@insist12317 小时前
系统规划与管理师-云原生系统建设规划与实践案例
云原生·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
腾讯数据架构师18 小时前
CubeStudio 平台简介:国产化云原生一站式开源人工智能平台(MLOps / 大模型全链路)
人工智能·云原生·开源·mlops·国产·maas·机器学习平台
Aipollo19 小时前
云原生项目从0到1:实践指南与核心步骤
云原生
@insist12319 小时前
系统规划与管理师-云原生系统规划核心考点解析
云原生·系统规划与管理师·软件水平考试·系统规划与管理工程师