ASM Ambient 模式下如何实现 L4 代理优雅升级

简介: ASM 在 1.25 正式支持了 Ambient 模式。在 Ambient 模式下,您可以获得更好的数据面转发性能和更低的资源占用,并且仍然可以使用网格提供的绝大部分高级功能。然而由于目前 Ztunnel 组件代理了 Node 上的所有流量,很多用户对 Ztunnel 升级或重启过程中的流量中断十分关心。本文我们将详细解释Ztunnel 升级时的下线原理以及最佳实践。

背景

Ztunnel 是节点级别的 L4 代理,进出 Pod 的所有流量都会由对应 Node 的Ztunnel 处理,执行 mTLS 加解密以及身份认证后再转发到实际的 Pod 中。如果目标服务存在 Waypoint 代理的话,Ztunnel 也会将流量转发给对应的 Waypoint,由 Waypoint 进行更进一步的处理。典型的 Ambient 流量路径如下图所示:

640 (23).png


图片来自ASM官网文档:如何选择适合您的数据面模式_服务网格-阿里云帮助中心[1]

原理解释

Ztunnel 的最高要求就是最小化流量中断。


然而,4 层是一个很特殊的位置:

  • TCP 是有状态的,因此不能简单的将状态传递给其他进程。
  • Ztunnel 不会执行 7 层操作,所以无法通知应用:请连接到新的 Ztunnel。


在这样的限制下,目前 Ztunnel 可以做到以下两点,尽可能的保证流量无损:

  1. 确保在任何时间,任何新建的连接都会成功。从来不会丢弃一个新建的连接。
  2. 给老的 Ztunnel 留一段可以继续处理已有连接的时间。

Ztunnel滚动流程


利用 Linux 的底层 API,我们可以实现两个进程在同一个端口开启监听,Ztunnel 的滚动过程正是利用了这一点。具体的滚动流程如下:

  1. 新的 Ztunnel 启动。
  2. ASM CNI 组件将当前 node 上所有 pod 的状态发送给新的 Ztunnel。Ztunnel为每个运行在当前 node 上的 pod 创建监听,然后将自己标记为“ready”。
  3. 此时有两个 Ztunnel 在运行,新建的连接将会被分配到其中之一。
  4. 短暂等待之后,Kubernetes 开始停止老的 Ztunnel。这个是通过发送一个SIGTERM 信号实现的。Ztunnel 会捕获这个信号,然后开始排水。
  5. 开始排水后,老的 Ztunnel 就会关闭自己所有的监听。此时只有新的 Ztunnel 在监听。请注意,这样做确保了任何时候至少有一个 Ztunnel 在监听。
  6. 此时老的 Ztunnel 不再接受新的连接,它还是会继续处理已有连接。
  7. 在排水超时后,老的 Ztunnel 会强制终止所有未停止的连接。

此时下线过程结束。

一定程度的优雅下线


由于 Ztunnel 工作在 4 层,无法像 HTTP/gRPC 一样实现高级的优雅下线。但是只要配置合适的优雅下线时间,依然可以很大程度减少重启对业务的影响。

如果客户端确实无限长时间的使用一个 TCP 连接,那这种中断是不可避免的。

但是幸运的是,大部分协议都支持配置最大连接时间,并且不会过度依赖 TCP 连接不中断。

下面我们将通过实际的压测来展示 Ztunnel 优雅下线的效果。

模拟测试

这里我们演示了一个典型场景:客户端访问 ASM 网关,ASM 网关访问 httpbin服务。httpbin 服务已经开启了 Ambient,所有进入 httpbin 服务的流量都会经过 Ztunnel。

测试 Client 在集群内,且未开启 Ambient。Client 使用 ClusterIP 访问 ASM网关,减少其他网络因素影响。

1.未开启优雅下线

fortio load -qps 0 -c 1000 -t 60s -timeout 10s istio-ingressgateway.istio-system/status/418
Code 418 : 289965 (100.0 %)
Code 503 : 5 (0.0 %)
All done 289970 calls (plus 1000 warmup) 208.285 ms avg, 4700.8 qps
fortio load -qps 0 -c 100 -t 60s -timeout 10s istio-ingressgateway.istio-system/status/418
Code 418 : 297514 (100.0 %)
Code 503 : 4 (0.0 %)
All done 297518 calls (plus 100 warmup) 20.180 ms avg, 4946.8 qps

2.设置优雅下线时长 120s

为了确保测试时长覆盖 Ztunnel 的启动范围,此处延长了测试间隔。

fortio load -qps 0 -c 1000 -t 200s -timeout 10s istio-ingressgateway.istio-system/status/418
Code 418 : 961124 (100.0 %)
Code 503 : 2 (0.0 %)
All done 961126 calls (plus 1000 warmup) 208.484 ms avg, 4766.9 qps
fortio load -qps 0 -c 100 -t 200s -timeout 10s istio-ingressgateway.istio-system/status/418
Code 418 : 960527 (100.0 %)
Code 503 : 1 (0.0 %)
All done 960528 calls (plus 100 warmup) 20.825 ms avg, 4799.2 qps

结果分析

说明:本文中由于 503 的数量实在太少,都是个位数。所以上面的对比均进行了多次。

开启优雅下线之前,失败的请求数都集中在 4~6 个。

