乐趣区

关于istio:Istio集成第三方服务注册中心的核心MCP

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
退出移动版