生产环境中的容器之工作流

  1. 云栖社区>
  2. DockOne.io>
  3. 博客>
  4. 正文

生产环境中的容器之工作流

轩墨 2017-09-28 13:16:00 浏览947
展开阅读全文
本文讲的是生产环境中的容器之工作流【编者的话】很多公司已经在生产环境里大规模使用容器。前一篇文章里介绍了Spotify,DramaFever,Built.io和IIIEPE如何以及为什么使用容器。本文继续深入讨论这几个公司的工作流。

构建应用程序以及管理pull请求

在生产环境使用容器的一大吸引人之处是创建无缝的开发到生产环境的能力,最先代码在开发人员的笔记本上,然后能够整体移动到测试环境,并且随后直接部署,而不会因为底层基础架构环境的改动而导致问题。

IIIEPE怎么做

Luis Elizondo,IIIEPE的首席开发人员,说,在Docker之前,将应用程序移动到生产环境是他们最大的挑战。现在,开发人员构建基础镜像,并且公开将这些镜像发布到Docker Hub上。所有应用程序都有标准结构,包括应用程序,日志和文件子目录。这是开发人员使用最多的子目录,而Docker Compose的Dockerfile,YAML文件,和Makefile隐藏了应用程序容器环境相关,而开发人员无需了解细节的复杂性。

DramaFever怎么做

视频流网站DramaFever在其主要站点上使用了Python和Django框架,微服务使用Go语言来处理一些功能,比如镜像大小调整,播放书签和DRM。在每种情况下,版本化的可部署artifact都会作为容器镜像存储及部署。
对于Bridget Kromhout,DramaFever的前运维工程师而言,使用容器帮助遍布全球的开发人员团队确保标准的开发环境。她说容器“契合团队的分布式特点。它使得问题变得更少,因为减少了之前会降低开发速度的不一致情况的发生。”

Spotify怎么做

在Spotify,推荐开发人员在本地机器的build中使用Java,ZooKeeper和VirtualBox。工程师使用GitHub存储和共享代码并且pull请求,还使用Bintray存储容器镜像。

持续集成工作流配置

一旦开发人员编写完代码或者合并了pull请求,就需要构建新的基础镜像,然后通过不同阶段的QA测试。对于很多在生产环境使用容器的应用程序环境而言,通过持续集成工具,比如Jenkins,来实现这一目的,来尽可能多地自动化。

IIIEPE怎么做

Elizondo坚定地认为开发人员不应该在容器环境之外进行开发,之后才为部署构建镜像。“让Jenkins为你完成这些,”他说。
如前一篇文章所述,IIIEPE有两台服务器:一台运行MaestroNG,处理stock Docker容器,另一台运行Jenkins来自动化重复性任务。
“Jenkins还允许记录故障历史来替代Cron提交,并且我们写程序让Jenkins在每个应用程序上运行Cron,这样就能够在出错时得到日志和历史信息,”Elizondo说。

DramaFever怎么做

像Elizondo一样,Kromhout使用Jenkins做所有容器的镜像构建。“我们每周创建基础build,因为Python-Django build能够永远执行,”她说。因此,如果他们每周构建出基础build,那么开发分支的持续集成build的时间就能够减少;主页www项目的Dockerfile使用了“FROM www-base”。当在本地工作时,开发人员从GitHub里的master分支pull代码,并且将代码mount到容器里,容器是docker pull下来的最新的build环境。Kromhout说这样做比使用Vagrant更快。“Jenkins为所有平台仅仅build一个镜像,它仅仅构建一个镜像并且添加标签,”她说。“这对于保持一致性很有帮助。”

Spotify怎么做

Goldin说Spotify用Bintray构建镜像,然后部署到AWS上。Helios可以随后用来做服务发现,但是它还能插入到更多特定的,功能更完整的服务发现工具里,包括SkyDNS和Consul。

编排和管理

随着企业越来越多地使用容器,编排和管理的挑战变得越来越大。从技术上讲这里有三个流程:第一,容器如何连接,通常称为编排。第二,需要一个调度和放置的引擎,能够决定这些容器必须运行在哪个主机上。最后,容器管理包括在容器下线时通知,在服务部署等情况时报告服务状态。但是,这些术语之间的区别通常很模糊,所以通常用编排来涵盖这三种功能。

IIIEPE怎么做

