无 IaC 不 DevOps

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
公网NAT网关,每月750个小时 15CU
简介: 随着云计算的发展,这两年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找到我们,也可以通过这个链接投递简历

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
安全 Devops 测试技术
DevOps 那些事儿
DevOps 那些事儿
DevOps 那些事儿
|
3月前
|
运维 监控 Devops
DevOps 的应用
DevOps 的应用
|
6月前
|
运维 监控 Devops
【devops】一、DevOps介绍
【devops】一、DevOps介绍
|
运维 Kubernetes 安全
什么是DevOps?
DevOps 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试和运维。换句话 DevOps 希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。
434 0
什么是DevOps?
|
1天前
|
jenkins Devops Java
【DevOps】(一)jekins部署
【DevOps】(一)jekins部署
9 1
|
10月前
|
运维 监控 Kubernetes
DevOps
DevOps是一种将开发(Development)和运维(Operations)相结合的实践方法和文化。它旨在通过促进开发和运维之间的协作和沟通,从而实现更快、更可靠和更频繁的软件交付。DevOps的核心理念是将软件交付视为一个整体过程,包括开发、测试、部署、运维和监控等方面,而不是一个单独的阶段。
189 1
|
运维 Java Devops
20、DevOps
DevOps是Development和Operations两个词的缩写,它涵盖开发、测试和运维的整个过程,简言为自动化部署
110 0
20、DevOps
|
机器学习/深度学习 人工智能 运维
DevOps 的未来
DevOps 的未来
94 0
DevOps 的未来
|
运维 Devops
DevOps到底是什么
DevOps到底是什么
105 0
|
Devops
DevOps是什么呢?
DevOps是什么呢?
100 0