Terraform与Packer结合是一种很好的选择。HashiCorp成功创造了另一个工具来改变我们配置和提供服务器的方式。
配置管理工具的主要目标是使服务器始终处于所需的状态。如果Web服务器停止运行,那么它会被再次启动。如果配置文件发生了改变,那么它会被恢复。无论服务器发生了什么情况,都会被恢复到所需的状态。例外的情况是,有些问题是无法修复的。如果硬盘发生故障,配置管理就无能为力了。
配置管理工具的问题在于,它们是被设计用来处理物理服务器,而不是虚拟服务器。当可以在几秒钟内创建一个新的虚拟服务器时,为什么要修复一个有故障的虚拟服务器呢?Terraform比任何人都更理解云计算是如何工作的,并且支持这样的想法,那就是我们的服务器不再是宠物了。它们是“牛”。Terraform能够确保你的所有资源都可用。当服务器出现问题时,它不会尝试去修复该问题。相反,Terraform会销毁它,并会根据我们选择的镜像创建一个新的服务器。
这是否意味着Puppet、Chef、Ansible和其他类似的工具就没有用了呢?在云中使用它们过时了吗?有些工具比其他工具更过时。Puppet和Chef的设计是在每台服务器上运行一个代理,不断监视其状态,并在事情偏离正轨时对其进行修改。当开始将服务器视为“牛”时,这些工具就用不上了。Ansible比其他工具更有用,因为可以使用它来配置服务器,而不是监视服务器。因此,当创建镜像时,它可能非常有用。
可以将Ansible和Packer结合起来。Packer创建一个新的虚拟机,Ansible将为虚拟机配置所需的一切,并将其留给Packer以创建镜像。如果服务器的配置很复杂,那么意义会更大。问题是服务器的配置应该有多复杂?使用AWS,传统上在服务器上运行的许多资源现在都是服务。我们不会在每台服务器上设置防火墙,但会使用VPC和安全组服务。由于不用登录到计算机来部署软件,因此我们不会创建大量的系统用户。Swarm会为我们做这些。我们不再安装Web服务器和运行时的依赖,它们都在容器里。使用配置管理工具将一些东西安装到虚拟机中,并将其转换为镜像,这么做是否有真正的好处?通常情况下,答案是否定的。我们需要的东西也可以很容易使用Shell命令来安装和配置。“牛”的配置管理可以,而且通常应该使用bash来完成。
我可能太苛刻了。如果你知道什么时候使用以及用于什么目的,那么Ansible仍然是一款很好的工具。在服务器成为镜像之前,如果是希望使用Ansible而不是bash来安装和配置它,那么就去做吧。如果试图使用它来控制节点并创建AWS资源,那么你就错了。Terraform会做得更好。如果你认为最好是配置一个正在运行的节点,而不是实例化已经包含所有内容的镜像,那么你必须有更多的耐心。
现在已经确定了对工具的偏好,这些工具是从底层设计来和云一起工作的(而不是本地的物理服务器),你可能想知道是否使用CloudFormation,而不是Terraform。
CloudFormation的主要问题在于它是AWS锁定的,它只能管理Amazon服务。就我个人而言,如果有一种好的替代方案,供应商锁定是不可接受的。如果你已经在全面使用AWS服务,那么可以忽略我对此的意见。我更喜欢选择的自由。在合理的情况下,我通常会尝试设计对供应商具有最少依赖的系统。如果AWS中的服务确实比其他供应商的服务更好或更容易设置,那么我会使用它。在某些情况下,确实是这样,而在其他情况下并非如此。很好的例子就是AWS VPCs和安全组,它们提供了很多的价值。我认为没有理由不使用它们,特别是,如果改变了供应商,那么它们很可能会被替换掉。(www.xing528.com)
CloudWatch将是一个相反的例子。ELK是一种比CloudWatch更好的解决方案,因为它是免费的,并且可以移植到任何供应商。对于ELB来说也一样,它在Docker Networking中基本上是过时的。如果你需要一个代理,那么可以选择HAProxy或Nginx。
对于你来说,供应商锁定的争论可能无关紧要。你可能已经选择了AWS,并会继续使用一段时间,这就足够了。然而,Terraform能够与多主机供应商工作并不是其唯一的优势。
与CloudFormation相比,Terraform的配置更容易理解。Terraform可以很好地与其他类型的资源配合使用,比如DNSimple(https://www.terraform.io/docs/ provIders/dnsimple/),并可以在应用之前显示计划,这可以让我们避免很多错误。在我看来,Terraform与Packer相结合是管理云基础设施的最佳组合。
让我们回到原来的讨论。是使用Docker for AWS呢?还是使用Terraform与Packer的组合呢?
大多数情况下很容易决定不选择Docker Machine。与此不同,是使用Terraform还是Docker for AWS是很难解决的问题。使用Terraform,你可能得花点时间才能使集群有了所需要的一切。这不是一种现成的方案。你必须自己编写这些配置代码。一方面,如果你有使用AWS的经验,这样的任务就不是问题。另一方面,如果AWS不是你的强项,那么可能需要相当长的时间来定义所有的东西。
尽管如此,我不认为学习AWS是选择这个而不是那个的理由。即使选择了一种现成的方案,比如Docker for AWS,你仍然应该了解AWS。否则,当基础设施出现问题时,你就有可能无法做出应对措施。不要认为有什么东西可以让你免于了解AWS的复杂性。问题只是你在创建集群之前或之后学习这些细节。
最后的建议是,如果你想要控制组成集群的所有部分,或者你已经有了一组需要遵循的规则,那么可以使用Terraform和Packer的组合。准备好花些时间来调整配置,直到达到最佳的设置。与Docker for AWS不同,你无法在一个小时内得到一个全功能集群的定义。如果这是你想要的,那么就选择Docker for AWS。另一方面,当你配置Terraform去做所需的一切时,将得到很棒的结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。