本文分享自华为云社区《Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格》,作者: 云容器大未来。

近日 Kmesh 发布了 v0.4.0 版本,感谢社区的贡献者在两个多月的时间里做出了巨大的努力,使得 Kmesh 取得功能完整度、稳定性、可靠性的多重提升。当前 Kmesh 相较业界其他方案已经具备显著的资源开销小和低延时等优势,后续我们会继续在核心功能和大规模稳定性等方面重点投入,争取尽快达到 GA(生产可用)。

Kmesh 背景回顾

尽管服务网格已经在过去几年持续曝光,获得了很大的知名度,但是 Sidecar 模式在资源开销、数据链路时延等方面对工作负载产生了很大的影响。所以用户在落地选型时,还是比较谨慎。除此之外,Sidecar 模式还有一个比较大的缺点是 Sidecar 与业务容器生命周期完全绑定,无法做到独立升级。

因此 Kmesh 创新性的提出基于内核的 Sidecarless 的流量治理方案,将流量治理下沉到内核以解决 Sidecar 模式用户关心的一些问题。eBPF 技术非常适合四层的流量治理,加上可编程内核模块可以进行七层的流量编排。Kmesh 最早完全通过 eBPF 和内核模块进行 L4-L7 的治理。Kmesh 采用随流治理的策略,不会额外增加服务通信过程中的连接跳数,相比 Sidecar 模式,服务之间的通信连接数从三条减少到一条。

为了丰富七层协议的治理能力,今年 Kmesh 增加了一种新的治理模式 Workload:远端流量治理,利用 ebpf 将流量转发到 kmesh-waypoint,进行高级的七层协议治理,这是一种更加灵活的分层治理模型,能够按需满足不同用户的需求。

目前 Kmesh 基于 Istio 控制面,提供了新的服务网格数据面引擎,详细的架构如下:

Kmesh v0.4版本关键特性解析

IPv6支持

以前 Kmesh 只支持采用 IPv4 通信的服务治理,但是当前 Kubernetes 集群已经默认支持双栈集群,我们不能假设服务只采用 IPv4 协议通信,因此在 0.4 版本中我们适配了 IPv6 的协议特征,支持了 IPv6 的服务治理。

值得注意的是:即使在 IPv4 集群中,Java 应用在通信时,默认采用 IPv6 地址族进行通信,所以如果需要采用 Kmesh 对 Java 服务进行治理,请一定要升级 Kmesh 0.4 版本。

IPv6 目前只在 Workload 模式下完整支持。请期待下一个版本中,Kmesh 本地模式(流量治理完全下沉内核)也将完全支持 IPv6 协议族。

细粒度的流量治理

v0.4 版本,除了按照 Namespace 进行服务的纳管以外,我们还支持了按照 pod 粒度进行流量的纳管治理。一定程度上增加了灵活性,满足了客户只针对一个命名空间下的特定工作负载进行治理的需求。

特定 Pod 纳管

kubectl label pod <podName> istio.io/dataplane-mode=kmesh -n {namespace}

整个 Namespace 纳管

kubectl label ns <namespace> istio.io/dataplane-mode=kmesh

Kmesh 通过检查 Pod 及 Namespace 上面标签,在不同的组件中进行 Pod 的纳管。

  • 场景一:Pod 创建时已经打上了标签,那么 kmesh 通过 Kmesh-cni 在容器网络初始化的时候通知 kmesh eBPF 程序进行纳管,保证工作负载启动之前完成纳管,不会遗漏任何数据包的治理。
  • 场景二:在 pod 启动之后,再为 Pod 打上 istio.io/dataplane-mode:kmesh标签,那么 Kmesh-daemon 会监听 Pod 事件,检查到标签更新后,通知 kmesh ebpf 程序进行纳管。
  • 场景三:去掉 istio.io/dataplane-mode:kmesh 标签,允许 Pod 不被 Kmesh 纳管。

这种纳管方式更加灵活,也方便了用户在发现服务访问故障之后,快速进行故障隔离,定位定界。

支持集群外部服务治理

在服务网格中,我们可以通过 ServiceEntry 定义网格外部服务,一般为 DNS 类型。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc
spec:
hosts:
- news.google.com
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS

对于这种服务,控制面为其生成 STRICT_DNS 类型的 Cluster, endpoint 地址为域名。

eBPF 程序不能进行 DNS 解析,因此不能根据域名进行 DNAT。在 Kmesh 0.4 版本中,我们新增了 DNS 解析模块,在用户态首先进行 DNS 解析,然后重写 Cluster 将域名替换成IP地址,再刷新给 eBPF 程序进行 DNAT。典型工作原理如图所示:

