Packer & Terraform 让 ESS 更灵活

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介:

弹性伸缩(Elastic Scaling Service, ESS)根据用户的业务需求和策略,自动调整对弹性计算资源的管理,使得在满足业务需求高峰增长时无缝地增加 ECS 实例,并在业务需求下降时自动减少 ECS 实例以节约成本。

随着业务量和功能的不断增加,越来越多的用户开始选择 ESS 来实现对业务的弹性支撑服务。然而,ESS 只能实现对 ECS 实例的自动调整,并不能让业务随着 ECS 实例的伸缩进行自动化调整。

针对以上的问题,开源工具 Packer 和 Terraform 提出了相应的解决方案。本文将向您展示如何利用 Packer 和 Terraform 实现对具体业务的弹性伸缩。方便起见,本文将以弹性伸缩 Jenkins 服务为例进行详细说明。

ESS 的局限性

ESS 根据用户业务的需求和策略,自动的调整 ECS 实例的数量,以实现业务的有效运行和对成本的有效控制。
ess-jenkins
然而,ESS 只解决了业务所在机器 ECS 的弹性伸缩问题,对具体业务的弹性伸缩却无法满足。正如上图所示,随着 Jenkins 业务的不断调整,ESS 根据 ECS 实例配置和相应的伸缩规则对 ECS 进行弹性伸缩,然后利用 Jenkins 部署脚本或者其他工具在扩展后的 ECS 上手动部署 Jenkins 服务,以达到扩展 Jenkins 服务的目的。如此一来,业务的管理和运维成本势必随着业务量的加大而不断增加。

Packer & Terraform 让 ESS 更灵活

面对如上的尴尬的问题,我们引入了开源工具 Packer 和 Terraform:

  • Packer
    A free and open source tool for creating golden images for multiple platforms from a single source configuration.

Alibaba/packer-provider : https://github.com/alibaba/packer-provider

  • Terraform
    A open source tool for building, changing, and versioning infrastructure safely and efficiently.

Alibaba/terraform-provider : https://github.com/alibaba/terraform-provider

首先,基于 Packer 快速定制 Jenkins 服务的镜像,接着将定制化的镜像作为 ESS 配置 ECS 实例配置的参数,最后基于 Terraform 和 ESS 的伸缩配置及伸缩规则实现面向 Jenkins 服务的ESS。
ess-jenkins-packer

Packer 定制 Jenkins 服务镜像

如上图所示,首先利用 ECS Image 和 Jenkins 部署脚本基于 Packer 快速定制安装有 Jenkins 服务的镜像,此次的定制需要借助于 Packer 和 Alibaba/packer-provider,所以在定制前需要在开发环境中安装 Packer 和 面向 Alicloud 的 packer-provider。下面是定制镜像的详细步骤:

  • 安装 Packer
    访问 Packer 下载页面 下载 MAC v1.0.0 版(可根据本地的开发环境自行选择版本)的 Packer 安装包,然后在将其放置在本地的 /bin 目录下(由于 Packer 和 Terraform 都是 Go 语言编写的,方便起见,将它们都存放在 Go 工作目录的 bin 目录下),解压后设置环境变量即完成安装。
    cd $<GOPATH>/bin
    wget https://releases.hashicorp.com/packer/1.0.0/packer_1.0.0_darwin_amd64.zip
    unzip packer_1.0.0_darwin_amd64.zip
    # 验证是否安装成功
    packer -version
  • 安装 packer-provider
    为了安装方便,避免源码安装,目前已经提供了三种操作系统的 packer-provider 安装包 Mac 64-bitLinux 64-bit 以及 Windows 64-bit,下载即可完成安装。
    cd $<GOPATH>/bin
    wget https://github.com/alibaba/packer-provider/releases/download/V1.1/packer-builder-alicloud-ecs_darwin-amd64.tgz
    tar -xzf packer-builder-alicloud-ecs_darwin-amd64.tgz
    
  • 设置环境变量
    运行 Packer 前需要设置环境变量 AK

    Set environment AK

    export ALICLOUD_ACCESS_KEY="access key value"
    export ALICLOUD_SECRET_KEY="secret key value"

  • 编写 Packer Jenkins 模板,自定义 Jenkins 镜像的属性
    packer-provider 已经提供了定制 Jenkins 镜像的模板,下图是模板的一部分,详见附件。
    {
      "variables": {
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
      },
      "builders": [{
        "type":"alicloud-ecs",
        "access_key":"{{user `access_key`}}",
        "secret_key":"{{user `secret_key`}}",
        "region":"cn-beijing",
        "image_name":"packer_jenkins",
        "source_image":"ubuntu_14_0405_64_40G_base_20170222.vhd",
        "ssh_username":"root",
        "instance_type":"ecs.n1.medium",
        "io_optimized":"true",
        "image_force_delete":"true",
        "ssh_password":"Test12345"
      }],
      "provisioners": [{
        "type": "file",
        "source": "examples/alicloud/jenkins/jenkins.sh",
            "destination": "/root/"    
       },{
        "type": "shell",
        "inline": [
        "cd /root/",
        "chmod 755 jenkins.sh",
        "./jenkins.sh"
        ]
      }]
    }

            

