无 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找到我们,也可以通过这个链接投递简历

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Oracle 关系型数据库 JavaScript
kernel.shmmax ,kernel.shmmni 和kernel.shmall
[2014-07-23 14:03:41](javascript:;) kernel.shmmax = 2147483648 // 该参数定义了共享内存段的最大尺寸(以字节为单位)。
6047 0
|
10月前
|
JavaScript 前端开发 搜索推荐
《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
Astro 3.0的岛屿架构为内容优先网站提供了高效解决方案。通过将页面大部分内容静态化,仅对交互区域加载JavaScript,大幅优化加载速度与用户体验,同时提升SEO效果。开发者可灵活选用多种UI框架,降低技术门槛,简化维护工作。实际应用中,许多网站采用该架构后性能显著提升,成本降低,用户活跃度与流量大幅增长,成为内容网站建设的革新之选。
249 15
《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
|
5月前
|
安全 Linux 网络安全
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
608 0
双模态后门攻击框架
本研究提出一种融合数据投毒与模型投毒优势的联邦学习双模态后门攻击框架,通过动态协同攻击机制,在数据层面利用生成对抗网络生成自适应触发器,在模型层面引入梯度伪装机制,实现攻击隐蔽性和持续性突破。实验表明,该方案在CIFAR-10和Fashion-MNIST数据集上攻击成功率提升23.7%,并在20轮模型更新中保持后门功能存活。
|
SQL 缓存 Java
揭秘物联网性能优化的终极攻略!提升系统效率的七大法宝
小米在物联网项目中遇到了性能优化问题,他从数据库、集群、硬件、代码、并行处理、JVM及操作系统等多个层面分享了优化经验。包括SQL优化、分库分表、缓存使用、水平扩容、分布式调度、硬件升级、代码分析、并行处理、GC调优及操作系统参数调整等。小米强调性能优化需结合实际情况,逐步提升系统响应速度与稳定性。欢迎留言交流,共同进步。关注他的微信公众号“软件求生”,获取更多技术干货。
423 0
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
5043 2
|
Python
pandas库明明安装成功了,为什么总是导入错误?
pandas库明明安装成功了,为什么总是导入错误?
1724 4
|
前端开发
前端代码简洁之路,后台系统之详情页设计
前端业务开发中,为了脱离舒适区,也为了解放重复功能开发的劳动力,会将一些功能进行改造,本期改造千篇一律的详情页。
4387 26
前端代码简洁之路,后台系统之详情页设计
|
存储 自然语言处理 NoSQL
关于 LLM 和图数据库、知识图谱的那些事
本文着重介绍了 LLM、RAG、Graph 是什么,以及 LLM 如何同知识图谱结合,让知识抽取更加便利。此外,还讲述了一些 LLM 在数据库领域的应用场景,比如:用自然语言查询数据。
1496 0
关于 LLM 和图数据库、知识图谱的那些事
|
JavaScript 前端开发 算法
JavaScript学习 -- Base64编码
JavaScript学习 -- Base64编码
305 0

热门文章

最新文章