开发者社区> wangyue> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

无 IaC 不 DevOps

简介: 随着云计算的发展,这两年DevOps也是搞得如火如荼,本文介绍一个典型案例来阐述基础设施对DevOps的重要性。
+关注继续查看

随着云计算的发展,这两年DevOps也着实火了一把,IT圈内人士的日常问候语都成了“你们团队DevOps了吗?”。DevOps相关工具、最佳实践层出不穷,甚至有些团队已经把它上升到了文化、战略层面。众所周知DevOps的核心之一是自动化,为了实施DevOps团队引入了各种各样的自动化工具,如下图。

screenshot

这些玲琅满目的工具功能强大甚至相互渗透,导致大批开发人员迷失其中。统计发现好多用户拿一个工具干了所有的事儿,这是不推荐的。一般地,我们按照抽象级别把这些工具分如下几层。

screenshot

云计算时代的DevOps已经远远不只是协同开发、自动构建、持续集成那点儿事儿。可以用Packer创建操作系统、开发环境的镜像,一次打包多次分发;用Terraform搭建云资源基础架构,一键部署、基础设施即代码;基于Docker构建容器集群,让开发者更关注应用本身;AnsibleCloud-Init对集群节点按角色进行配置和管理;用Jenkins等工具做持续集成和部署,减少项目风险,让团队作出快速响应。在不同的场景下,配合使用这些工具会起到事半功倍的效果。

接下来,给大家分享一个Terraform配合Cloud-Init使用的典型案例。

案例分析

screenshot

某开发团队定期在阿里云上搭建集群跑UT测试任务。集群部署在VPC网络环境下。其中Master节点负责任务分发,Worker集群负责执行任务,最后由Master汇总结果并提交回GitHub。

准备工作(基础设施规划)

首先,网络结构我们推荐选择VPC网络类型的云资源,因为VPC网络本身是一个独立隔离环境,同时提供了灵活的网络规划和安全管理方式。用户可以通过规划IP网段、授信专有网络网段访问、配置安全组等策略构建自己的网络环境。

另外,本例VPC中的ECS需要访问公网,目前有三种方式

  • 给每一台ECS都绑定EIP,绑定之后既可以访问公网,也可以被公网访问。
  • 将一台绑定了EIP的ECS配置NAT 策略(配置Iptables),使其成为NAT Instance,VPC内其他的ECS可以通过此NAT Instance访问公网。脚本如下:

    net.ipv4.ip_forward=1
    sysctl -p
  • 创建NatGateway和带宽包,配置SNAT,让同一个IP的不同端口号映射到不同的ECS。

这三种方案各有优缺点。方案一,给每一台ECS都绑定EIP不仅成本高还有一定的安全风险。考虑到每台Worker只需要短暂的外网访问能力,没有必要单独占用网络资源,本例采用方案二。不过在大规模的生产环境,推荐使用高可用的NatGateway产品,它适合对公网带宽需求量较大的企业。

操作步骤

  • 搭建物理资源

    • 创建VPC、ECS、EIP等云资源
    • 搭建VPC环境、配置安全组规则
    • ...
  • 安装依赖环境

    • 安装make
    • 安装make
    • 升级python
    • 安装git
    • ...
  • 运行脚本

  • 收集结果

手工方式面临的问题

  • 运维成本高

往往部署一套测试环境是非常复杂的,涉及网络的构建、规格的选择、操作系统的选择、中间件的搭建等,这就导致需要更多的运维成本。另外,手动创建基础设施与服务器配置需要很高的时间成本,没有流程化和配置化的工具,整个过程无法追踪,出现问题的时候环境不能快速恢复,可能造成无法挽回的损失。不妨想象一下,当服务器数量在100台以上规模的时候,需要多高的运维成本。

  • 不可复制

通常企业会在不同的Region搭建相同的基础架构,往往会按环境进行部署,还会对云资源进行划分和归类,对基础架构进行协同维护和版本追踪。面对这样的需求想要做到快速复制,手工方式毫无疑问是无能为力的。

自动化部署方案

我们希望从云基础架构搭建到整个应用程序的部署过程,能够做到全部自动化,来加快初始部署和持续集成的速度。本案的特点是属于短周期类的任务,云基础设施的架构比较复杂,应用部署相对简单。Terraform+Cloud-Init是一个不错的选择。

Terraform

Terraform 是来自HashiCorp家族开源的编排工具,目前支持阿里云、AWS、Azure、GoogleCloud、DigitalOcean等诸多云厂商。Terraform社区活跃,在GitHub上的Fork数将近3000,每周都会有大概200的Commit,代码贡献者达到了750人。另外,其官方提供完备的说明文档以及培训支持服务,解决企业的后顾之忧。

Terrraform还支持预览,它可以生成一个执行计划,帮助我们了解本次构建将会对资源进行哪些更新,以及资源之间的创建顺序。这会使编写模板变得简单和有趣。

对运维人员来说,Terraform是个很实用的工具。公司的需求一直会变,云服务的价格和服务也在变。阿里云的服务更实惠,那么就在阿里云一键部署一套,不再被AWS牵着鼻子走。前段时间S3故障了几个小时,中招的同学请举手

Cloud-Init