下载模板,编辑模板文件 alicloud-template/packer/examples/alicloud/jenkins/alicloud.json,可自定义镜像属性,如修改镜像名称 image_name,源镜像 source_image ,镜像 SSH 登录密码 ssh_password 等.

  • 运行 Jenkins 模板,定制 Jenkins 镜像

    Execute packer build

    cd alicloud-template/packer
    packer build examples/alicloud/jenkins/alicloud.json

    整个镜像定制过程大约持续10分钟,定制结束后,packer-provder将返回 imageId 以及其他镜像信息。

Terraform 搭建 Jenkins ESS

1. 本地安装 Terraform 和 terraform-provider

利用定制化的镜像,基于 terraform-provider 即可实现对 Jenkins ESS 的快速搭建。首先在开发环境中安装 Terraform 和面向 Alicloud 的 terraform-provider,它们也是由 Go 语言编写的。

  • 安装 Terraform
    和 Packer 类似,访问 Terraform 下载页面 下载 MAC v1.0.0 版(可根据本地的开发环境自行选择版本)的 Packer 安装包,然后在将其放置在本地的 /bin 目录下(由于 Packer 和 Terraform 都是 Go 语言编写的,方便起见,将它们都存放在 Go 工作目录的 bin 目录下),解压后设置环境变量即完成安装。
    cd $<GOPATH>/bin
    wget https://releases.hashicorp.com/terraform/0.9.2/terraform_0.9.2_darwin_amd64.zip
    unzip terraform_0.9.2_darwin_amd64.zip
    # 验证是否安装成功
    terraform -version
  • 安装 terraform-provider
    和 packer-provider 类似,terraform-provider 也提供了三种操作系统的安装包Mac 64-bitLinux 64-bit 以及 Windows 64-bit ,下载即可完成安装。
    cd $<GOPATH>/bin
    wget https://github.com/alibaba/terraform-provider/releases/download/V1.0.5/terraform-provider-alicloud_darwin-amd64.tgz
    tar -xzf terraform-provider-alicloud_darwin-amd64.tgz

2. 编写搭建 Jenkins ESS 的 Terraform 模板

