Skip to content

部署架构

本章节介绍 Lizardcd 的各个组件以及架构设计。

组件介绍

Lizardcd 由以下4个组件构成:

  • lizardcd-agent:agent 使用 Kubernetes client-go SDK 与 APIServer 通信。agent 启动时监听在 gRPC 端口,同时将自己注册到服务注册中心。Lizardcd 目前支持三种注册中心: etcdconsulnacas(使用 Helm 部署时,可选择是否同时部署 etcd/consul/nacos,或者使用一个外部的 etcd/consul/nacos)。agent 的启动配置文件需要指定自己注册时使用的 KeyKey 的取值必须满足一定格式,详见 agent 配置说明。agent 是无状态的,可以任意横向扩展。
  • lizardcd-server:server 启动后将持续监听服务注册中心,并根据 agent 注册的地址与 agent 的 gRPC 端口建立长连接,同时将该条连接保存于 server 自身的内存中。server 通过 Restful API 与 lizardcd-ui 或 lizardcd-cli 通信,接收图形化或客户端指令,对于部分指令通过 gRPC 下发给 agent 执行。
  • lizardcd-ui:Lizardcd 的图形化界面,主要的平台入口。
  • lizardcd-cli:Lizardcd 的客户端工具,目前支持 Windows 和 Linux。注意 cli 仅支持部分 Lizardcd 功能,详见 客户端用法

架构设计

Lizardcd 的后端服务(包括 server 和 agent)和客户端(cli)全部由 Golang 编写,后端基于 go-zero 框架,客户端基于 cobra 框架。前端 ui 由 Javascript 和 Vue3 编写,基于 element-plus 框架。

总体架构

Lizardcd 的总体架构如下:

agent设计

Lizardcd 的 agent 支持以 deployment 形式部署于 Kubernetes 中,此时 agent 通过 serviceaccount 与 APIServer 通讯,无需 kubeconfig,也不用知道 APIServer 的地址和证书。agent 所具有的权限取决于 serviceaccount 的 RBAC 权限。详见 RBAC权限设置

agent 还支持以 二进制 形式运行于 Windows 或 Linux 系统上,此时 agent 需要通过 kubeconfig 与 APIServer 通信。agent 所具有的权限取决于 kubeconfig 中设置的 user 的 RBAC权限。

每一个 agent 的纳管范围(通常指 namespace)取决于其所使用的 serviceaccountkubeconfig 的权限范围,假设其所使用的 kubeconfig 对集群所有 namespace 都有权限,那么 agent 的纳管范围即该集群的所有 namespace。而通常一个 agent 最多纳管一个集群(kubeconfig 中的 current-context 指向的 APIServer)。

server设计

server 的纳管范围是所有已连通的 agent 纳管范围的集合,而我们通常说一个 Lizardcd 能纳管多少个集群,实际上是说所有 agent 纳管了多少集群。

server 设计为有状态的,与 server 通信需要先通过 login 接口获取一个 JWT Token,默认的 JWT Token 过期时间是 1 天。

server 与 agent 之间通过 gRPC 协议通信,符合大多数云原生工具的组件间通信习惯(如Prometheus)。server 会将与每一个 agent 建立的 gRPC 连接保存在内存中,其结构如下:

go
type RpcAgent struct {
	Client        lizardagent.LizardAgent
	ServiceSource string
	Cli           zrpc.Client
	Count         int
}

其中 lizardagent.LizardAgent 即 agent 的 gRPC client 接口类型。ServiceSource 标识该 agent 注册于哪一种注册中心(取值:etcd/consul/nacos)。zrpc.Client 是 server 端的 Conn 对象。Count 标识当前与 server 建立连接的 agent 有多少个实例(agent 可以横向扩容成多实例),每当一个 agent 的新实例添加到服务注册中心时,server 会捕捉到该 agent 注册的 服务名 Key,如果 Key 已存在,则 Count ++。

当 server 收到上游指令时,其快速从内存中取出一条对应的连接,即 RpcAgent 对象,并通过对象中的 Client 对 agent 发起 gRPC 调用。这种设计的一个弊端是,当 agent 数量不断增大时,server 的内存会持续增长,因此 Lizardcd 也许并不适合海量规模的集群管理,但对于中小规模的集群,其具有相当可观的性能表现。