首页 > 其他分享 >Istio与Mcp Server服务器讲解与搭建演示

Istio与Mcp Server服务器讲解与搭建演示

时间:2023-07-10 21:32:54浏览次数:33  
标签:服务 Istio Server XDS 注册 Pilot Mcp MCP

01

Istio与外部注册中心

Istio为何需要对接外部注册中心

Istio 对 Kubernetes 具有较强的依赖性:

1.服务发现就是基于 Kubernetes 实现的,如果要使用 Istio,首先需要迁移到 Kubernetes 上,并使用 Kubernetes 的服务注册发现机制。

2.对于大量现存的微服务项目来说,这个前提条件并不成立。对于存量的微服务存在一下几种情况:

  • 第一种情况:微服务项目暂时迁移到 Kubernetes 上;
  • 第二种情况:虽然采用了 Kubernetes 来进行部署和管理,但还是使用了 Consul,Eureka 等其他服务注册解决方案或者自建的服务注册中心。

02 

Istio服务模型


Istio与Mcp Server服务器讲解与搭建演示_数据



Pilot

管理服务网格内部的服务和流量策略:

Pilot 将服务信息和路由策略转换为 xDS 接口的标准数据结构,下发到数据面的 Envoy。但 Pilot 自身并不负责网格中的服务注册。

Pilot 中管理的服务数据有两处数据来源:

Service Registry:来源于各个服务注册表,例如 Kubernetes 中的 Service 和 Consul Catalog 中注册的服务。Istio 通过特定的适配器连接这些服务注册表,由适配器将服务注册表中的私有服务模型转换为 Istio 内部支持的标准服务模型。

Config Storage:来源于各种配置数据源中的独立服务,通过 Istio 定义的 ServiceEntry2 和WorkloadEntry资源类型加入到 Pilot 的内部服务模型中。

03

Istio 对接外部注册中心



Istio与Mcp Server服务器讲解与搭建演示_推送_02



自定义 Service Registry 适配器

这种集成方式的业务流程参见图中的蓝色箭头。该方案需要编写自定义的 MCP Server 从第三方注册表中获取服务和服务实例,然后转换为 ServiceEntry 和 WorkloadEntry 资源,通过 MCP 协议提供给 Pilot 中的 MCP config Controller。

采用这种方式,需要在 istio configmap 中通过 configSources 参数设置自定义 MCP Server 的地址。

修改完成后需重启istiod.



自定义 MCP Server

如图中红色箭头所示,我们可以编写一个自定义的适配器来集成第三方服务注册表。该自定义适配器从第三方服务注册表中获取服务和服务实例,转换为 Pilot 内部的标准模型,集成到 Service Controller 中。自定义适配器需要实现 serviceregistry.Instance 接口。该方式的原理和 Consul Service Registry 的适配是类似的,可以参照 Consul Service Registry 的适配代码进行编写。

实施该方案需要熟悉 Pilot 内部服务模型和 Service Registry 适配相关 Istio 源码,并且需要将自定义适配器代码和 Pilot 代码一起编译生成定制的 Pilotd 二进制执行文件。该方案的问题是和 Istio 代码耦合较强,后续 Istio 版本升级时可能需要修改适配器代码并重新编译。



向 API Server 写入

该集成方式的业务流程如图中绿色箭头所示。我们只需要编写一个独立的服务,该服务从第三方法服务注册表中获取服务和服务实例数据,然后转换为 Istio 的 ServiceEntry 和 WorkloadEntry 资源,通过 Kubernetes API Server 的接口写入到 API Server 中。Pilot 中自带的 Kube Config Controller 会监听 Kubernetes API Server 中和 Istio 相关的资源对象的变化,并将 ServiceEntry 和 WorkloadEntry 转换为 Pilot 的内部服务模型。

04

MCP



MCP是基于订阅的配置分发API。配置消费者(即sink)请求更新来自配置生产者(即source)的资源集合。添加,更新或删除资源时,source会将资源更新推送到sink。如果sink接受,则回复ACK,如果被拒绝则是NACK,例如因为资源无效。一旦对先前的更新进行了ACK/NACK,则source可以推送其他更新。该source一次只能运行一次未完成的更新(每个集合)。

就消息交换而言,ResourceSource和ResourceSink在语义上是等效的。唯一有意义的区别是谁启动连接并打开grpc流。



istio 1.9 变化

注意:istio 1.9 之后移除了mcp 使用mcp over xds,具体参考设计文档

Istio 1.9 在对接第三方注册中心方面,有两个需要注意的地方:

  • istio 1.8 不再 in-tree 支持 consul 作为外部注册中心 :加上之前版本移除了对于euraka的支持。截止1.8,所有通过 in-tree 方式支持外部注册中心的代码彻底被移除。
  • istio1.9 不再支持MCP的方式对接外部注册中心,改为 MCP-over-XDS的方式:新的方式虽然叫mcp over xds,但本质上没有使用之前的mcp协议。这意味着istio 1.9 中不能使用之前社区开源的一些 mcp 实现。

04

MCP-over-XDS 对接第三方注册中心


