当前位置: 首页 > 科技观察

谈谈基于Consul搭建公共注册中心

时间:2023-03-22 13:12:03 科技观察

Consul作为分布式高可用的服务发现和配置工具,提供了丰富的组件功能,作为服务注册和配置中心广泛应用于微服务架构中。本文从consul提供的ACL访问控制策略的角度,详细介绍了在应用层使用标签前缀分配访问控制权限,以及基于标签隔离实现社区版consul的多租户隔离,从而作为公共注册中心。一、Consul产品介绍Consul作为一个开源的组件化工具,是使用GO语言开发的,用于实现分布式系统的服务发现和配置。主要提供分布式服务注册与发现、健康检查、Key/Value数据存储、多数据中心的高可用等能力。【服务注册与发现】consulclient(客户端)使用HTTP或DNS向consulserver(服务端)注册中心注册服务。服务请求者通过consul服务器发现自己所依赖的服务。【健康检查】consul客户端为应用提供健康检查机制,将健康检查状态上报给consulserver集群,以监控集群节点的运行状态,及时下线不健康的节点。【Key/Value数据存储】Consul提供K/V存储功能。应用可以根据需要使用Consul级别的Key/Value存储,比如保存动态配置,协调服务等。【多数据中心】Consul支持多数据中心,满足用户多中心部署模式和容灾需求。2.Consul基本架构Consul是一个分布式、高可用的系统。consul集群中的每个节点都运行一个代理。代理可以在客户端模式或服务器模式下运行。图1Consul基本架构图【数据中心(DataCenter)】在consul数据中心中,集群中的节点分为服务器节点和客户端节点。为了保证可用性和高性能,一个数据中心通常有3-5台服务器。【客户端模式(Client)】客户端节点一般与应用部署在一起,负责注册服务、运行健康检查以及转发相关RPC到服务端。在微服务应用中,本地应用只访问客户端,客户端与服务端通信,实现集群服务发现。【服务器模式(Server)】服务器节点维护consul集群的状态信息并持久化。Server节点存储公共信息,包括服务信息、K/V数据等。consul集群中的Server节点参与选举,响应RPC查询,将信息转发给Leader(领导者)。Leader除了承担服务器的功能外,还负责向各个服务器同步数据。每个集群中只能有一个Leader,保证集群内部数据一致。3.Consul多租户隔离在使用consul作为注册配置中心的过程中,多个微服务架构系统需要为每个系统部署一套consul集群,运维成本高,资源浪费,所以consul服务作为PaaS提供能力的话,租户系统的使用就变成了一个美好的愿望。社区版不支持命名空间隔离特性。多个系统共享一个注册和配置中心。需要防止写入时配置相互覆盖,读取时信息泄露等问题。因此,每个系统在进行服务发现、获取服务列表、修改配置信息等操作时,只能访问和操作自己的系统,不能访问其他系统的服务。Consul在应用层唯一的认证能力就是ACL机制。这可以用来实现多租户访问控制吗?1、ACL机制Consuls支持AccessControlList(ACL——访问控制列表),用于保护UI和API、CLI、服务和代理通信访问。通过开启consul集群ACL机制,对consul进行任何操作,都需要获取相应的token,即ACLToken,从而实现consul集群agent的访问控制、服务注册与发现、K/V数据.ACL的核心是使用令牌作为身份认证,将一系列的规则(rule)组合成策略(policy),然后将一个或多个策略与令牌token相关联。当应用请求时,在其HTTP头中添加X-Consul-Token作为分配的token,进行应用服务注册、发现、配置更新等操作。服务器会返回相应的服务内容,并根据token策略权限检查是否有相应的服务。配置资源读写权限。图2ACL机制运行核心配置步骤:(1)首先在consulserver集群的启动参数中添加配置,使集群能够检查ACL。{...acl={enabled=true,default_policy="deny",enable_token_persistence=true}}(2)然后创建一个策略,每个策略由多条规则组成。策略格式为:#rule:节点前缀为空,表示所有节点都使用该策略;node_prefix""{policy='write/read/deny'}#rule:服务前缀为空,表示所有服务都使用该策略;service_prefix""{policy='write/read/deny''}#rule:keyprefix为空,表示对所有key使用所有策略;key_prefix""{policy='write/read/deny''}(3)最后创建一个令牌并将其绑定到策略。2.租户隔离规则使用关键字前缀作为过滤条件,统一分配权限。因此,可以在每个租户的节点名、服务名、配置名前加上租户名,然后给每个租户分配一个token。配置规则时,仅使用租户名称作为前缀。这样就可以实现租户之间的资源隔离。例如租户A的名称为:“SystemA”,租户A的相关资源名称均以SystemA为前缀:节点名称:SystemA-ip,如SystemA-192.168.0.108服务名称:SystemA-微服务名称,如SystemA-UserService配置路径:config/SystemA-配置名称,如config/SystemA-public,config/SystemA-UserService租户A的token绑定的policy策略为(默认policy为deny):#RepresentsSystemA前缀节点使用此策略;node_prefix"SystemA"{policy="write"}#表示所有SystemA服务都使用这个策略;service_prefix"SystemA"{policy="write"}#表示所有以config/SystemA开头的key都使用这个policy;key_prefix"config/SystemA"{policy="write"}该策略policy关联的token只能注册以"SystemA"开头的节点和服务,发现前缀为"SystemA"标签的服务,"config/SystemA"是编辑修改开头key的配置信息。4.总结通过资源命名管理+consul产品ACL以统一租户名为前面的方式,可以达到租户间资源访问隔离的效果。这样,consul产品就可以作为PaaS能力提供服务,丰富云原生生态。