有的时候我们希望在server启动的时候能够自动对其做些配置,比如配置网络,写入文件,下载一些包并安装等等,阿里云ECS中提供了支持,就是Cloud-Init和User-Data。

这里首先要说一下Meta-Data API, 所谓Meta-Data就是关于虚拟机的元数据,提供这个API主要是为了能够获取机器自身的原生信息。如 hostname、网络配置信息、资源 InstanceId 等,其主要的形式为键值对。在阿里云主机上可以通过下面的地址查询 Meta-Data信息

curl http://100.100.100.200/latest/meta-data
curl http://100.100.100.200/latest/meta-data/private-ipv4

Cloud-Init 是一个在云主机启动时操作和定制云主机环境的包。它可以在云主机启动时自动执行,Cloud-Init 实现这些功能的基础是 User-Data,它提供给用户传入配置文件和脚本的能力。在阿里云主机上可以通过下面的地址查询 User-Data 信息

curl http://100.100.100.200/latest/user-data

简单的说,Cloud-Init可以在server启动的时候拿到主机信息(Meta-data)去执行用户脚本(User-Data)。不过,当前阿里云ECS执行User-Data还有一些限制,需要VPC类型的IO优化实例,具体请以官方文档为准

实施部署

依据前面的基础架构规划编写模板,详细的编写说明请参考官方帮助文档,模板片段如下:

resource "alicloud_instance" "master" {
  image_id = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
  instance_type = "ecs.n1.small"
  security_groups = ["${alicloud_security_group.group.id}"]
  vswitch_id = "${alicloud_vswitch.main.id}"
  instance_name = "master"
  io_optimized = "optimized"
  system_disk_category = "cloud_efficiency"
  password= "Test123456"
  depends_on = ["alicloud_instance.worker"]
  user_data = "${data.template_file.shell.rendered}"
}

如上描述了ECS的详细配置,VPC类型系列二1核2G的IO优化实例,实例在启动的时候会执行我们的user_data脚本,片段如下:

#!/bin/sh

PostRouting=${vswitch_cidr}
SourceRouting=`ifconfig eth0|grep inet|awk '{print $2}'|tr -d 'addr:'`
echo ${worker_private_ip}>> /etc/sysctl.conf
echo 'net.ipv4.ip_forward=1'>> /etc/sysctl.conf
sysctl -p
iptables -t nat -I POSTROUTING -s $PostRouting -j SNAT --to-source $SourceRouting
iptables -t nat -I PREROUTING -d $SourceRouting -p tcp --dport 80 -j DNAT --to ${worker_private_ip}

您可以直接在我们官方仓库下载完整模板,然后切换到alicloud-ecs-nat目录执行命令terraform apply来体验一键搭建的顺滑感,如果遇到任何问题可以直接给我们提Issue。下图是根据模板生成的资源依赖关系图,是不是有种hold住全场的感觉?

screenshot

最后

当然,对于更复杂的应用场景,需要综合运用Packer、Ansible、Jenkins等工具来协同作业,后续我们会逐一分享。另外,如果您对DevOps、CI/CD、IaC、虚拟化技术等感兴趣可以关注我们的GitHub

这不是广告

如果您对云计算、开源、DevOps、Docker、虚拟化技术有专长,欢迎加入我们!

您可以Github找到我们,也可以通过这个链接投递简历

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
你不容错过的JavaScript高级语法(四)
你不容错过的JavaScript高级语法(四)
24 0
批量传递props
批量传递props
9 0
macOS 安装 Docker
前几天,docker入门是在aws的ubuntu机器上演示的,下面介绍如何在macOS安装Docker。 系统要求 Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite,或者 2010 年以后的 Mac 机型,准确说是带 Intel MMU 虚拟化的,最低 4GB 内存。
1169 0
当DevOps撞上物联网
DevOps 领域在近年来变得流行而普遍。它强调不同的角色之间共同协作,以及如何工作得更加紧密,就像这个词语的词根暗示的那样——开发和运维。但是DevOps和物联网有什么关系? 本文选自《DevOps实践》,将与您探讨DevOps和物联网的关系以及与您动手制作一个简单的物联网设备。
3482 0
DevOps
DevOps   DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
1245 0
全栈必备DevOps
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
1144 0
MVC和MVVM
提到MVC,编程的人都会知道,我说的多了,就变成了啰嗦,MVC这个名词,是在大三的时候接触,但是没用过,当时我是以看书为主,很少动手,大四实习的时候,项目经理安排一个程序,让我按照MVC的方式去写,因为当时我是给已有的系统扩充功能,公司的系统有自己的框架,我只是照猫画虎,并没在意,功能实现了,就草草了事。
636 0
uva 141 - The Spot Game
点击打开链接 题目意思:     有两个人在玩游戏,游戏是在长为N的正方形棋盘,上面是由一序列格子组成,现在输入一些操作指令由两个人轮流操作,每一次操作对应的棋盘上面会有一个状态,如果当前的状态或这个状态旋转90或180度而来的状态以及出现...
881 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
云上DevOps开发布局——开源与集成DevOps on A
立即下载
如何打造易用的DevOps工具链
立即下载
从DevOps到BizDevOps
立即下载