在这篇文章中,我将通过深入研究Maesh项目背后的技术细节,探究服务网格接口(Service Mesh Interface,SMI)规范的高级概念,是什么使该项目在其他项目中独一性,以及它们对SMI规范的贡献。此外,我还会介绍这个生态系统中的其他合作伙伴。对于不熟悉SMI的读者,在深入讨论技术部分之前,我将简要介绍一下该项目的历史和目标。
SMI项目简介
微软于2019年5月在KubeCon欧洲大会向全世界宣布了SMI项目。该项目的目标是为广泛采用的日常用例定义一组API抽象。在撰写本文时,该接口涵盖了访问控制策略、指标(遥测)、流量和路由(流量转移)。在2020年4月,微软慷慨地将这个项目捐赠给了CNCF沙箱,为社区提供了一个中立的家。
微软Brendan Burns在2019年3月对SMI规范做出了最初的提交,明确了项目的意图:人们应该能够使用和定义服务网格配置,而不需要紧紧绑定到任何特定的实现。项目的目标是建立一套标准规范,涵盖服务网格最广泛使用的各个方面。
该规范没有规定采用SMI API的组织必须受到约束。供应商可能构建超出SMI API范围的扩展或功能。鼓励采用者用一种与供应商无关的方法来实现他们的用例,并通过对项目的贡献来发展SMI规范。尽管这个项目还很年轻,但许多组织目前正在这样做,包括Containous以及Maesh项目。
谁参与了SMI规范?
好消息是,在实现SMI规范时,有多个提供者在不同程度上参与进来。为了更好地理解这些供应商以及他们与生态系统的关系,我将简要介绍他们是谁以及他们解决了什么问题。
服务网格实现
有一类软件通过使用SMI组定义的API直接实现SMI。每个实现都有其独特的属性。例子包括:
- Istio:使用边车(sidecar)运行Envoy
- Linkerd:使用自定义的边车代理实现
- Consul Connect:利用边车代理,如Envoy和用于测试的内置代理,也支持用户定义的代理(HAproxy)
- Maesh:使用自定义代理实现(Traefik)使用每个节点(DaemonSet)代理的方法
管理平面
虽然这些工具可能不能直接实现SMI所涵盖的功能,但它们通过采用和管理支持SMI规范的技术,在生态系统中扮演着重要的角色:
- Weaveworks Flagger:作为Kubernetes部署的控制平面,同时支持多个服务网格实现
- Service Mesh Hub:作为多个服务网格实现的管理平面
- RIO:作为Linkerd的管理平面
介绍Maesh:一个更简单的服务网格
SMI规范的一个新实现是Maesh,它安装在Kubernetes集群上,并实现多个SMI API,以支持在集群上运行的服务之间进行东西通信。我们对服务网络有一个独特的看法,它提供了采用的灵活性、更低的性能开销和更少的破坏性升级。
新鲜的方法
作为团队构建Maesh的起点,实现SMI API非常有意义。API对已被广泛采用的特性提供了明确的共识,从而确保工程师不会浪费时间处理有限的用例。然后,我们能够专注于激发项目灵感的愿景,抛弃了服务网格景观中一些先前的假设。
在上面的图中,注意到明显缺乏边车代理。这是设计好的,让我们看一下。
深入了解技术领域
在深入了解Maesh中的技术细节以及如何实现无边车的服务网格之前,读者可以先了解一下本节中讨论的一些组件和配置,这可能会对你有所帮助。
- DNS存根(DNS stubbing):这个功能是由CoreDNS暴露出来的,CoreDNS是部署在大多数Kubernetes发行版中的默认DNS提供商,它允许定义私有DNS区域,通常称为“存根域”(stub domain)
- kube-dns:Kubernetes中的CoreDNS组件,负责处理私有(内部)DNS请求
- kube-proxy:在每个Kubernetes节点上操作,负责负载平衡和代理内部UDP、TCP和SCTP数据包,用于服务对服务的通信
该团队决定采用一种方法,即使用DNS存根为CoreDNS打补丁,因此kube-dns将在内部解决特定于maesh的域查询。在Kubernetes中匹配标准DNS模式的请求将继续通过kube-proxy进行路由。相反,匹配存根条目的请求,service-name.local.maesh的,将通过它部署的Traefik代理进行路由。
Maesh部署的控制器处理SMI对象的接收,并配置每个Traefik代理节点(部署为DaemonSet),允许独立的pod无需任何修改即可操作。这种方法满足了最初的三个目标,不需要边车代理:
- 确保用户可以升级服务网格而不中断
- 减少操作的开销
- 提供方便地选择进入或退出服务网格的灵活性
下一步
Maesh项目目前正在采用mTLS来进行东西方的安全通信,但也在为SMI项目贡献UDP通信类型规范的过程中。Containous很高兴能成为这一努力的一部分,我们也很期待看到其他SMI合作伙伴正在计划的创新。
Maesh项目是开源的,总是对贡献者开放。我们正在开发v1.4,其中包括实现一些最新的激动人心的更新,比如在流量规范中增加了HTTP头路由和流量分割。如果你想了解更多关于贡献的信息,请在任何未解决的问题向我们介绍你自己。
声明:这篇文章的作者受雇于Containous,Maesh项目的创建者和维护者。
Kevin Crawley
@notsureifkevin