创业团队CI/CD运维自动化综合解决方案

1 序言

对于初创团队的后台RD来说,除了开发和测试外,发布代码与机器运维工作也需花费大量时间(配备专门SRE的例外),另外,在发布过程中保证服务可用也是个复杂的问题。

本文的目的便是要解决以上问题,给出运维自动化解决方案,搭建一套私有云,实现自动CI/CD,降低运维成本,让开发人员专注于开发。

2 背景

我们假想有一支处于天使轮甚至尚未获得风投的创业团队,该团队有一台高配物理服务器(因成本缘故未配备公网IP)和一台谷歌云低配虚拟机(拥有公网IP),并注册了顶级域名iloveqyc.com。

该团队使用Java语言开发,他们希望在应用开发完之后,将应用部署于本地的高配物理机中,并且从公网可以访问应用,应用的部署最好是自动完成,部署期间服务不中断。

为了实现目标,我们需要用到以下几个功能组件,不熟悉的同学可以先了解一下。
1)frp,用于内网穿透,访问公网域名的请求转发到内网服务器。
2)proxmox,用于创建运行kvm虚拟机。
3)rainbond,用于创建dokcer容器,并实现自动CI/CD。该软件已开源,号称是开源的PAAS平台,试用一段时间后我觉得确实不错。
4)dnsmasq,用于搭建私有域名服务器,配合rainbond实现docker域名访问。
5)nginx路由,配合frp实现域名转发。

3 解决方案

3.1 内网穿透

团队拥有的是一台不带公网IP的物理服务器,无法从外网访问,我们只能做内网穿透,这里我们选择了frp(其它内网穿透也是可以的)。

我们在谷歌云虚拟机上运行frp的服务端,并将域名指向谷歌云虚拟机的ip,同时,在物理服务器上运行frp的客户端,全部运行之后的架构图如下:

运行起来后,frp的管理后台截图如下:

注:git.iloveqyc.com和rcs.iloveqyc.com两个域名均指向谷歌云的frp服务端,由后者转发到物理服务器。

3.2 私有云

proxmox是一套基于debian打造出来的kvm虚拟平台,我们可以利用它创建出许多虚拟机。

搭建完毕后,运行界面截图如下:

3.3 容器云 && PAAS

搭建proxmox之后,我们拥有了一套kvm虚拟机的管理平台,但它也仅仅是虚拟机平台而已。仅凭虚拟机平台来实现运维自动化,我们需要写大量的部署、监控脚本,如果有平台能帮我们做这些再好不过,所幸的是,rainbond便是这么一个平台。

“Rainbond是以应用为中心的开源PaaS,由好雨基于Docker、Kubernetes等容器技术自主研发,可作为公有云或私有云环境下的应用交付平台、DevOps平台、自动化运维平台和行业云平台,或作为企业级的混合云多云管理工具、kubernetes容器管理工具或Service Mesh微服务架构治理工具。”

可见rainbond基于docker和docker管理平台Kubernetes,它能实现以下功能:
自动拉取git仓库的代码,识别其语言,编译并部署至新建的docker容器中,该容器对外暴露一个私有域名。

这意味着,开发人员仅需将开发测试通过的代码推送至git仓库,rainbond便能完成后续所有的编译部署。
搭建完毕后,运行界面截图如下:

(注:rainbond安装在kvm虚拟机中)

(注:搭建rainboad的时候,需要离线安装,且自定义私有域名,安装rainbond的指令为『./grctl init –install-type offline –domain iloveqycrain.com』)

3.4 私有域名解析服务

安装完rainbond后,新部署一个应用,该应用会对应一个独一无二的私有域名,如:http://5000.gr76a8b6.co6xf9ph.iloveqycrain.com

若是直接访问的话,会报错无法解析域名对应的ip地址,那是因为该域名是我们自己随便填的,并没注册到顶级域名服务器中(我们也不想这么做)。

所以我们需要搭建一个私有域名服务,这里选择dnsmasq即可。

将*.iloveqycrain.com均解析至rainbond所在虚拟机的ip即可,后续哪怕我们新建N个应用,有N个私有域名,也是可以直接访问的。

这时的架构图如下:

到这里,我们已经能在内网通过 http://5000.gr76a8b6.co6xf9ph.iloveqycrain.com/ 来访问私有web应用,通过 http://3000.gr1dc180.co6xf9ph.iloveqycrain.com/ 来访问私有git仓库,下一步,我们将实现外网访问。

3.5 路由转发

我们在内网搭建一个nginx转发平台,所有外网请求均通过frp打到该平台。平台识别出请求中的外网域名,将请求转发到对应的内网域名。

我们访问外网域名git.iloveqyc.com,最终得到来自内网域名http://3000.gr1dc180.co6xf9ph.iloveqycrain.com/的请求。

我们访问外网域名rcs.iloveqyc.com,最终得到来自内网域名http://5000.gr76a8b6.co6xf9ph.iloveqycrain.com/的请求。

nginx转发平台的frpc配置如下:

1
2
3
4
[web-kvm-route]
type = http
local_port = 80
custom_domains = mysql.iloveqyc.com,git.iloveqyc.com,rcs.iloveqyc.com,rainboard.iloveqyc.com

nginx转发平台的nginx脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name git.iloveqyc.com;
location / {
proxy_pass http://3000.gr1dc180.co6xf9ph.iloveqycrain.com/;
}
}
server {
listen 80;
server_name rcs.iloveqyc.com;
location / {
proxy_pass http://5000.gr76a8b6.co6xf9ph.iloveqycrain.com/;
}
}

这时的架构图如下:

4 结语

利用这一套全自动运维部署平台,开发人员仅需编写代码,后续的一切均自动化执行。