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]如何选择适合您的数据面模式_服务网格-阿里云帮助中心

相关文章
|
2月前
|
人工智能 Kubernetes 调度
ModelDistribution:高效的大模型管理、分发和预热方案
阿里云ACK One舰队推出ModelDistribution方案,创新性采用OCI标准封装模型,实现跨地域高效分发与预热,解决大模型部署中的管理复杂、拉取慢、多集群同步难等痛点,助力企业平滑演进至多地域AI推理架构。
258 1
ModelDistribution:高效的大模型管理、分发和预热方案
|
2月前
|
测试技术
哪里不对改哪里!全能图像编辑模型Qwen-Image-Edit来啦
Qwen-Image-Edit基于20B Qwen-Image模型,融合视觉语义与外观控制,支持中英文文字精准编辑、风格迁移、IP创作等多重功能,具备SOTA性能,助力低门槛、高精度图像编辑。
1157 23
|
2月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
256 89
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
12421 1
|
3月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1198 1
|
6月前
|
机器学习/深度学习 数据采集 人工智能
建模世界偏好:偏好建模中的Scaling Laws
本文探讨了人类偏好建模的可扩展性,揭示其遵循Scaling Law。通过大规模训练(1.5B-72B参数)Qwen 2.5模型,使用1500万对论坛偏好数据,发现测试损失随规模指数增长而线性下降。研究提出WorldPM(Modeling World Preference),作为统一的人类偏好表征方法,在客观与主观评估中展现优势。实验表明,WorldPM可显著提升样本效率和多维度性能,成为高效的人类偏好微调基座。同时,文章反思主观评估复杂性,建议放弃简单预设,让模型自主发现人类偏好的深层规律,推动AI对齐新方向。论文与代码已开源。
209 24
|
6月前
|
消息中间件 Apache 双11
Apache RocketMQ + “太乙” = 开源贡献新体验
Apache RocketMQ 是 Apache 顶级项目,源于阿里巴巴,历经多年双十一考验。RocketMQ 联合“太乙”平台启动开源竞赛,提供贡献价值评价与奖金激励(最高 5000 元),助力开发者成为社区核心成员。竞赛包含详尽教程与自动搭建环境,促进技术生态繁荣,推动分布式消息处理技术发展。欢迎加入,共创开源未来!
250 1
|
5月前
|
运维 关系型数据库 分布式数据库
客户说|教学高峰不用愁:视源股份携手PolarDB,助力数字化教育资源高效管理
希沃作为教育数字化领军品牌,面对业务潮汐波动、数据库弹性不足及运维复杂等挑战,选择阿里云PolarDB数据库。借助其Serverless弹性伸缩、免运维、HTAP能力,希沃实现资源高效利用,降低存储与计算成本,显著提升系统稳定性与DBA运维效率,保障直播、在线课堂等高并发场景平稳运行,助力教育数字化持续创新。
176 0
|
6月前
|
机器学习/深度学习 人工智能 算法
检索增强预训练框架MaskSearch:让AI更聪明地“找答案”
通义实验室发布的MaskSearch预训练框架,让AI具备“主动搜索+多步推理”能力,更精准回答复杂问题。其核心是检索增强掩码预测(RAMP)任务,通过监督微调与强化学习结合,使小模型性能媲美大模型。实验表明,在多个问答数据集中,经过RAMP预训练的模型表现优异,尤其在多跳推理任务中优势显著。此外,课程学习策略帮助模型从简单到复杂逐步提升推理能力。相关论文与代码已开源。
173 0
实验:逆向分析sample_mal.exe文件
实验:逆向分析sample_mal.exe文件