因为IIIEPE要求选用开源方案,并且要求能够用于Drupal,这是很多IIIEPE的web应用程序构建所使用的框架,所以Elizondo能够选择的编排方案并不多。特性集的问题也限制了Elizondo的选择,虽然他从很多方案里摘取特性组合在一起。比如,虽然Shipyard缺少自动管理的能力,但是其作为查看器很有用,IIIEPE使用它监控容器和Docker服务的状态,来确定什么时候容器崩溃了,以及重启死锁的容器。
IIIEPE最终选择MaestroNG作为其核心编排工具,是因为它能够管理多台主机,有命令行接口,并且使用YAML文件来描述所有东西。安全方面,MaestroNG安装在服务器上,是唯一连接到Docker的服务。一旦Jenkins完成了新镜像build的测试,就会推送到IIIEPE的私有registry上,随后Jenkins使用SSH安全协议连接到MaestroNG服务器,并且完成生产环境的部署。

DramaFever怎么做

DramaFever的编排目前还很简单。因为DramaFever 100%在AWS上,他们使用DNS和ELB,在特定的自扩展组里启动实例,完成docker pull来运行必需的容器,并且在特定的ELB里响应。
Jenkins构建出新镜像,在自动和手动测试完成之后,会标记成staging,随后通过fabric,一个基于Python的工具发布到生产环境里。因此通过QA的Docker镜像就是推送到生产环境的镜像(通过分布式私有Docker registry)。

Spotify怎么做

编排正是Spotify构建并且使用Helios的正真原因。Goldin说Helios解决了一个问题,并且解决得很好:在跨云的云集群网络上,真正决策在哪里启动容器实例。虽然Helios是开源的,Spotify还构建了内部帮助工具。为了辅助持续集成,Spotify目前正在扩展Helios的特性集,使之能够视图化显示部署的内容,由谁部署以及部署在哪里。

其他方案

Built.io也为其移动后台即服务(MBaaS)容器架构,创建了自己的编排/管理层。该管理层使用REST API作为主要的通信渠道来管理新容器的搭建,并且能够审核客户profile,为付费多的客户创建大型容器。通过使用API连接的管理层,他们还能够让客户从Built.io产品的用户界面里直接访问到一些编排和管理的功能。

服务发现和负载均衡器

在生产环境里维护应用程序需要服务发现——也就是说,需要能够了解跨应用程序基础架构运行的容器的当前状态。负载均衡器随后确保应用程序流量跨服务器分布,从而确保生产环境里应用程序的高性能。

IIIEPE怎么做

Elizondo说IIIEPE使用Consul来做服务发现,因为etcd仍然要求很多额外的学习投入。Consul存储IP,端口以及应用程序状态。当Consul识别出应用程序的变更,Elizondo创建了一个触发器来创建Consul-template,它能够重新配置负载均衡器的配置。
Elizondo使用NGINX作为负载均衡器,但是计划切换为更加复杂的HAProxy。“NGINX很好,”他说,“我知道如何处理NGINX抛给我的80%的问题。但是NGINX是一个web服务器。它可以作为负载均衡器,但是这并不是它最擅长的。”

DramaFever怎么做

Kromhout在Jenkins job里通过Packer使用Chef客户端来为主机实例生成Amazon Machine Image,由必需的模板填充而成,这样正确的Docker镜像会被pull并且运行,作为特定Elastic Load Banlancer(ELB)的成员从特定自扩展组里启动实例。使用NGINX的proxy_pass到不同upstream的ELB的每个微服务,Kromhout说,这样使得DramaFever能够将动态服务发现相关的更为复杂的问题推迟。“我们为一些数据库连接池使用HAProxy,但是在流量路由领域,ELB+NGINX要简单得多。当能够预测容器在哪里启动时,位置块能很好地工作,”她解释道。“当然,这意味着利用率并没有达到最佳。如今,Peter Shannon,DramaFever目前的运维经理,正在研究更为动态的服务发现方案。应用程序容器集群是如何实现高效使用率的方式。”

都试一试

现在总结最佳实践还为时过早,但是业内正在涌现一些方法论示例,展示容器生产环境工作流看上去应该是什么样子。本文提到的一些工具并不是容器特定的技术;相反,容器让这些技术在部署代码时变得不那么重要了。
在这所有的案例里,最终选择的工作流都将容器和一些最先进的生态系统开源工具组合在一起。除了这样的方案,还有的企业会使用私下的workaround,或者使用仅仅能够解决个别企业应用程序编程语言,数据服务器基础架构,安全策略和持续交付承诺而自行创建的方案。

原文链接:CONTAINERS IN PRODUCTION, PART II: WORKFLOWS(翻译:崔婧雯 校对:) 
===========================
译者介绍
崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。

原文发布时间为:2016-04-18
本文作者:崔婧雯 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:生产环境中的容器之工作流

网友评论

登录后评论
0/500
评论
轩墨
+ 关注
所属云栖号: DockOne.io