DNS 类型服务的治理,大大拓展了 Kmesh 服务治理的范畴,由 Kubernets 集群,扩展到外部服务。

基于 eBPF 的轻量化可观测

可观测性是服务网格中很重要的基础能力,对于了解数据面通信的状态具有重大意义,可以基于监控进行告警。Kmesh 采用了分层观测架构,在治理数据面,内核中存在大量可用于观测的指标数据,Kmesh 通过 eBPF 以极低的代价将这些微观、细粒度指标收集起来,并支持链路级、Pod 级等多维度信息采集;并通过 ringbuf map 上报给 kmesh-daemon 组件,daemon 中根据实时订阅的观测数据,再组织加工成用户可理解的可观测信息。

当前 Kmesh 已支持以下四种监控指标,每一种指标都通过标签标识源和目的应用,用户还可以配置 Prometheus 进行采集。

  • kmesh_tcp_connections_opened_total
  • kmesh_tcp_connections_closed_total
  • kmesh_tcp_received_bytes_total
  • kmesh_tcp_sent_bytes_total

接下来,社区将继续丰富metrics、access log等观测的采集,并完善与Prometheus、Grafana 等观测平台的对接。

在线日志级别调整

动态日志级别调整对于故障诊断具有很大的帮助,早期的版本,如果要分析 bpf 数据面的问题,获取更详细的定位日志,你需要修改代码并重新构建镜像,整个过程非常低效;新版本中被彻底改善,我们支持了在线日志级别调整,用户通过 Kmesh 运维命令,可实时调整用户态 Kmesh-daemon 和 bpf 程序的日志级别。

使用样例如下:

#Adjust kmesh-daemon log level (e.g., debug | error | info)
kubectl exec -ti -n kmesh-system kmesh-6ct4h -- kmesh-daemon log --set default:debug
#Adjust kmesh eBPF data plane log level
kubectl exec -ti -n kmesh-system kmesh-6ct4h -- kmesh-daemon log --set bpf:debug

除了新特性的加入,v0.4 版本在可维护性、大规模性能、可测试性等方面也做出了诸多改进。

大规模集群支持

生产环境中,根据部署业务的不同,集群规模可大可小,对于 Kmesh 来说,大规模集群更能展现 Kmesh 架构的优势,经过评估,Kmesh 需要支持 5000 服务,10万 pod 级的集群管理,以满足绝大多数生产使用诉求。

对于远端模式,Kmesh 修改了 bpf map 的创建模式,支持按需申请 bpf map 中的记录,这样我们可以很容易的支持大规模集群,且不引入冗余的内存开销;

对于本地模式, bpf map 更新慢的问题一直困扰着我们,原本刷新一条规则需要几十甚至上百毫秒,0.4 版本,我们优化了 map-in-map 的初始化逻辑,通过空间换时间的策略,消除了 map-in-map 的刷新耗时,将规则的刷新降低到 ms 以内,这为后续支持大规模奠定了坚实的基础。

E2E测试

Kmesh 当前正处于快速膨胀的成长期,新特性正源源不断的加入到 Kmesh 中,如何保障社区的整体质量,确保 Kmesh 平稳有序的向前发展是社区面临的重要挑战;虽然社区已经有 UT test 做功能防护,但我们还缺少黑盒视角、集群级的功能防护;为此社区引入了 E2E 测试框架,并将其部署在 PR 门禁中,这样,每个新 PR 提交时,就可以及时检查新提交对于已有功能的影响,这对于 Kmesh 非常有用,当前 E2E 测试框架已经部署上线,并增加了部分测试用例,后续将不断丰富测试集,也欢迎社区的小伙伴们共同完善Kmesh测试防护网。详细的运行E2E测试请参考https://kmesh.net/en/docs/developer/e2e-guide/

加入社区贡献

我们希望借助在 Istio 社区长期的积累,始终以开放中立的态度发展 Kmesh,打造 Sidecarless 服务网格业界标杆方案,服务千行百业,促进服务网格健康有序的发展。Kmesh 当前正处于高速发展阶段,我们诚邀广大有志之士加入!

参考链接

[1] Kmesh Website:https://kmesh.net/

[2] Kmesh Release v0.4.0:https://github.com/kmesh-net/kmesh/releases/tag/v0.4.0

[3] 可观测性设计:https://github.com/kmesh-net/kmesh/blob/main/docs/proposal/observability.md

