博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解读基础设施即代码
阅读量:6859 次
发布时间:2019-06-26

本文共 2719 字,大约阅读时间需要 9 分钟。

现代软件开发对基础设施的管理提出了更苛刻的要求。产品要适应瞬息万变的市场,要求基础设施要有更快的响应速度。而持续交付和DevOps的推行要求产品团队对部署和运维要有更高的自主性。技术的快速进步和演化,也使得基础设施的配置不得不频繁变化。在这种快速变化的过程中,要求基础设施既要灵活,也要安全、可靠。

而传统的基础设施运维管理具有以下几个问题。

  • 被动响应。 产品团队获取服务器资源采用的是申请制,中间存在若干审批过程,以及需要等待运维团队实施,响应不及时。

  • 自动化缺乏串联。虽然有一定的自动化,但不能做到无人值守,需要执行一些临时命令介入。由于环境释放和重建的成本高,因而倾向于不释放,导致资源利用率低。

  • 和产品团队脱节。很难根据需求随时动态增加环境。需要额外的文档来描述环境,可能更新不及时。

产品团队是实施持续交付的过程中,必须考虑将基础设施的维护纳入进来,作为支持产品运行的一部分。以下是产品团队的持续交付流水线全景图。

img_72479c1bd77bbc0a2aa54a287126f20d.png

从上图可以看出,产品团队除了管理项目本身代码外,还要管理环境定义脚本。环境定义脚本可以由基础设施自动化工具执行,动态创建和销毁和更新产品运行所需的环境(包括服务器、负载均衡器、防火墙配置、第三方依赖等)。

如果实现了这一点,那么就实现了基础设施即代码的雏形。Kief在《Infarftruce As Code》一书中对基础设施即代码定义如下:

基础设施即代码是一种使用新的技术来构建和管理动态基础设施的方式。它把基础设施、工具和服务以及对基础设施的管理本身作为一个软件系统,采纳软件工程实践以结构化的安全的方式来管理对系统的变更。

基础设施即代码有四项关键原则。

  • 再生性。

环境中的任何元素可以轻松复制。

  • 一致性。 无论何时,创建的环境各个元素的配置是完全相同的。

  • 快速反馈。 能够频繁、容易地进行变更,并快速知道变更是否正确。

  • 可见性。 所有对环境的变更应该容易理解,可审计,受版本控制。

基础设施即代码的目标是:

  • 标准化。 以代码来定义环境,实现开发环境、测试环境、生产环境的标准化。

  • 自动化。 以自动化工具来驱动代码准备环境。包括创建环境、更新环境以及销毁环境。

  • 可视化。 以监控来可视化环境信息。环境当前状态可视、环境变更历史可视、可追溯。

基础设施即代码实践会产生高成熟度的持续交付和DevOps。

img_a471b1f8643b3874dced7b4f55f17351.png

在实施基础设施即代码时,要遵守以下实践。

  • 使用DSL描述环境。

Ansible、Chef、SaltStack、Terraform等基础设施自动化工具都有各自的描述性语言实现对基础设施的定义。使用DSL更容易通过描述性的语言定义基础设施,也有助于代码重用。团队成员能建立起共同理解,从而维护脚本。

以下是Ansible的一个playbook示例。

1234567891011
---- hosts: local  tasks:   - name: Install Nginx     apt: pkg=nginx state=installed update_cache=true     notify:      - Start Nginx  handlers:   - name: Start Nginx     service: name=nginx state=started
  • 自测试系统。

在编写环境代码的配置时,也要编写对环境的测试。确保所有服务器都正确进行了配置,遵守了所有的安全规则,网络连通性等进行了验证。我们一般提倡将测试代码和配置代码放在一起维护。这样配置代码更新的化,能保证测试代码也被及时更新。

一些典型的基础设施自动化测试工具有ServerSpec、Testinfra等。以下是一个ServerSpec的示例。

1234567891011121314151617181920212223242526272829
require 'spec_helper'describe package('httpd'), :if => os[:family] == 'redhat' do  it { should be_installed }enddescribe package('apache2'), :if => os[:family] == 'ubuntu' do  it { should be_installed }enddescribe service('httpd'), :if => os[:family] == 'redhat' do  it { should be_enabled }  it { should be_running }enddescribe service('apache2'), :if => os[:family] == 'ubuntu' do  it { should be_enabled }  it { should be_running }enddescribe service('org.apache.httpd'), :if => os[:family] == 'darwin' do  it { should be_enabled }  it { should be_running }enddescribe port(80) do  it { should be_listening }end
  • 一切进行版本化。

一旦采用了环境定义脚本实现对环境的控制后,需要将环境定义脚本纳入到版本管理中。并且之后所有的环境变更都应该先修改环境定义脚本,由环境定义脚本触发对环境的变更。登录到服务器执行一些临时性命令是被坚决禁止的。因为这极有可能会破坏环境的一致性。当重建服务器时,也不能保证能应用所有需要的变更。

下图是基础设施即代码的一个典型使用场景。

img_76cda794eafa945c4e7c2447e6d14858.png

除此之外,如果想要在生产环境中创建可伸缩性的服务的话,也需要借助机舱设施即代码这一实践。在高峰时期,系统可以根据定义的环境自动创建并加入新的节点实现动态扩容,并在低峰时将其销毁。当监控发现某节点失败,系统可以根据定义的环境自动创建新的节点来替换失败节点,实现自动灾难恢复。

最后是我们在某团队实施基础设施即代码的案例解析。这张图是某团队的基础设施架构图。

img_53c243ee71c91162c9f1c9e5fd345e85.png

该团队使用AWS作为基础设施平台。我们选用ansible作为基础设施自动化工具,并结合AWS提供的cloudformation服务实现快速创建和销毁资源。所有网元都有清晰的角色划分,配套对应的配置脚本。从网络配置到网元配置以及应用配置都实现了全自动化。所有的配置脚本都和源代码一起托管在GitHub。团队所有成员都可以查看并修改。

转载地址:http://quayl.baihongyu.com/

你可能感兴趣的文章
FTP部署之vsftpd
查看>>
exchange2010安卓手机无法配置exchange邮件
查看>>
svn有权限但提交失败
查看>>
Unity中的C#内存管理
查看>>
installing eclipse adt plugins
查看>>
eclipse自动部署web项目时WEB-INF\lib目录下缺少maven依赖jar包
查看>>
行为型模式之十:中介者模式
查看>>
python 正则表达式
查看>>
敏捷开发实践总结(三):需求分析
查看>>
C#基础知识整理:基础知识(6) 抽象类和抽象方法
查看>>
第四章:Shiro的身份认证(Authentication)——深入浅出学Shiro细粒度权限开发框架...
查看>>
给JFinal添加了类似ROR的Flash功能。
查看>>
openstack僵尸虚拟机处理办法
查看>>
Ubuntu Server下安装PostgreSQL
查看>>
Neutron DVR实现multi-host特性打通东西南北流量
查看>>
Exchange 2010 邮箱数据库内容索引状态失败
查看>>
我的友情链接
查看>>
if else 如何排序业务分支
查看>>
iOS多线程的初步研究(一)
查看>>
技术菜也开博客了
查看>>