Istio 作为 Service Mesh 解决方案事实上的规范,解决了开发人员和运维人员所面临的从单体利用向散布式微服务架构转变的挑战。Istio 提供了对整个服务网格的行为洞察和操作控制的能力,以及一个残缺的满足微服务利用各种需要的解决方案。

然而Istio 对 Kubernetes 有着强依赖,整个服务注册发现都依赖Kubernetes 本身服务发现机制。然而在理论公司落地过程中,稍具规模的公司都会有本人的服务注册核心,比方Consul,Eureka 等。另外k8s service 负载平衡在大规模和大流量的情景下,也很难满足要求。所以Kubernetes 只是用来作为一种利用部署模式,和serverless,vm差不多。此时,Istio 想被宽泛采纳,必须反对集成第三方服务注册核心。

Istio 给出的解决方案是 Mesh Configuration Protocol (MCP)。只管特定的服务和原型定义不同,但MCP基于XDS并在概念上与之保持一致。

MCP是什么?

MCP是基于订阅的配置散发API。配置消费者(即sink)申请更新来自配置生产者(即source)的资源汇合。增加,更新或删除资源时,source会将资源更新推送到sink。如果sink承受,则回复ACK,如果被回绝则是NACK,例如因为资源有效。一旦对先前的更新进行了ACK/NACK,则source能够推送其余更新。该source一次只能运行一次未实现的更新(每个汇合)。

MCP是一对双向流gRPC API服务(ResourceSource和ResourceSink)。

  • 当source是服务器而sink是客户端时,将应用ResourceSource服务。默认状况下,Galley实现ResourceSource服务,并且Pilot连贯作为客户端。
  • 当source是客户端,而sink是服务器时,将应用ResourceSink服务。能够将Galley配置为可选地dial-out到近程配置sink,例如 Pilot位于另一个集群中,在该集群中,它不能作为客户端启动与Galley的连贯。在这种状况下,Pilot将实现ResourceSink服务,而Galley将作为客户端进行连贯。

就音讯替换而言,ResourceSourceResourceSink在语义上是等效的。惟一有意义的区别是谁启动连贯并关上grpc流。

在RequestResources申请和ACK响应中,次要有两个字段:

  • collection:示意此次申请须要的数据类型,目前Istio定义了若干种类型,其中蕴含了serviceentries作为服务发现的数据等。
  • nonce:相似于申请的ID,用来与响应或者申请进行匹配。

而在返回的数据中,还有一个字段就是resources字段,外面蕴含真正的数据,具体的数据格式和collection的类型无关。

上面的示例显示sink接管到已胜利ACK的一系列更改。

同时MCP协定还定义了增量推送的能力,这里不做具体论述。

接下来让咱们看看如何实现一个MCP server。

MCP实现

MCP为轻松集成内部零碎关上了大门。咱们能够本人实现一个MCP服务器,并将其和Istio集成起来。MCP服务器提供两个次要性能:

  • 连贯并监督内部服务注册零碎以获取最新的服务信息(例如Spring Cloud中的Eureka Server和Apache Dubbo的Zookeeper)。
  • 将内部服务信息转换为Istio ServiceEntry并通过MCP资源公布。

Istio Galley实际上是MCP服务器的官网默认实现,这意味着咱们能够援用它并实现咱们本人的MCP服务器。关键点如下:

  • 在MCP服务器中定义咱们要监督的资源汇合。
  • 为MCP服务器定义一个监督程序,该监督程序将动静设置MCP资源。
  • 定义其余服务器选项(例如,速率限度,AuthChecker等)。

目前 istio 集成 consul 和 Eureka 的代码曾经被移除了,consul 和 Eureka 官网也没有具体MCP 实现。

社区中,nacos 通过 nacos-istio我的项目,实现了与istio的集成。consul 通过 consul-mcp 我的项目,也实现了与istio的集成。

如何在istio中配置MCP server?

  1. 编辑istio 配置文件:
 kubectl edit cm istio -n istio-system
  1. MCP 服务器 须要在Pilot 配置文件meshconfig里configSources字段配置,ConfigSources形容了用于网络的配置数据的起源规定和其余Istio配置工件。多个数据源能够针对单个管制立体进行配置,故configSources字段是一个对象ConfigSource数组。将此MCP服务器增加到configSource列表中:
address: xds://x.x.x.x:18848

ConfigSource 构造体如下:

type ConfigSource struct {    // Address of the server implementing the Istio Mesh Configuration    // protocol (MCP). Can be IP address or a fully qualified DNS name.    // Use fs:/// to specify a file-based backend with absolute path to the directory.    Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`    // Use the tls_settings to specify the tls mode to use. If the MCP server    // uses Istio mutual TLS and shares the root CA with Pilot, specify the TLS    // mode as `ISTIO_MUTUAL`.    TlsSettings *v1alpha3.ClientTLSSettings `protobuf:"bytes,2,opt,name=tls_settings,json=tlsSettings,proto3" json:"tlsSettings,omitempty"`    // Describes the source of configuration, if nothing is specified default is MCP    SubscribedResources  []Resource `protobuf:"varint,3,rep,packed,name=subscribed_resources,json=subscribedResources,proto3,enum=istio.mesh.v1alpha1.Resource" json:"subscribedResources,omitempty"`    XXX_NoUnkeyedLiteral struct{}   `json:"-"`    XXX_unrecognized     []byte     `json:"-"`    XXX_sizecache        int32      `json:"-"`}
  1. 重启pilot