内核级流量治理引擎Kmesh八大新特性解读
本文分享自华为云社区《内核级流量治理引擎 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
内核级流量治理引擎Kmesh八大新特性解读的更多相关文章
- jQuery Mobile 1.1八大新特性介绍
随着HTML 5时代的来临,移动开发开始进入了一个新的时代,现在只需要懂得HTML5,配合一定的开发框架,就可以开发出十分漂亮的HTML5的移动应用.在众多的 移动HTML5开发框架中,比较著名的是j ...
- 在WWDC 2014上,没提到的iOS 8 八大新特性
今天凌晨1点,36氪如约为大家研磨出WWDC 2014全程 "贴身直播"(我不得不佩服牺牲个人时间,熬夜为大家奉上好文的5位氪星人:JasonZheng.WANGJINGYU.pa ...
- 5分钟了解Java 12 八大新特性
Java 12 终于发布了,我们一起来看一看 Java 12 中的新特性.通过本文可以在5分钟内快速了解 Java 12 新特性. 1 Switch 表达式 使用Java 12,switch不仅可以作 ...
- Spring Boot 2.0正式发布,新特性解读
作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...
- MongoDB 4.2 新特性解读 (转载)
MongoDB World 2019 上发布新版本 MongoDB 4.2 Beta,包含多项数据库新特性,本文尝试从技术角度解读. Full Text Search MongoDB 4.2 之前,全 ...
- 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...
- 跨时代的MySQL8.0新特性解读
目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...
- Java 8新特性解读
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
- Java11新特性解读
在去年的9月26日,Oracle官方宣布Java11正式发布,这是Java大版本周期变化后的第一个长期支持版本,非常值得关注.Java9和Java10都在很短的时间内就过渡了,所以,Java11将是一 ...
- Atitit.linux 内核 新特性 新功能
Atitit.linux 内核 新特性 新功能 1. Linux 3.2内核新特性 2012-02-12 22:41:471 1.1. EXT4:支持更大的块2 1.2. BTRFS:更快的数据清理 ...
随机推荐
- vscode远程连接远程主机上的docker —— 设置命令 —— -p 5001:5001
突然有这么一个需求,就是使用windows上vscode远程连接到远端linux主机上的docker容器上做开发,各种配置后发现总是在远端主机上创建project时候失败,最后总是在创建远端主机上do ...
- stm32 F103C8T6 4x4矩阵键盘使用
首先感谢 江科大 的stm32入门课程 受益匪浅.推荐有兴趣的朋友去看看. 先看看我用的矩阵键盘是啥样的(很常见的一种) 接线如图(其他型号根据自己需求接上GPIO口) 代码基于stm大善人的代码修改 ...
- MySQL 优化慢查询
查询以SELECT 语句的形式执行数据库中的所有查找操作.调整这些语句是重中之重,无论是实现动态网页的亚秒响应时间,还是缩短数小时生成大量夜间报告的时间. 此外SELECT语句,进行查询调谐技术也适用 ...
- 玩转内核链表list_head,3个超级哇塞的的例子
在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head.虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作li ...
- 使用Istio服务网格进行微服务网络治理
在Rainbond中,用户可以对不同的应用设置不同的治理模式,即用户可以通过切换应用的治理模式,来按需治理应用,这样带来的好处便是用户可以不被某一个ServiceMesh框架所绑定,且可以快速试错,能 ...
- idea下spring切换jdk版本
1.首先打开项目配置设置 2. 修改project中的配置 3. 修改modules中的配置 这个方法不需要修改pom.xml文件 如果有问题请指正 及时修改 2022年9月10日16:42:16
- Daph:新一代流批一体数据集成与数据处理工具
Daph源码位于gitee,地址是https://gitee.com/dasea96/daph 概述 Daph的中文名称是大副,大副是职位仅低于船长的船舶驾驶员,甲板部(驾驶部)负责人,船长的主要助手 ...
- cubeide汉化包地址
http://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site 具体步骤看洋桃物联网入门30步的视频
- 使用命令行 Windows 修改文件权限
修改文件访问权限的命令行工具是 icacls,其使用语法是这样的: icacls <file> # 查看文件的访问权限 icacls <file> /grant <SID ...
- 对GEE下载时分块影像进行镶嵌(GDAL)
前言 GDAL自带的镶嵌功能比较单一,只能将图像简单拼接到一起,不能实现直方图匀色以及羽化等功能,但是对GEE导出的分块影像进行镶嵌较为适合. 优点: 使用代码,镶嵌多个影像较为简便 GDAL较为稳定 ...