首页 > 其他分享 >Istio 服务注册与发现

Istio 服务注册与发现

时间:2023-01-22 14:07:29浏览次数:33  
标签:服务 Service Istio Controller 注册 MCP Pilot

基于 Kubernetes 迅速发展的 Istio 在服务注册与发现组件上支持最完善的自然也为 Kubernetes,这依托于 Kubernetes 对 Pod、Service 等资源的监控,为服务之间的调用提供弹性、负载均衡、重试、熔断和限流等诸多保障。

Pilot 组件会从各个 Service Registry,比如 Kubernetes 中的 Service 和 Consul 中注册的服务,采集可用的服务数据到 Istio 中,并将这些服务转换为 Proxy 可理解的标准服务格式,下发到 Proxy,同时下发的还有用户预先配置的路由规则和流量控制策略。在被代理的应用根据服务标识发起 HTTP 通信时,Proxy 将会从拦截的网络请求中根据服务标识获取对应的服务数据,并根据下发的路由规则选择合适的实例转发请求。

Pilot 的入口函数是 pilot/cmd/pilot-discovery/main.go 中的 main 方法。main方法中创建了 Discovery Server,Discovery Server 中和服务模型相关的主要包含三部分内容:

Config Controller:用于管理各种配置数据,包括用户创建的流量管理规则和策略。配置数据中有两个 API 对象和服务模型相关,ServiceEntry 和 WorkloadEntry。Istio 目前支持三种类型的 Config Controller:
Kubernetes:使用 Kubernetes 来作为配置数据的存储,该方式的直接依附于 Kubernetes 强大的 CRD 机制来存储配置数据,简单方便,是 Istio 缺省使用的配置存储方案。
Memory:一个在内存中的 Config Controller 实现,可以监控一个文件目录,加载该目录中的 yaml 文件中定义的 Istio API 配置对象,该方式主要用于测试。
MCP:通过 MCP(Mesh Configuration Protocol) 协议,可以接入一个到多个 MCP Server。Pilot 从 MCP server 中获取网格的配置数据,包括 ServiceEntry 和 WorkloadEntry 定义的服务数据,以及 VirtualService,DestinationRule 等路由规则等其他配置。Istio 中有一个 Galley 组件,该组件实现为一个 MCP Server,从 Kubernetes API Server 中获取配置数据,然后通过 MCP 协议提供给 Pilot。

ConfigController:负责管理配置数据,包括用户配置的流量管理和路由规则。

Service Controller:负责接入各种 Service Registry,从 Service Registry 同步需要在网格中进行管理的服务,目前Istio支持的Service Registry包括:
Kubernetes:对接 Kubernetes Registry,可以将 Kubernetes 的 Service 和 Endpoint 采集到 Istio 中。
Consul:对接Consul Catalog,将注册到 Consul 中的服务数据采集到 Istio 中。
External Service Discovery:该 Service Registry 比较特殊,后端并未对接到一个服务注册表,而是会监听 Config Controller 的配置变化消息,从 Config Controller 中获取 ServiceEntry 和 WorkloadEntry 资源,然后以 Service Registry 的形式提供给 Service Controller。

Discovery Service:将服务模型和控制面配置转换为数据面标准数据格式,通过 xDS 接口下发给数据面的代理。主要包含下述逻辑:
启动GRPC Server并接收来自Envoy端的连接请求。
接收Envoy端的xDS请求,从Config Controller和Service Controller中获取配置和服务信息,生成响应消息发送给Envoy。
监听来自Config Controller的配置变化消息和来自Service Controller的服务变化消息,并将配置和服务变化内容通过xDS接口推送到Envoy。

DiscoveryServer负责将 ConfigController 中的路由配置信息和 ServiceController 中的服务信息封装成 Proxy 可以理解的标准格式,并下发到 Proxy 中。

Istio 服务模型

我们先来看一下 Istio 内部的服务模型。在 Istio 控制面中,Pilot 组件负责管理服务网格内部的服务和流量策略。Pilot 将服务信息和路由策略转换为 xDS 接口的标准数据结构,下发到数据面的 Envoy。
Pilot 自身并不负责网格中的服务注册,而是通过集成其他服务注册表来获取网格中管理的服务。除此以外,Istio 还支持通过 API 向网格中添加注册表之外的独立服务。

Istio 服务注册与发现_数据

从上图中可以得知, Pilot 中管理的服务数据有两处数据来源:
Service Registry:来源于各个服务注册表,例如 Kubernetes 中的 Service 和 Consul Catalog 中注册的服务。Istio 通过特定的适配器连接这些服务注册表,由适配器将服务注册表中的私有服务模型转换为 Istio 内部支持的标准服务模型。
Config Storage:来源于各种配置数据源中的独立服务,通过 Istio 定义的 ServiceEntry 和 WorkloadEntry 资源类型加入到 Pilot 的内部服务模型中。

 

