GCP Deploy Workflow

Author Avatar
Joway Wang 8月 19, 2017
  • 在其它设备中阅读本文章

这两天初步试用了下 Google 的 「 Google Cloud Platform ( GCP ) 」, 把原先零零散散部署在阿里云的一些服务全部迁移到了它的 「 Google Container Engine ( GCE ) 」上, 顺便把原先用 Daocloud 来打包的整套工作流都切换到了 GCP 上 。整个迁移过程大概秏费了 2 个多小时 。

在迁移前,我预期的一个理想的集群环境的状态应该是 :

  • 每次 Build 镜像平均 < 2 分钟
  • 从想要部署到成功上线的时间 < 2 分钟
  • 有完整的容器日志
  • 需要支持多域名的 https
  • 成本每月 < 150 RMB
  • 能够支撑我部署超过20个应用

总的来说,我的需求是极其「既要马儿跑,又要马儿不吃草」了。但是最终成功的以最低的维护和经济成本完美的实现了上述需求。

首先在 GCE 上创建一个 K8S Cluster , 虽然 K8S 1.7.3 目前并不推荐使用,但出于好奇仍旧部署了最新的版本。机器采用一台 g1.small , 每月 16.45 刀。并勾选 Stackdriver 日志和监控选项。Stackdriver 的数据免费版是保存 7 天,对于个人已经足够用了。

GCE 上启动的 K8S 默认装了 heapster , fluentd , fluentd 和 events-exporter 会把日志和监控通过附挂一个 prometheus-to-sd 的方式打到 stackdriver 上。stackdriver 的日志搜索相比与 Kibana + ES 那套还是较弱的, 但由于它与 GCP 高度整合 , 已经不单单是一个单纯的日志收集工具了,所以使用起来其实会比 Kibana 好用很多。

在本地 gcloud auth login 认证后 , 直接 kubectl proxy 就能代理到 kube-dashboard 上。即使我使用的是 1.7.3 的 k8s , 它依旧会给我装上旧的 1.6.1 版本的 dashboard , 旧版非常恶心的支持了中文本地化,却又没有翻译完全,我之前是自己删掉 i18n 的文件重新 build 了一个 English Only 的版本,或者也可以直接 kubectl edit -n kube-system deploy kubernetes-dashboard 把它升级到 1.6.3 以支持完整的中文翻译 。

GCE 默认是推荐使用 Ingress 来暴露 Service 的, 但是使用过程中发现GCE上的 Ingress 配合 LoadBalance 似乎有问题 ,况且用了 Ingress 后,服务暴露这一层会失去很多控制权。我本来是想加一个 Api Gateway , 顺带解决了 HTTPS 的问题,但是由于我机器一共也就1.7个CPU,而且还是虚拟的,装上 Kong 了以后直接没资源了。不过在调研 Kong 的过程中,发现它还是一个非常靠谱的 Gateway 服务,第三方提供的 Admin UI 也赏心悦目。为了最低成本的解决这个问题 , 我单独构建了一个 Nginx 服务 , 通过最为原始的手写配置文件的方式 , 每个域名单独一个 conf 文件 , 在里面单独加上证书路径和 rate limit 之类的参数 。

虽然这种做法很远古,但是异常方便,并且我可以根据需要,随时给 nginx 加模块加功能, 成本无非重新 Build 一次而已。然后我单独为 Nginx 的 Service 开了一个 LoadBalance , 并把 *.joway.io 全部指向它,服务就能全部都迁移过来了。某种意义上讲,这个 Nginx 依然算是一个手动版的 Api Gateway 了。而它仅仅只占用了 3M 的内存,比之前 Kong 的高大上方案好多了。

由于我的大部分应用是大部分的无非是静态页,和少量的Node和Python Application , 仅就目前这套集群(不过也就一台机器) 其实还可以部署几十个 container 。并且现在在 Google 上 Build 镜像比原先 Daocloud 至少快了10倍,整个开发和验证效率也大大提升。就网络而言, 我使用的东京区在上海电信 Ping 值仅仅只有 30+ms , 直接走 cn2 线路。 不过由于背后是 Google 的原因,哪一天不能用了也不是不可能。如果不能用了的话, 找一台香港的机器作为中转也是一个可行的解决方案。

需要注意的是, GCP 和 AWS 一样,从构建镜像到机器到网络几乎每一个操作都是需要收费的,不过如果只是个人使用,费用其实也并不是很高。我给自己的每年云计算开销预算是2000元,算下来,大概刚好够我折腾这么一套东西。并且后续可以在次基础上进行改进。

目前还需要改善的地方有:

  • 写一个轻量级的 Openresty 版本的 API Gateway 替换现在的方式
  • 在 api gateway 上注入权限验证
  • 各类服务的 Status Page
  • 专为 GCE 定制的持续集成解决方案
    现在我都是靠手动 apply yaml 文件的方式在进行部署 , 希望能够自动检测到 image 有更新然后自动 set image , 这个本身也是一个 k8s 的持续集成,但是之前找过,开源的免费解决方案似乎并没有,我倒是写过一个内部工具来发布镜像,但也不是做到自动化的。而且似乎 GCP 上的镜像构建并没有地方给我加 webhook ,这个就很麻烦了。

GCP 整体使用下来,感觉至少就用户体验而言,的确是完爆 AWS 。就是文档非常的含糊不清,很多高级用法都是靠自我摸索出来的。它的各个模块间的紧密程度也比 AWS 要高很多,我会非常愿意去用它给我提供的各种功能,而 AWS 总会让人感觉能不折腾就别折腾。这个大概和企业文化也很有关系吧。