terraform-provider 提供了快速搭建 ESS 的模板,在这基础上,我们利用已经定制化的镜像只需要修改 ESS 模板中的少量配置,即可快速搭建面向 Jenkins 服务的 ESS,如下是模板中的文件 main.tf,模板详见附件。

        data "alicloud_images" "ecs_image" {
          most_recent = true
          name_regex =  "^centos_6\\w{1,5}[64].*"
        }
        
        resource "alicloud_security_group" "sg" {
          name = "${var.security_group_name}"
          description = "tf-sg"
        }
        
        resource "alicloud_security_group_rule" "ssh-in" {
          type = "ingress"
          ip_protocol = "tcp"
          nic_type = "internet"
          policy = "accept"
          port_range = "22/22"
          priority = 1
          security_group_id = "${alicloud_security_group.sg.id}"
          cidr_ip = "0.0.0.0/0"
        }
        
        resource "alicloud_ess_scaling_group" "scaling" {
          min_size = "${var.scaling_min_size}"
          max_size = "${var.scaling_max_size}"
          scaling_group_name = "tf-scaling"
          removal_policies = "${var.removal_policies}"
        
        }
        
        resource "alicloud_ess_scaling_configuration" "config" {
          scaling_group_id = "${alicloud_ess_scaling_group.scaling.id}"
          enable = "${var.enable}"
        
          image_id = "${data.alicloud_images.ecs_image.images.0.id}"
          instance_type = "${var.ecs_instance_type}"
          io_optimized = "optimized"
          security_group_id = "${alicloud_security_group.sg.id}"
        }
        
        resource "alicloud_ess_scaling_rule" "rule" {
          scaling_group_id = "${alicloud_ess_scaling_group.scaling.id}"
          adjustment_type = "TotalCapacity"
          adjustment_value = "${var.rule_adjust_size}"
          cooldown = 60
        }
        
        resource "alicloud_ess_schedule" "run" {
          scheduled_action = "${alicloud_ess_scaling_rule.rule.ari}"
          launch_time = "${var.schedule_launch_time}"
          scheduled_task_name = "tf-run"
        }

根据新定制的镜像修改 Terraform 模板文件,具体操作步骤如下:

  • 修改 ESS 模板 main.tf
    编辑文件 alicloud-template/terraform/examples/alicloud-ess-schedule/main.tf,将资源 alicloud_imagesname_regex 参数设置为定制化镜像的名称,即上文中提到的 image_name,接着,由于 Jenkins 服务需要开通 8080 端口,所以需要设置 ECS 实例的安全组规则,为了方便起见,只需要将资源 alicloud_security_group_rule 的参数 port_range 修改为 "8080/8080" 即可,除此之外,您还可以设置伸缩组的其他属性,如伸缩组名称 scaling_group_name,ECS 实例类型 instance_type 等。
  • 修改 ESS 模板变量 variable.tf
    为了可以尽快的看到伸缩效果,我们可以设置伸缩定时任务的执行时间为未来 2 分钟。编辑文件 terraform/examples/alicloud-ess-schedule/variable.tf,修改变量 schedule_launch_time,此变量按照ISO8601标准表示,并使用UTC时间,格式为:YYYY-MM-DDThh:mmZ,由于北京时区是东八区,领先 UTC 八个小时,因此可根据未来本地未来两分钟的时间,利用公式:UTC = 本地时间 - 8 来进行设置。除此之外,您还可以设置最大最小伸缩实例的数量 scaling_max_sizescaling_min_size,一次伸缩实例的数量 rule_adjust_size 等。

3. 搭建 Jenkins ESS

编写完 ESS 的 Terraform 模板后,即可利用 terrafrom 实现对 Jenkins ESS 的快速搭建:

# execute terraform template
cd alicloud-template/terraform/examples/alicloud-ess-schedule
# preview resource
terraform plan
# create resource
terraform apply

整个搭建过程不超过 30 秒,搭建结束后,等待 ESS 定时任务的自动执行,执行结束后 ESS 将会扩展出指定数量的安装有 Jenkins 服务的 ECS。登录 ESS 控制台 即可查看 ESS 的详细信息。

4. 访问 Jenkins 服务

登录 ESS 控制台后,在相应 ESS 的“ECS 实例列表”页面即可查看已经伸缩的 ECS 实例,查看实例详情即可获取 Jenkins 实例的公网 IP,在浏览器中输入 <public_ip>:8080/jenkins 即可访问 Jenkins 服务。

写在最后

随着用户的业务需求和策略的不断变化,ESS 完美的解决了运行业务实例的自动伸缩,但却无法解决对业务的自动伸缩。Packer 和 Terraform 的出现,结合 ESS 在解决实例自动伸缩的同时,有效地实现了用户业务的自动伸缩,有效降低了用户对业务的管理和运维成本,实现了整个业务流程的代码化。

