随着云计算的发展,这两年
DevOps
也着实火了一把,IT圈内人士的日常问候语都成了“你们团队DevOps了吗?”。DevOps相关工具、最佳实践层出不穷,甚至有些团队已经把它上升到了文化、战略层面。众所周知DevOps的核心之一是自动化,为了实施DevOps团队引入了各种各样的自动化工具,如下图。
这些玲琅满目的工具功能强大甚至相互渗透,导致大批开发人员迷失其中。统计发现好多用户拿一个工具干了所有的事儿,这是不推荐的。一般地,我们按照抽象级别把这些工具分如下几层。
云计算时代的DevOps已经远远不只是协同开发、自动构建、持续集成那点儿事儿。可以用
Packer
创建操作系统、开发环境的镜像,一次打包多次分发;用Terraform
搭建云资源基础架构,一键部署、基础设施即代码;基于Docker构建容器集群,让开发者更关注应用本身;Ansible
和Cloud-Init
对集群节点按角色进行配置和管理;用Jenkins等工具做持续集成和部署,减少项目风险,让团队作出快速响应。在不同的场景下,配合使用这些工具会起到事半功倍的效果。
接下来,给大家分享一个Terraform配合Cloud-Init使用的典型案例。
案例分析
某开发团队定期在阿里云上搭建集群跑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
- ...
- 运行脚本
- git clone https://github.com/company/repo-name /workspace
- export ENVIRONMENT=your_value
- make test
- ...
- 收集结果
手工方式面临的问题
- 运维成本高
往往部署一套测试环境是非常复杂的,涉及网络的构建、规格的选择、操作系统的选择、中间件的搭建等,这就导致需要更多的运维成本。另外,手动创建基础设施与服务器配置需要很高的时间成本,没有流程化和配置化的工具,整个过程无法追踪,出现问题的时候环境不能快速恢复,可能造成无法挽回的损失。不妨想象一下,当服务器数量在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住全场的感觉?
最后
当然,对于更复杂的应用场景,需要综合运用Packer、Ansible、Jenkins等工具来协同作业,后续我们会逐一分享。另外,如果您对DevOps、CI/CD、IaC、虚拟化技术等感兴趣可以关注我们的GitHub。
这不是广告
如果您对云计算、开源、DevOps、Docker、虚拟化技术有专长,欢迎加入我们!
您可以Github找到我们,也可以通过这个链接投递简历