开启优雅下线之后,失败请求数只有 1~2 个。


本文的测试比较简单,但是仍然可以配置优雅下线之后 503 有明显减少。从以上结果可以看出:

  • 长 TCP 连接的中断不可避免。但是由于 Ztunnel 启动的特殊设计,任何时候都可以建连成功,所以受影响的请求很少。在我们高并发测试的情况下,只有个位数的请求受到了影响。
  • 对于有限长的 TCP 连接,通过合理的配置优雅下线时间,可以显著减少流量中断影响我们为 Ztunnel 配置 120s 优雅下线时间后,失败的请求数有显著下降。

最佳实践

如果您的业务对于 TCP 中断十分敏感,我们建议您遵从以下最佳实践:

  1. 业务主动配置类似 maxConnectionAge、maxConnectionDuration 之类的参数。因为即使不加入网格,越长时间的 TCP 连接中断的风险也越高。配置之后您可以很好的和 Ztunnel 配合做到无损升级。
  2. 启用 ASM Ambient 模式之后,Ztunnel 有开箱即用的可观测能力,您可以通过对 Ztunnel 日志进行分析,获取到您所有 TCP 连接的 Duration,然后将其配置为 Ztunnel 优雅下线时间即可。本文测试时选取的优雅下线时间就是根据Ztunnel 日志中的连接 Duration 得出。


本次测试的场景中,您可以在网关上通过 DestinationRule 为 httpbin 服务配置 maxConnectionDuration,理论上可完全规避流量中断。

总结

在 ASM 1.25 版本中,Ambient 模式的核心能力已经稳定,并且良好的适配了阿里云容器服务环境,期待您的使用与反馈。

ASM 官方文档:如何选择适合您的数据面模式_服务网格-阿里云帮助中心[1]

参考文档:

[1]如何选择适合您的数据面模式_服务网格-阿里云帮助中心

相关文章
|
30天前
|
人工智能 Kubernetes 调度
ModelDistribution:高效的大模型管理、分发和预热方案
阿里云ACK One舰队推出ModelDistribution方案,创新性采用OCI标准封装模型,实现跨地域高效分发与预热,解决大模型部署中的管理复杂、拉取慢、多集群同步难等痛点,助力企业平滑演进至多地域AI推理架构。
174 1
ModelDistribution:高效的大模型管理、分发和预热方案
|
30天前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
197 89
|
30天前
|
测试技术
哪里不对改哪里!全能图像编辑模型Qwen-Image-Edit来啦
Qwen-Image-Edit基于20B Qwen-Image模型,融合视觉语义与外观控制,支持中英文文字精准编辑、风格迁移、IP创作等多重功能,具备SOTA性能,助力低门槛、高精度图像编辑。
656 23
|
1月前
|
SQL 人工智能 运维
一场由AI拯救的数据重构之战
本文以数据研发工程师小D的日常困境为切入点,探讨如何借助AI技术提升数据研发效率。通过构建“数研小助手”智能Agent,覆盖需求评估、模型评审、代码开发、运维排查等全链路环节,结合大模型能力与内部工具(如图治MCP、D2 API),实现影响分析、规范检查、代码优化与问题定位的自动化,系统性解决传统研发中耗时长、协作难、维护成本高等痛点,推动数据研发向智能化跃迁。
182 29
一场由AI拯救的数据重构之战
|
28天前
|
人工智能 自然语言处理 前端开发
最佳实践2:用通义灵码以自然语言交互实现 AI 高考志愿填报系统
本项目旨在通过自然语言交互,结合通义千问AI模型,构建一个智能高考志愿填报系统。利用Vue3与Python,实现信息采集、AI推荐、专业详情展示及数据存储功能,支持响应式设计与Supabase数据库集成,助力考生精准择校选专业。(239字)
141 12
|
30天前
|
消息中间件 人工智能 Kafka
AI 时代的数据通道:云消息队列 Kafka 的演进与实践
云消息队列 Kafka 版通过在架构创新、性能优化与生态融合等方面的突破性进展,为企业构建实时数据驱动的应用提供了坚实支撑,持续赋能客户业务创新。
285 21
|
1月前
|
消息中间件 人工智能 安全
云原生进化论:加速构建 AI 应用
本文将和大家分享过去一年在支持企业构建 AI 应用过程的一些实践和思考。
357 23
|
1月前
|
API 微服务
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态。
127 15
|
27天前
|
存储 Cloud Native 关系型数据库
PolarDB-PG IMCI实战解析:深度融合DuckDB,复杂查询性能最高百倍级提升
阿里云PolarDB PostgreSQL版创新融合DuckDB向量化引擎,推出IMCI列存索引,实现HTAP一体化。支持实时交易与复杂分析并行,查询性能提升60-100倍,兼容PG生态,秒级数据同步,助力企业高效挖掘数据价值。
145 0
|
28天前
|
人工智能 前端开发 API
一人挑战一支研发团队,3步搞定全栈开发
本文是 Qwen3-Coder 挑战赛教程第四期,我将带你完整走通一个真实项目案例:从零搭建一个“AI 舞蹈生成器”网站——上传一张人物照片,点击“立即生成”,即可获得一段该人物跳舞的动态视频。 整个过程仅需三步,无需前端、后端或模型部署经验,真正实现“说话即开发”。
165 0