内核级流量治理引擎Kmesh八大新特性解读
摘要:Kmesh 创新性地提出了基于内核的无 Sidecar 流量治理方案,将流量治理下沉至内核层面,当前Kmesh支持“Kernel-Native”和“Dual-Engine”两种模式。
本文分享自华为云社区《内核级流量治理引擎 Kmesh v0.5 发布!进击的Sidecarless服务网格》,作者:云容器大未来。
我们非常高兴地宣布 Kmesh v0.5.0 的发布。首先,感谢我们的贡献者在过去两个月中的辛勤工作。在 v0.5.0 版本中,我们进行了许多重要的增强,包括命令行工具 kmeshctl、更全面的端到端测试覆盖、底层 eBPF 信息的可视化改进、可观测性增强、完整的重启支持、CNI 安装程序的改进以及 XDP 程序中的 RBAC 支持。此外,在本次发布周期中,我们修复了许多关键的 Bugs,重构了部分关键代码,并增加了更多测试覆盖,使 Kmesh 更加稳定和健壮。
Kmesh背景回顾
尽管以 Istio 为代表的服务网格在过去几年得到了广泛的关注并取得了显著的知名度,但 Istio 社区曾经重点推广的 Sidecar 模式在资源开销和数据链路延迟等方面会对工作负载产生显著影响,因此用户在选择落地方案时仍然相对谨慎。此外,Sidecar 模式的一个主要缺点是其与业务容器的生命周期强绑定,无法独立进行升级。为了解决这些问题,Kmesh 创新性地提出了基于内核的无 Sidecar 流量治理方案,将流量治理下沉至内核层面。当前Kmesh支持“Kernel-Native”和“Dual-Engine”两种模式。
对于“Kernel-Native”模式,由于 eBPF 技术非常适合四层流量治理,并且结合可编程内核模块,可以实现七层流量编排。Kmesh 最初完全依赖 eBPF 和内核模块来实现 L4-L7 的治理。Kmesh 采用随流治理策略,不会在服务通信过程中增加额外的连接跳数,与 Sidecar 模式相比,服务之间的通信连接数从三条减少至一条。“Kernel-Native”模式的架构图如下:
同时,为了增强七层协议的治理能力,今年 Kmesh 引入了一种新的治理模式——“Dual-Engine”模式,利用 eBPF 将流量转发到 kmesh-waypoint 进行高级的七层协议治理。这是一种更灵活的分层治理模型,能够按需满足不同用户的多样化需求。
Kmesh 0.5版本关键特性解析
Kmesh重启时的零停机时间
现在,Kmesh 可以在重启后优雅地重新加载 eBPF Map 和程序,且不需要在重启后重新注册命名空间或特定 Pod。这意味着在重启期间,流量不会中断,这对用户来说是一个巨大的好处。在 kmesh-daemon 重启后,eBPF Map 配置将自动更新为最新状态。
如上图所示通过将 eBPF程序 pin 在内核目录上,kmesh 关闭后 eBPF 依然可以正常对流量进行治理,保证 kmesh 重启过程中服务不中断。
在 kmesh 重启后,将 bpf_map 中存放的 config 与最新获取的 config 作对比,将 bpf_map 中的 config 更新至最新。
在 v0.4.0 版本中,Kmesh 重启后需要重新启动所有由 Kmesh 管理的 Pod,以便重新管理,因为该管理是由 CNI 插件触发的。现在这一过程已在 kmesh-daemon 中完成,因此 Pod 不需要重新启动即可重新管理。
可观测性增强
现在,Kmesh 支持 L4 访问日志,使用户能够清晰地可视化 Kmesh 管理的流量。请注意,访问日志默认未启用。您可以通过修改 Kmesh 中 spec.containers.args 的 --enable-accesslog 参数来启用访问日志功能。我们还将支持使用 kmeshctl 动态启用访问日志。
访问日志的示例如下:
accesslog: 2024-09-14 08:19:26.552709932 +0000 UTC src.addr=10.244.0.17:51842, src.workload=prometheus-5fb7f6f8d8-h9cts, src.namespace=istio-system, dst.addr=10.244.0.13:9080, dst.service=productpage.echo-1-27855.svc.cluster.local, dst.workload=productpage-v1-8499c849b9-bz9t9, dst.namespace=echo-1-27855, direction=INBOUND, sent\_bytes=5, received\_bytes=292, duration=2.733902ms
其中各个字段的含义为:
同时,为 Kmesh 适配的 Grafana 插件也已添加,以便更好地可视化各维度的监控指标。此外,可观测性方面的一些关键问题已得到修复,有效提高了其准确性和稳定性。
将授权执行下沉到XDP程序中
在 v0.3.0 版本中,Kmesh 已支持 L4 RBAC,但之前的解决方案是在用户空间中进行 RBAC,这在性能和功能上存在一些问题。现在我们已将其下沉到 XDP eBPF 中,这项功能将真正可用。目前,鉴权规则已转移到 eBPF Map中,这使得能够完全在 eBPF 程序中执行授权。当授权结果为拒绝时,XDP 程序会直接丢弃请求数据包,从而使客户端能够检测到连接失败。
下沉到 XDP 程序的关键是使用了 eBPF 的 tail-call 机制,将不同的匹配规则通过 tail-call 串联起来,遵循了原先在用户空间进行鉴权的逻辑。
如上图所示,集群内配置的鉴权规则通过消息订阅机制,被写入 eBPF Map。Pod 上入方向的流量在建链时,会在 XDP 程序中进行鉴权规则匹配,如果鉴权结果为拒绝,则包被丢弃;如果鉴权结果为允许,则流量将通过协议栈发送到对应的 App 进程。
更好的调试能力
我们新增了命令行工具 kmeshctl!现在,您无需进入相应的 Kmesh 守护进程 Pod 来调整 Kmesh 守护进程的日志级别或转储配置。您可以直接使用 kmeshctl:
\# 调整 kmesh-daemon 日志级别(例如,debug | error | info) kmeshctl log kmesh-6ct4h --set default:debug \# 转储配置 kmeshctl dump kmesh-6ct4h workload
未来将为 kmeshctl 添加更多功能,以便用户更好地管理和调试 Kmesh。
更好的底层BPF Map可视化
之前我们有接口 /debug/config_dump/ads 和 /debug/config_dump/workload 来输出 Kmesh 守护进程中缓存的配置内容。由于各种原因,Kmesh 守护进程缓存中的配置与实际的 eBPF 可能并不完全一致。如果我们能获取阅读友好的 eBPF 信息,将更有助于我们进行故障排查。现在,我们可以通过接口 /debug/bpf/* 获取这些信息。这些信息也将被集成到 kmeshctl 中,方便查看,并且可以进一步扩展,以判断底层 eBPF 是否与 Kmesh 守护进程中的配置同步。
\# Get eBPF info in dual-engine mode kubectl exec -ti -n kmesh-system kmesh-6ct4h -- curl 127.0.0.1:15200/debug/config_dump/bpf/workload \# Get eBPF info in kernel-native mode kubectl exec -ti -n kmesh-system kmesh-6ct4h -- curl 127.0.0.1:15200/debug/config_dump/bpf/ads
改进CNI安装程序
由于 CNI 安装程序是 Kmesh 守护进程,如果 kmesh-daemon 意外崩溃或机器突然断电,CNI 将无法卸载 CNI 配置。如果 kubeconfig 的 token 过期,则 kmesh-daemon 异常退出后,任何 Pod 都无法成功启动。因此,我们采取了以下两种方法来解决此问题:
在 start_kmesh.sh 的末尾清理 CNI 配置。
在CNI安装程序中添加一个单独的Go协程,一旦token文件被修改,更新 kubeconfig 文件。这可以确保 kubeconfig 文件不容易过期。
支持HostNetwork工作负载
现在,对于 Kmesh 双引擎模式,我们支持通过 HostNetwork Pods 访问服务。
性能提升
在双引擎模式中,我们通过使用本地缓存来优化工作负载和服务响应处理期间的 BPF Map更新,避免了对 BPF Map的循环遍历。
关键Bug修复
我们还修复了一些重大 Bug:
通过不删除前端Map,防止在工作负载资源更新期间失去流量控制。
来自命名空间 waypoint 的流量将再次重定向到 waypoint,避免了死循环。现在我们跳过了来自 waypoint 的流量管理。
修复了当 waypoint 处理非 HTTP TCP流量时,会意外返回HTTP/1.1 400 Bad Request 的问题。#681
致谢贡献者
Kmesh v0.5.0 版本包含了来自14 位贡献者的 567 次代码提交,在此对各位贡献者表示由衷的感谢:
我们始终以开放中立的态度发展 Kmesh,持续打造 Sidecarless 服务网格业界标杆方案,服务千行百业,促进服务网格健康有序的发展。Kmesh 当前正处于高速发展阶段,我们诚邀广大有志之士加入!
参考链接
Kmesh Release v0.5.0: https://github.com/kmesh-net/kmesh/releases/tag/v0.5.0
Kmesh GitHub: https://github.com/kmesh-net/kmesh
Kmesh Website: https://kmesh.net/
【更多华为云云原生干货推荐】**华为云云原生王者之路集训营
华为云云原生王者之路集训营
为帮助广大技术爱好者快速掌握云原生相关技能,华为云云原生团队与华为云学院联合CNCF开源软件大学启动人才培养计划,推出《华为云云原生王者之路集训营》,从云原生基础知识介绍到最佳实践讲解、底层原理和方案架构深度剖析,层层深入,满足不同云原生技术基础和学习目标人群的需求。本课程还精选数十个企业典型应用场景,作为学员上机实践案例,帮助学员将所学技术快速与企业业务相结合,服务于企业生产。
点击免费参加华为云云原生王者之路集训营:https://edu.huaweicloud.com/roadmap/cloudnative1.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大模型存储选型 & JuiceFS 在关键环节性能详解
从去年开始,LLM大语言模型领域发展迅速、如 LLaMA、ChatGLM、Baichuan、Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加。众多企业也开始基于这些基础模型做 post-training 的相关工作,以开发特定垂直领域的模型实现应用落地。 AI 模型的参数规模呈指数级增长,出现了越来越多的千亿甚至万亿参数的通用大模型。例如,最新的 llama3 模型就提供了 405B、70B 和 8B 三个版本,模型参数量不断刷新,给企业存储的成本与规划带来很大挑战。除了模型规模的增长,大模型开发的复杂流程和高效的数据流转也对存储系统提出了更高的要求,这直接影响到整个流程的效率。 另外,大规模训练和推理对于GPU算力的需求,导致算力的供给越来越多的转变为多云、多region 的模式,在这种情况下,又给用户带来了数据集、模型在多区域间进行分发、同步以及一致性管理的挑战。 在本文中,我们将简要介绍我们对大模型存储选型的思考、开发中不同阶段的工作负载需求,包括成本、性能和功能等多个维度,并探讨如何通过 JuiceFS 帮助用户优化这些环节。 01...
- 下一篇
🔥 Solon 3.0 引入 SqlUtils :数据库操作的返璞归真
Solon 3.0 版本发布后,带了一个新的特性 —— SqlUtils。这一全新的数据库操作框架给开发者提供了更加透明、灵活的数据库交互方式,可显著提升了代码的透明度和维护性。本文将浅入探讨 SqlUtils 的引入背景、使用方法以及它对市场和开发者群体的潜在影响。 引入 SqlUtils SqlUtils 作为 Solon 3.0 的重要更新之一,在传统的 ORM 之外,提供一种返璞归真的小工具风格接口。为开发者提供了一种更直接、更原始的数据库操作方式。 查询操作 使用 SqlUtils 体验非常直接,支持任意代码,任意场景(尤其是复杂的查询统计或分析)。开发者可以通过占位符的参数形式确保查询安全;SqlUtils 还支持“流式读取”,可以用极少的内存读取超大量的记录;此外,还可以使用 SqlBuilder 进行复杂SQL语句的构建,为数据操作提供了直接而全面的支持。 插入数据 SqlUtils 同样在数据插入方面提供了丰富的 API 接口、尤其是“批量执行”。SqlUtils 能够适应不同场景下的数据管理需求,为开发者提供了更多的选择空间。 总结 引入 SqlUtils 后,So...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19