【编者的话】容器会取代你对配置管理的需求吗?或者说两者可以共存吗?它们应该如何共存?本文主要对比了传统的配置管理和现在比较火的容器管理之间的差别,并对两者分别进行了概括,可以让读者初步了解两者之间的区别,并感受到容器技术的力量。
每一个开发和运营团队都有着或多或少相同的目标,编写干净的、可维护的和高性能的代码、尽可能频繁的部署代码而没有宕机,以及给用户带来极速和愉悦的体验并且可以扩展来满足需求。不断的部署而没有宕机并且持续扩展来满足需求,谈何容易。如何实现这些目标的方法少说也有几百个,这需要建立一个托管平台,这个平台上要有大量系统管理员过去通常手工操纵的东西。
现在平台这个术语有些被过度使用和加载了,当你去思考平台是什么的时候,它实际上是运行你的代码的计算机以及如何去部署它们。你的平台可能是你机箱里的一台服务器、一些shell脚本、公共PaaS的供应商提供给你的一切或者众多人选择的AWS和其他托管服务提供商提供给你的东西。
直到大约一年之前,优质的标准以及理论上最好的方法是使用配置管理系统来自动化你的服务器基础设施以及部署工作流,一些比较流行的系统包括:
使用配置管理系统,你需要编写代码来描述你希望如何安装和配置系统的一些组件。当你在服务器上执行代码的时候,它应该在理想状态下结束运行。使用这种系统的好处是你可以抽象掉一些在各种不同的操作系统处理像包管理这样的功能时所带来的不同。
例如,你可以写一个bash脚本用来在Ubuntu或Debian上安装libxml2:
#!/bin/bash
apt-get install -y libxml2
但是,当你在CentOS或者Fedora上使用这个脚本的时候会发生什么呢?它将不能够正常运行,因为这些发行版使用不同的包管理器。
取而代之,你可以用Chef写一个代码块,它可以抽象掉不同的发行版之间的差异。你可以在libxml2包存在的任何地方执行这个相同的Chef recipe,它都会正常运行。
package “libxml2” do
action :install
done
因为我对Chef非常熟悉并且在脑海中仍然记忆犹新,所以我将讨论一下它的配置资源和我在使用时碰到的一些陷阱。Chef的配置资源基于Capsitrano,Capsitrano被视为代码部署的最好选择,所以我这里所写并非是要唠叨它。
在你的Chef recipe代码中,配置资源的语法其最简单的形式看起来像这样:
deploy 'private_repo' do
repo 'git@github.com:acctname/private-repo.git'
user 'ubuntu'
deploy_to '/tmp/private_code'
ssh_wrapper '/tmp/private_code/wrap-ssh4git.sh'
action :deploy
end
chef-client通过某种方式的循环保持单一运行时,在同一个服务器上部署多个项目的现象并不少见。
一个这样的简单示例如下:
%w(project1 project2).each do |project|
deploy ‘#{project}’ do
repo 'git@github.com:acctname/#{project}-repo.git'
user 'ubuntu'
deploy_to '/var/www'
ssh_wrapper '/tmp/private_code/wrap-ssh4git.sh'
action :deploy
end
done
对于这种方式如何结束运行,存在一些问题:
围绕这些问题有很多解决办法,比如提前构建模块并将其存储在向s3这样的对象存储库中,将你的recipe拉到本地解压而不是在云端构建他们。还有一些人将他们的Github仓库映射到一个本地服务器,然后从本地服务器拉取。总体来说,我的观点是,使用配置管理工具来部署让人非常厌恶并且容易出错。
容器是时下的新宠,但它绝不是一项新技术。从2.6.24版本开始,由于加入了cgroup的支持,linux内核已经支持容器。谷歌已经使用了十几年来支持他们巨大的全球性基础设施。在过去的两年里,像Docker这种初创公司以及一些大型企业如红帽,亚马逊,谷歌和IBM在他们的主机产品中增加了对容器的支持,这已经使得容器在开发者和运维工程师中成为了最流行的话题。通过使用Linux中现有的工具如cgroups和 namespace,并且使得它们对于普通用户来说更加简单和方便,Docker产生了巨大影响。
容器使应用程序的跨平台可移植性比以往任何时候都更容易,通过允许在开发工作站上构建和测试的同一镜像运行在生产环境中,解决了开发环境与生产环境差异的老问题。作为曾经的运维工程师,我不记得已经听到过多少次这种声音,“生产环境出问题了…代码在本地运行的很好”。这就造成了开发人员编写代码和运维团队部署代码出现分歧而不是相互协作的现状。
相比配置管理系统来说,特别是谈到部署的时候,容器有着明显的优势。
但是,仍然有些不足,对吗?嗯…是的。
当然可以。
即使不是全部的也有相当大的一部分流行的配置管理系统拥有针对Docker集成的hooks。Chef有一种集成方案,允许你使用Chef cookbook和recipe构建Docker镜像以及管理如何把你的容器部署到服务器上。Ansible也有完成类似目标的集成。
有些情况下,我会说:“是的,可以同时使用两者”:
这将是很容易的尝试,你可以得到一些即时的反馈,看看是否要继续深入到更加复杂或全部功能的主机平台。对于你的基础设施,所有需要你真正改变的是增加Docker并将它作为应用程序的包装,你会继续以同样的方式将它们部署到同一服务器。虽然这样有些不妥,但因为使用了群集托管平台,便可以显著提高资源利用率,并能为你节省很多资金。
有一些确实比较古老的软件有时需要你去运行和管理,其中有一些不能很好地与容器兼容,使得它们自动安装和管理的唯一方法是使用配置管理。如果你遇到了使用容器时不会遇到的严重的合规性要求或者要求你在特权模式下运行它们,这也会是一个潜在的问题。
理想状况下,答案是No。随着全栈容器管理系统的发布,在2015年,你大可不必担心要同时使用两者才能够完全自动化你的基础设施。当然,一些容器管理系统确实需要配置管理来自动化它的配置…我猜测他们可能思考地不够透彻。
一般来说,如果你要同时使用两者:
最好选用单一的标准加粗文字来自动化托管环境,这使得团队的新成员能够更加容易的加快进度,同时也使得公司内部更多的团队加入进来,并共同出力来修改和改进整个基础设施。
你对此有何感想?欢迎在评论中分享你的看法!
原文链接: Containers Vs. Config Management 翻译: 李加庆 )