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 | [web-kvm-route] |
nginx转发平台的nginx脚本如下:
1 | server { |
这时的架构图如下:
4 结语
利用这一套全自动运维部署平台,开发人员仅需编写代码,后续的一切均自动化执行。