Istio 服务注册与发现_API_02

自定义 Service Registry 适配器

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

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

自定义 MCP Server

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

采用这种方式,需要在 Global Mesh Options 中通过 configSources 参数设置自定义 MCP Server 的地址。需要注意的是,目前1.6的 Config Controller 实现不允许同时使用不同类型的Config controller。这意味着如果采用自定义 MCP Server 来获取第三方注册表中的服务数据,也必须同时采用 Galley 来获取其他控制面的配置。

configSources:
- address:istio-galley.istio-system.svc:9901
- address:${your-coustom-mcp-server}:9901

而从1.5版本开始,Galley 的功能以及被合并到 Istiod 中,并且缺省被禁用。从 Isito 控制面简化的趋势来看,Galley 后续很可能会被逐渐放弃,其自身功能的稳定性也值得怀疑。因此不建议在产品中启用 Galley。
除此以外,根据 Istio 社区中的这个 MCP over XDS proposal,社区正在讨论使用 XDSv3/UDPA 代替目前的 MCP 协议来传输配置数据,因此 MCP server 和 Pilot 的通信机制在 1.7 版本中很可能变化。

向 API Server 写入 ServiceEntry 和 WorkloadEntry

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

要将 Consul 接入到 Pilot 中, 只需要在 pilot-discovery 的启动命令中通过这两个参数指定 registry 类型和 consul 的连接地址即可: --registries Consul --consulserverURL http://$consul-ip:$port。

 

标签:服务,Service,Istio,Controller,注册,MCP,Pilot
From: https://blog.51cto.com/muzinan110/6021417

相关文章

  • Istio可观测性(监控)
    传统监控系统监控系统通常由指标采集子系统和数据处理子系统组成。指标采集子系统主要负责信息采集、过滤、汇总和存储;数据处理子系统主要负责数据分析、展现、预警和告警等......
  • Ubuntu18.04 LTS OpenSSH服务漏洞升级
    01-OpenSSH升级安全检查、漏洞扫描中会发现自软件服务器系统Ubuntu18.04ServerLTS系统存在OpenSSH安全漏洞,一般将其定义为中危风险等级。可以使用如下方式进行升级处理......
  • 阿里云服务购买
    首先登录阿里云官网:需要注册用户并进行实名认证访问云服务ECS购买页面:接下来就是购买的步骤:(1)基础配置:(2)网络以及安全组:(3)系统配置(4)分组设置:(5......
  • 腾讯云GPU服务器环境部署与连接配置
    先前博主购买了腾讯云的GPU服务器后,发现上面预装的环境存在一些问题,因此便来重新部署一下。为了操作方便,博主这里使用了一个远程控制端软件:Xshell博主在初始化时已经安装......
  • “阿贝云”"免费虚拟主机"“免费云服务器”
    “阿贝云(https://www.abeiyun.com/)”"免费虚拟主机"“免费云服务器”,体验不错。最主要的还是免费使用。推荐大家使用。.虽然我用的是1核心1G的配置,但用起来还可以,不卡机......
  • 解决vue部署到服务器请求接口404问题
    解决vue部署到服务器请求接口404问题:https://blog.csdn.net/weixin_44692055/article/details/103693859?utm_medium=distribute.pc_relevant.none-task-blog-2~default~ba......
  • 服务器租用如何选租用前要厘清的
    服务器租用如何选租用前要厘清的很多企业都了解服务器租用的优势,但是对于现在市场上琳琅满目的IDC服务商,不知如何选择,因为每一个IDC服务商的资质都是不同的,而要......
  • 解决IDEA数据服务器已连接,Schemas中不显示数据库
    今天连数据库服务器发现问题一个,不知道是不是IDEA的BUG,明明数据库已经连上了,测试成功,但是Schemas中就是刷新不出来数据库。解决办法,原数据连接复制了一下,在点开Schemas就......
  • 未备案域名解析至腾讯云服务器就直接封停?腾讯云的蜜汁操作让人无语
    按监管要求中国服务器绑定域名务必得到工信部备案,如果把未备案的域名解析到国内服务器上那么就会阻断访问。昨日发现自己的腾讯云服务器遭受封停,封停原因是别人将未备案的......
  • 鹅鸭杀goose goose duck注册教程2023
    《鹅鸭杀》是GaggleStudios开发的策略休闲游戏,于2021年10月4日在Steam平台上发布。 这是一款带有社交性质的游戏,具体玩法类似升级版的狼人杀。要注册Gaggle.fun账号,请......