AgentNEO 架构简介

前言

我和朋友常常谈起,对于做技术的我们,这是个支离破碎的世界,大到被无形的墙分割的互联网,小到林林种种残次的工具,他们总是很难以完整的面貌展现在我们面前。某一天,我们也和其他同样背负着「程序员」之名的人一样,决定以「精卫填海」的精神去「修复」眼中的世界,而这一切,开始于用一架优雅的、精致的梯子去翻越藩篱…

简介

AgentNEO 生产环境是完全 Docker 化的,所有的服务都运行在 Docker 中。这些服务除了我们的 Web 主站,Shadowsocks 节点,还有其他很多基础服务。例如 HA Kafka、MySQL、Redis、各个服务的 Healthcheck、CI/CD 所需要的 Drone、Gitlab runner 等。

到目前为止,AgentNEO Shadowsocks 节点,包括 VPS 和独立服务器,一共有 30 多个,分布在香港、日本、韩国、美国等地,同时和这些节点所对应的 Docker 容器数量接近 300 个。那么我们是如何做到将不同的服务启动到合适的宿主机上,并且保证互相通信安全的呢?答案是 Rancher!

全新 Rancher 2.0 刚刚发布,2.0 版本的 Rancher 全面拥抱了 Kubernetes,用户可以非常方便地创建高可用的 Kubernetes 集群。

Rancher

Rancher 是一个 Docker 集群管理工具,提供了非常友好的 WebUI 去帮助用户管理容器。它通过虚拟网络加服务编排技术,实现在合适的服务中运行我们想要的容器。

集群容器编排

在 Rancher 中,有一个概念「服务」,它指的是拥有相同参数的一组容器。因此我们的 Shadowsocks 应用就可以抽象成为一个 Rancher 的「服务」。

每个服务都有自己的很多属性,其中最关键的,则是『调度规则』。

服务调度规则

上图是我们一组 Shadowsocks 服务的调度规则。它的意思是,在每一台同时拥有 zone=hk-azurerole=ss 标签的主机上,都启动一个 Shadowsocks 进程。这样一来,我们将需要运行 Shadowsocks 服务的节点(此处为香港 Azure 数据中心的一台 VPS)打上对应的标签即可,剩下的事情 Rancher 会自动帮我们完成。更棒的是,如果以后我们需要添加一台 Shadowsocks 服务器,只用将对应标签打到新加入的节点里即可自动完成所有部署。

主机标签管理

服务器标签管理,非常简单

除此之外,Rancher 还提供了很酷的容器链接图,用户可以很直观的看到目前相关容器的相互依赖。

容器链接图

AgentNEO 官网链接图,可以很清楚的看到前端负载均衡器将请求分发到两个 Rails 应用中

自研的意义

熟悉的朋友可能会知道,AgentNEO 官网没有使用 ss-panel 这个开源项目,而是基于 Ruby on Rails 自己开发的。其实除了官网,我们的 Shadowsocks 也是自己实现的。

为什么要造轮子?

首先,如果只是用开源软件无脑搭出来一个平台,就如同玩已经组装好的乐高,是一件特别没有意思的事,而且对于开源的重度依赖,也会在业务逻辑上遇到比较大的障碍。然后,作为一群还算有梦想程序员,还是想做一些有用的事情,来推动整个 Shadowsocks 社区的建设,而不是仅仅汲取开源社区的成果。

所以,我们在一开始做 AgentNEO 的时候,就投入了很大的研发精力,从依据 Shadowsocks 协议完成自己的 Shadowsocks 实现,到 AgentNEO 官网的开发,无一不亲力而为。这一切都是为了更好的进行技术沉淀,将来回报开源社区。

DevOps

关于 DevOps,维基百科的介绍如下:

DevOps(Development 和 Operations 的组合词)是一种重视「软件开发人员(Dev)」和「IT运维技术人员(Ops)」之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

在 AgentNEO,我们始终坚持的是,尽量将所有步骤都放入自动化流程中,尽量避免人为操作。部署时只用做决策,而不用执行(是否上线是决策,而部署步骤是执行)。大大减少「人」带来的风险。得益于近几年以 Docker 为首容器技术的兴起,整个生态圈极为活跃,我们自动化的各个环节都有非常丰富的资源和技术支持。

在代码管理方面,我们使用 Gitlab 作为管理平台。拿官网举例,当有新的版本标签(例如 v1.4.5)被 push 到远端后,会触发自动测试以及自动构建(构建 Docker 镜像)的任务,成功后,会进入到等待上线的阶段,这个时候,运维只需要手动点击 Gitlab 中的部署按钮即可完成上线(只决策,不执行)。如果测试或者构建失败,则会自动发送邮件通知相关人员进行处理。

CI/CD Pipeline

AgentNEO 官网 CI/CD Pipeline,点击 Deploy 流程中的播放按钮即可完成部署(使用 Gitlab runner 调用了 Rancher 的 API 实现)

片尾曲

做 AgentNEO 的动机,最开始是让自己有一个稳定、快速的网络。但是作为一个有梦想的程序员来说,既然做了,那么就要尽可能的在各个环节将自己平时的积累用起来,形成自己的一套最佳实践。这才是有意思的事情。