目录
相关文章
|
并行计算 Shell 网络安全
利用Packer和Terraform,一键创建即拿即用的迷你并行计算集群
        俗话说的话,没有完整使用过ECS产品的程序员不是好的程序员(好吧,其实是我说的)。当然,控制台操作或者用OpenAPI也没有必要去写一篇文章,所以那就来点儿有意思的。我们来说说,怎么用Packer和Terraform,这两个开源基础架构自动化编排工具,来快速搭建一个即拿即用的迷你并行计算集群(当然,这里的并行计算集群的网络知识普通的以太网互联啦)。
3749 0
|
Web App开发 网络协议 Linux
阿里云平台下Terraform+Packer一键部署WordPress案例
## 前言 前面 [云生态下的基础架构资源管理利器Terraform](https://yq.aliyun.com/articles/215592?spm=5176.8091938.0.0.qNh0er) 一文对Terraform做了产品介绍,包括安装、模板配置文件编写,资源构建与销毁等。这里通过介绍Terraform + Packer 在阿里云平台上一键部署WordPress的案例,以供大家使
2759 0
|
弹性计算 网络协议 Devops
云上DevOps-CodePipeline,Packer和Terraform集成实践探索
DevOps越来越火,各种产品层出不穷,技术人员如果不谈谈这个词,就会显得很落伍了,在这种形势下,阿里云也推出了自己的DevOps公共云产品CodePipeline,本文并不想介绍已经铺天盖地的DevOps概念,而是结合阿里云的产品CodePipeline和开源工具Packer,Terraform来实践一种全新云上的DevOps方案,从构建代码,创建自定义镜像,然后基于包含新应用的镜像来创建运行应用的整个基础设施,包括ECS,VPC网络,安全组等等,然后发布应用,从无到有一键完成。
4867 0
|
弹性计算 运维 Devops
Multi-Cloud模式下Terraform和Packer开源工具实践分享
在2017云栖大会·深圳峰会上,来自阿里云云开发的黎山分享了《Multi-Cloud基础设施和应用管理实践》。软件行业的变化、云计算的出现和兴起,推动着越来越多的企业选择Multi-Cloud模式。黎山详细介绍了Terraform和Packer开源工具的使用方法,通过4个案例源码分享了具体的实践过程。
9815 0
|
弹性计算 运维 Devops
巧用Terraform和Packer开源工具完成云上自动运维
2017年在线技术分会——运维/DevOps在线技术峰会上,来自阿里云的黎山分享了利用开源DevOps工具完成云上的自动运维的实践。她首先通过对5个应用场景的分析引出了“自动化能自动化的一切”的理念。然后介绍了使用Terraform和Packer开源工具完成云上自动运维的具体实现过程。
13428 0
|
数据中心 iOS开发 MacOS
玩转阿里云 Terraform(三):Terraform 的安装和加速
本文以Mac OS为例,详细介绍如何在本地安装Terraform,并在文章最后介绍一种可以加速Terraform安装的方法。
14984 0
|
1月前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
25 0
|
10月前
|
Kubernetes NoSQL 持续交付
使用Terraform/Ansible/Kubernetes在阿里云上自动部署MongoDB
Terraform, Ansible, Kubernetes, MongoDB, AliCloud
294 1
EMQ
|
存储 JSON 安全
使用 Terraform 在阿里云上快速部署 MQTT 集群
本文将以分布式物联网 MQTT 消息服务器 EMQX 为例,采用阿里云作为公有云平台,介绍如何使用 Terraform 快速部署一个高可用的 MQTT 集群。
EMQ
234 0
使用 Terraform 在阿里云上快速部署 MQTT 集群
|
弹性计算 运维 自然语言处理
Terraform 支持自动化开通阿里云产品
## 什么是 Terraform 和云产品开通 **Terraform** 一款开源的运行在客户端的自动化资源编排工具,以 IaC 的理念实现云资源的自动化运维。更多细节可以参考 [Terraform 是什么](https://developer.aliyun.com/article/713099)。 **云产品开通**,顾名思义,就是阿里云客户在使用某些云产品前,需要登录云产品官方控
710 0
Terraform 支持自动化开通阿里云产品

推荐镜像

更多