最近在学习 Go ,而常用的内部 PaaS 平台正好也支持 Go 以及相关 Web 框架。一套 PaaS 系统支持多种语言,其中就离不开 buildpack 机制。虽然 PaaS 平台不断在升级,但是 buildpack 机制却一直保留。本文主要是一些 buildpack 资料的整理和实践。
1. PaaS 如何部署应用
无论是基于原生 Docker,还是 Kubernetes 的 PaaS 平台,都只解决了资源隔离的问题,并没有规约 App 的运行方式。一个 App 能运行起来,除了开发人员关注的代码,还有运维人员关注的配置信息。这些配置信息包括:
- 账户配置,MySQL、Redis 账户密码等。
- 服务配置,服务名、端口号、第三方服务地址,如 Ceph 等。
- 运行时依赖,Python 2、Python 3、Golang、Nodejs 等,还包括相关依赖包,如,gunicorn 等。
实际上除了提供运行时,在运行 App 之前,PaaS 还需要执行一系列脚本,完成一些必要的运行环境构建。通常,这些脚本被称之为 buildpack,放在一个公用的 Git 仓库管理。
2. buildpack
buildpack 是 Heroku 的部署机制。Heroku 是一个支持多语言的 PaaS 平台,支持 Ruby、Java、Node.js、Scala、Clojure、Python、PHP、Perl 等语言。在 Github 上,Heroku 开源了 buildpack 。大家可以根据项目即拿即用,同时,也可以定制化开发自己的 buildpack。
CloudFoundry 和 Heroku 的 buildpack 是兼容的,既可以部署在 Heroku 上,也可以部署在 CloudFoundry 上。很多的 PaaS 平台,都会使用到 buildpack 部署应用。buildpack 已经成为 PaaS 应用部署的事实标准。
3. Cloud Foundry 部署原理
Cloud Foundry 是业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务。Cloud Foundry 对之后的 PaaS 平台建设思路,具有非常重要的影响。很多团队,在构建 PaaS 时,会参考 Cloud Foundry 。
下图是 Cloud Foundry 部署 App 的完整流程。
- 用户使用 CF PUSH 命令上传应用
- CLI 告知 CCNG 创建一个应用
- CCNG 在数据库中,新增应用的记录。例如应用名称,哪一个 buildpack 等
- CLI 上传程序
- CCNG 将程序存起来
- CLI 启动应用
- 由于应用尚未部署,所以 CCNG 找一台 DEA(Droplet Execution Agent),在该 DEA 内执行 buildpack 来部署应用
- DEA 输出运行 buildpack 的信息
- buildpack 执行完毕,输出一个 DropLet文件(编译打包的结果),DEA 将该文件存起来
- DEA 将打包情况汇报给 CCNG
- CCNG 选择一个 DEA 来部署应用
- 应用在 DEA 中运行,运行结果输出到 CCNG
可以看到,buildpack 和 App 都是在一样的环境(DEA)中执行的。buildpack 非常简洁,只需要三个脚本:
- bin/detect,探测 buildpack 是否支持此应用
- bin/compile,编译脚本
- bin/release,打包脚本
4. 利用 Heroku buildpack 创建应用
Cloud Foundry 是私有云 PaaS 解决方案,Heroku 是公有云 PaaS 解决方案。Cloud Foundry 通过发展集成、培训等合作伙伴,构建了非常好的生态。Heroku 在公网上提供收费的应用部署服务,但提供一定的免费额度。
这里为了简洁,没有搭建 Cloud Foundry,而是直接使用 Heroku 提供的部署服务。
4.1 Heroku 准备
第一步,在 https://www.heroku.com/ 注册 Heroku 账户。
第二步,安装 Heroku Toolbelt 客户端。
Toolbelt 是 Heroku 的命令行工具,允许通过命令行的方式来管理 Heroku 应用,下载地址。
4.2 Django 项目准备
第一步,创建一个 Django 项目,用于部署测试。
|
|
第二步,根据 buildpack 的约定,在项目中新建两个文件。
- requirements.txt,App 所依赖的第三方包
- Procfile,App 启动时执行的命令
|
|
第三步,修改 Django 工程,以适应 gunicorn 部署
在 herokupro/wsgi.py 新增:
|
|
在 herokupro/settings.py 新增
|
|
新增 static 文件夹
|
|
第四步(非必需),新建 runtime.txt 文件,指定 Python 版本。
在 heroku-buildpack-python 的 Github 页面,可以找到可用的 Python 版本.
|
|
最终目录结构:
|
|
4.3 创建 Heroku 应用
第一步,登陆 Heroku。
heroku login
第二步,创建 App 。
|
|
Heroku 会给 App 分配两个地址:
- 访问地址, https://heroku-django-app-hello.herokuapp.com/
- git 仓库地址, https://git.heroku.com/heroku-django-app-hello.git
第三步,提交代码并构建、部署应用。
|
|
|
|
访问 Heroku 提供的 App 地址,https://heroku-django-app-hello.herokuapp.com/ :
在部署时,可能不会一次性成功。可以通过命令查看日志调试:
|
|