搭建 Node.js 应用部署平台(一)—— 综述

为什么要开发这样一个平台

当我们想要写一个 Node.js 应用时,需要解决很多编写代码之外的事情(机器、环境、部署、etc),这很大程度上提高了编写应用的成本。Node Labs 平台将提供应用创建、运行环境、部署、监控等功能,让创建 Node.js 应用变得更加简单。

什么样的项目适用于这个平台进行部署和管理

我们前期的目标是针对内部使用的、较为简单的,对负载要求较低的 Node.js 应用。我们制定一套适用于该平台部署管理应用的规范,凡是符合该规范的 Node.js 应用均可部署在该平台上。

如何搭建一个 Node.js 应用部署平台

我们考虑使用基于 docker 的容器化方案,这样可以实现快速部署 Node.js 应用的目标。但是容器的管理、通信、调度也成为了要考虑的问题,比如应用容器如何访问数据库容器、如何定义端口映射规则、如何动态扩容等等。单单使用 docker 技术显然不能满足我们的需求。

面对这些难以解决的问题,我们选择的方向转为 kubernetes。

Kubernetes 可以理解为容器的集群,其目的是让用户通过 Kubernetes 集群来进行云端容器集群的管理,而无需用户进行复杂的设置工作。系统会自动选取合适的工作节点来执行具体的容器集群调度处理工作。

我们考虑使用 Deployment、Ingress、Service、Pod 四种资源来实现我们的目的。 Pod 是 Kubernetes 创建或部署的基本单位,负责封装应用容器,是单个应用的实例。Service 负责抽象一组 Pod 的功能,并且映射到 Pod 的端口。Ingress 负责将域名映射到 Service,这样就可以通过域名进行访问。Deployment 是对部署进行的抽象,可以避免直接操作 Pod。

可以说 kubernetes 解决了在生产中使用 docker 技术的很多痛点。

整体架构

整体结构如下(待扩展)

用户在前台提交应用相关信息( gitlab 地址、 branch、node 版本、域名前缀等)即可一键部署,可以查看部署进度(实时日志)、应用状态等。Node Labs 核心服务通过和周边的交互完成应用的部署、查看等任务。

我们提供两种类型 "应用" 的创建。除了 Node.js 应用,我们还提供数据库容器的创建,如果需要数据库相关服务,可以在创建应用之前创建所需的数据库,然后部署应用。

核心服务

如下图所示

UserService 负责用户身份和权限控制,是调用其他 service 的基础。在 Node Labs 平台中,UserService 对接了内部系统的登录服务进行身份的认证,之后会做一些权限方面的扩展。

DeploymentService 负责应用的部署。主要包括镜像生成和部署资源生成两大部分。镜像生成包括代码拉取、镜像打包、推送镜像到云端等部分。根据用户输入生成 Deployment 相关配置,调用kubeService 生成部署、获取部署信息等。每次的部署都包含应用、用户等相关信息,方便后续的查询。

AppService 负责应用状态、信息相关,主要通过获取 kubernetes 集群中 Pod 的信息,对其状态进行分析。

DbService 负责部署数据库相关,目前提供 mongo 和 mysql 两种类型,后续会提供更加丰富的配置。创建数据库后会返回数据库的连接信息,用户可以自行修改配置。

KubeService 负责核心服务和 kubernetes 集群的调用。DeploymentService、AppService、DbService 都需要通过调用 KubeService 来获取容器相关的信息,KubeService 是相对较独立的部分。

kubernetes 资源

我们选择采用 RESTful API 的方式与 kubernetes 集群通信,这样会有更强的扩展性。

在核心服务生成完应用镜像之后,KubeService 会调用接口生成 Deployment、Ingress、Service、Pod 四种资源。生成资源的参数来自于应用的配置,这些配置会以规范的形式制定出来,防止出现意料之外的情况。

在 Node Labs 平台的开发中,以上的四种资源已经可以满足 Node.js 应用部署的基本需求。当然,基于 kubernetes api 提供的强大功能,我们通过简单的接口调用就可以扩展 Node Labs 平台的核心功能。

消息服务

主要负责核心服务和前台实时的消息推送,比如部署进行的状态、滚动日志等。消息队列基于 kafka 集群,Node Labs 核心服务会是主要的内容产生者,但是也可以基于此架构提供一些全双工的通信功能。

其他

除了部署、应用状态的查看,平台还会涉及监控、日志分析、动态扩容等功能。这些周边还在规划之中,是整个平台不可缺少的部分。

每个模块具体的实现接下来的博客会进行介绍,下一篇会详细讲解一个应用部署的整个流程。

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。