点击关注,第一时间了解华为云新鲜技术~

Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格的更多相关文章

  1. Cilium 1.11 发布,带来内核级服务网格、拓扑感知路由....

    原文链接:https://isovalent.com/blog/post/2021-12-release-111 作者:Cilium 母公司 Isovalent 团队 译者:范彬,狄卫华,米开朗基杨 ...

  2. 产品质量管理利器,华为云发布CodeArts Defect缺陷管理服务

    摘要:近日,华为云CodeArts Defect缺陷管理服务正式上线,提供结构化缺陷跟踪流程和标准化的质量度量模型. 本文分享自华为云社区<产品质量管理利器,华为云发布CodeArts Defe ...

  3. 大规模web 服务开发技术

    <大规模web 服务开发技术> 是一本讲解大型Web 应用的入门级书籍,能够让我们接触到大应用的知识点. 目录如下: 第1章  大规模Web服务的开发定位——掌握整体第2章  大规模数据处 ...

  4. 大规模web服务开发技术

    大规模web服务开发技术 总评        这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接 ...

  5. 大规模微服务架构下的Service Mesh探索之路

    小结: 1. 第一.二代Service Mesh meetup-slides/敖小剑-蚂蚁金服-大规模微服务架构下的Service Mesh探索之路.pdf https://github.com/se ...

  6. WebService-01-使用jdk发布第一个WebService服务并调用

    Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...

  7. 读书笔记--大规模web服务开发技术

    总评        这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接地气.      书的内容 ...

  8. 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能

    完全国人自主研发原创的智能软件路由器即将发布: 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能 智能软件路由器 BDS 简要介绍 http://kan.weibo.co ...

  9. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布

    JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布   研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...

  10. 《大规模web服务开发技术》笔记

    前段时间趁空把<大规模web服务开发技术>这本书看完了,今天用一下午时间重新翻了一遍,把其中的要点记了下来,权当复习和备忘.由于自己对数据压缩.全文检索等还算比较熟,所以笔记内容主要涉及前 ...

随机推荐

  1. .net c# 文件分片/断点续传之下载--客户端

    断点续传客户端实现主要参考了以下文章: https://blog.csdn.net/binyao02123202/article/details/76599949 客户端实现续传的主要是一下几点 1. ...

  2. claude3国内API接口对接

    众所周知,由于地理位置原因,Claude3不对国内开放,而国内的镜像网站使用又贵的离谱! 因此,团队萌生了一个想法:为什么不创建一个一站式的平台,让用户能够通过单一的接口与多个模型交流呢?这样,用户就 ...

  3. redis 基础管理

    配置文件 优化redis配置文件定制 cat /nosql/redis/6379/redis.conf daemonize yes port 6379 logfile /nosql/redis/637 ...

  4. 【论文笔记】ResNet深度残差网络

    [深度学习]总目录 深度残差网络(ResNet)由微软研究院的何恺明.张祥雨.任少卿.孙剑提出.研究动机是为了解决深度网络的退化问题,不同于过去的网络是通过学习去拟合一个分布,ResNet通过学习去拟 ...

  5. itest(爱测试)开源接口测试&敏捷测试&极简项目管理 7.1.0 发布,ui优化及bug修复

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...

  6. kettle从入门到精通 第四十九课 ETL之kettle 自定义插件01

    1.kettle插件是什么 kettle本身有足够多的转换或者job步骤,但是依然不能覆盖所有的业务场景,所以Kettle 自定义插件在有些独特的业务场景可以大显身手. Kettle的插件架构使得我们 ...

  7. CentOS7打开终端快捷键

    点击右上角的用户名,选择设置>>键盘>>快捷键,然后点+,名称自己写,命令是"/usr/bin/gnome-terminal",这个是不能改的,再点应用,这 ...

  8. 短链服务接口慢优化 redis应用

    短链服务接口慢优化 redis应用 短链接服务:1.长链接 查询 短链接(长链接如果存在,直接返回短链接,如果长链接不存在,则需要生成短链接),比如:在获取短信之前,或者管理后台编辑短信内容之前,需要 ...

  9. C# 设置PDF表单不可编辑、或提取PDF表单数据

    PDF表单是PDF中的可编辑区域,允许用户填写指定信息.当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性.或者需要从PDF表单中提取数据以便后续处理或分析. 之前 ...

  10. 【译】Visual Studio 2022 - 17.10 性能增强

    我们很高兴地宣布 Visual Studio 2022 的最新更新,它为您带来了 IDE 各个领域的一系列性能增强.在这篇博客中,我们将重点介绍17.10版本中一些最显著的改进,比如更快的 Windo ...