编写 MCP-over-XDS server。然后将该server的地址配置到pilot 的configSource 参数中。pilot 启动的时候,就会向目的 MCP-over-XDS server 发起订阅请求,并建立 grpc 链接。MCP-over-XDS server 读取 注册中心的数据,并转换为ServiceEntry,然后 push 给 pilot。pilot接受到数据后,会对比内存中的数据,保证数据一致。

Istio与Mcp Server服务器讲解与搭建演示_Server_03

其中 MCP-over-XDS server 主要包含两部分:

  • 一部分是Service watcher,用于监听服务注册中心,一旦有服务变更,就需要触发一次MCP推送,将最新的服务信息同步给istio。
  • 另一部分是XDS grpc server,用于向istiod推送MCP协议的数据

要对接一个服务注册中心,只需实现Registry接口即可

Istio与Mcp Server服务器讲解与搭建演示_推送_04

接口包含3个方法:

1. AppendServiceChangeHandler:添加“服务更新时需要触发的回调函数”,也就是说,在发现该注册中心的服务变更时,需要触发serviceChanged回调函数

2. Run:运行service watcher,开始监听注册中心

3. ServiceEntries:返回目前注册中心中的所有服务,以istio ServiceEntry的形式输出

触发XDS grpc server推送MCP的时机有2类:

1. istiod启动时,会向mcp server发送一个初始(initial)请求,获取当前注册中心的所有服务服务信息

2. 注册中心的服务变更时

在发生上述事件后,grpc server会调用Service watcher的ServiceEntries方法,获取到最新的服务信息,并用MCP协议包装,最终作为XDS协议的payload发送给istiod。

推送的过程存在一个防抖机制(参考istio推送XDS的过程),目的是为了避免频繁的服务更新导致多次MCP推送。防抖会将短时间内的多次更新事件合并为一次,减轻推送压力。

标签:服务,Istio,Server,XDS,注册,Pilot,Mcp,MCP
From: https://blog.51cto.com/u_13431807/6680756

相关文章

  • DataGrip连接HiveServer2
     点击Download下载driverfiles。然后下载完,就可以测试连接成功,则点ok ......
  • cesium 加载geoserver wmts
    遇到问题:①加载瓦片服务时,发现{TileRow}/{TileCol}参数不对,刚好是等级大了一倍;解决方法:tileMatrixLabels:["1","2","3","4","5","6","7","8","9","10","11"] ,注意是从1开始,不是从0开始。......
  • Mapbox、GeoServer离线部署矢量地图
    Mapbox、GeoServer离线部署矢量地图关键词:Mapbox、GeoServer、Tomcat、PostgreSQL、PostGis一、地图数据获取使用OpenStreetMap获取中国的矢量地图数据二、安装GeoServer及VectorTiles扩展将下载好的GeoServer.war放入Tomcat,启动Tomcat后将VectorTiles扩展中的四个jar包放入GeoSe......
  • 【从0开始编写webserver·基础篇#03】TinyWeb源码阅读,还是得看看靠谱的项目
    【前言】之前通过看书、看视频和博客拼凑了一个webserver,然后有一段时间没有继续整这个项目现在在去看之前的代码,真的是相当之简陋,而且代码设计得很混乱,我认为没有必要继续在屎堆上修改了,于是开始阅读别人的较为规范的开源实现目的是尝试理解一个可用级别的webserver需要具备哪......
  • Seata-server.bat闪退问题解决及Seata快速搭建
    转:Seata-server.bat闪退问题解决及Seata快速搭建 1.4上 部署的话 参考下边的地址:seata部署指南(v1.6.1) 启动seata服务前请先做好配置 ......
  • SQL Server 存储过程
    SQLServer存储过程Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。Ø存储过程的概念   存储过程Procedure是一组为了完成特定功能的S......
  • 麒麟V10服务器PHP连接MySQL报错PHP Warning: mysqli_connect(): Unexpected server r
     1.问题描述这个警告表示在进行缓存的caching_sha2认证过程中,服务器返回了一个意外的响应码99。这是由于MySQL服务器的配置或版本与使用的客户端库不兼容导致的。2.解决办法a.检查MySQL客户端版本:确保你使用的MySQL客户端版本与服务器版本兼容。如果......
  • 查看sql server数据库连接情况
    SELECT*FROM[Master].[dbo].[SYSPROCESSES]WHERE[DBID]IN(SELECT[DBID]FROM[Master].[dbo].[SYSDATABASES]WHERENAME='你的数据库名称')系统存储过程SP_WHO提供关于当前 Microsoft?SQLServer?  用户和进程的信息。可以筛选返回的信......
  • JumpServer
    ​JumpServer是FIT2CLOUD飞致云旗下品牌,JumpServer开源堡垒机是符合规范的运维安全审计系统。JumpServer是广受欢迎的开源堡垒机,是符合4A规范的专业运维安全审计系统。JumpServer帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合......
  • 如何实现pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '
    解决“pymysql.err.OperationalError:(2003,"Can'tconnecttoMySQLserveron'10.1"错误的步骤概述当使用pymysql连接MySQL数据库时,有时会出现连接错误,其中一个常见的错误是pymysql.err.OperationalError:(2003,"Can'tconnecttoMySQLserveron'10.1'")......