构建另一种服务网格:使用SMI规范的新方法

2020-08-31 16:39:18 浏览数 (1)

在这篇文章中,我将通过深入研究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

0 人点赞