背景html
云主机是用户使用最高频的云产品之一。随着云主机数量的增多,如何在云主机中保证版本化部署的一致性,成为用户常见的难题。在现有状况下,用户首先须要手动或使用脚本链接主机,而后再进行部署安装,操做流程复杂且对环境要求苛刻,难以保证一致性和可用性。nginx
为了解决此类问题,UCloud 开发了相关代码,并被自动化构建镜像工具 Packer 的官方仓库所采纳。经过 Packer 建立自定义镜像,能够减小部署时间并提升可靠性,提升了用户自动化部署的能力。8月14日,Hashicorp 官方正式发布了版本 1.4.3 ,其中包括了 UCloud Packer Builder。docker
Packer是什么?shell
Packer 是 Hashicorp 公司推出的自动化打包镜像的轻量级开源工具,云厂商经过构建本身的 Builder 集成到 Packer 中去,便可凭借单一配置文件,高效并行的为多云平台建立一致性的镜像。目前 Packer 已经造成完整生态,并与多家主流云厂商创建合做。json
UCloud Packer 能够运行在经常使用的主流操做系统上,它不是 Chef、Puppet 等软件的替代品,而是集成并使用这些自动化配置工具在镜像上预装软件等。再配合 UCloud Terraform、UCloud CLI 等工具,能够在多云的 DevOps 场景下,实现基础设施即代码(IaC)、持续集成和快速交付。centos
以下图所示,Packer 经过在 Provisioner 中集成 Chef、Shell、Puppet 等工具,制做包含各种软件的不可变镜像,供多云平台的云主机、Docker 等使用。架构
Hashicorp 官方将 Packer 的优点描述以下:ssh
**1. 基础架构迅速部署:**Packer 镜像能够在几秒钟内启动彻底配置的云主机,有利于生产和开发;工具
**2. 多提供商可移植性:**Packer 能够为多云平台建立了相同的镜像,每一个环境都能运行相同的机器镜像,提供最终的可移植性;post
**3. 稳定性高:**Packer 在构建镜像时会为机器安装和配置全部软件。若是脚本中存在错误,能够被提早捕获,而不是在启动计算机几分钟后;
**4. 可测试性高:**Packer 在构建机器镜像后,能够快速启动该机器镜像并进行冒烟测试,以验证镜像是否正常工做。若是是正常工做,则能够确信从该镜像启动的任何其余计算机都能正常运行;
5. 可扩展性高: Packer 的插件机制使得它可以自如的根据需求集成工具和拓展功能。
Packer 与传统控制台建立镜像的对比:
生命周期
利用 Packer 打包镜像的完整周期以下:
用户经过构建 JSON 模版,执行 packer build 命令调用 UCloud Builder;
参数提早校验保证可用性;
建立云主机、EIP 等相关临时资源(若配置为内网环境则无需 EIP);
经过 SSH 或 WinRM 等链接主机,执行 Provisioner 进程;
关闭云主机,并建立镜像;
复制镜像;
删除主机、EIP 等临时资源;
执行后处理进程(如本地镜像导入等)。
使用演示
下面经过一个视频来形象地展现 Packer 的使用方式。目标是构建一个装有 nginx 应用的镜像,咱们首先建立一个 test.json 文件,而后执行以下命令一键构建镜像:
packer build test.json
Packer 对多云管理的价值
在这次 Hashicorp 官方发布前,UCloud 内部已经积累了必定的 Packer 使用经验。从中发现,若是须要管理多云环境,或者要在公有云与私有云间维护相同的系统,又或者构建的是虚拟机而不是容器,Packer 都是一个很好的选择。
经过一个具体例子来讲明。下面这段代码定义了一个 UCloud 公有云上的虚拟机镜像,Packer 利用 ucloud-uhost Builder 配置的参数,先建立一个干净的 CentOS 7 系统,再 ssh 执行 provisioner 定义中指定的三段 shell 脚本,最终成功建立镜像并返回镜像 ID。
{ "variables": { "ucloud_public_key": "{{env UCLOUD_PUBKEY
}}", "ucloud_private_key": "{{env UCLOUD_SECRET
}}", "ssh_user": "root", "ssh_password": "password", "ucloud_project_id": "org-projectid", "image_id": "uimage-dpdgyw", "consul_version": "1.5.1", "region": "cn-bj2", "az": "cn-bj2-02" }, "builders": [ { "type": "ucloud-uhost", "public_key": "{{user ucloud_public_key
}}", "private_key": "{{user ucloud_private_key
}}", "project_id": "{{user ucloud_project_id
}}", "region": "{{user region
}}", "availability_zone": "{{user az
}}", "instance_type": "n-basic-2", "source_image_id": "{{user image_id
}}", "ssh_username": "{{user ssh_user
}}", "ssh_password": "{{user ssh_password
}}", "image_name": "consul-server-{{user consul_version
}}" } ], "provisioners": [ { "type": "shell", "scripts": [ "scripts/config-yum.sh", "scripts/consul-service.sh", "scripts/consul-server.sh" ], "environment_vars": [ "CONSUL_VERSION={{user consul_version
}}" ] } ] }
此时如有额外需求,要求将其也部署到私有云的 Kubernetes 上,该怎么办?一种方法是把 shell 脚本改写成对应的 Dockerfile,但如果构建过程很是复杂,那么改写的过程也会很复杂,而且可能引入错误。
但用 Packer,只须要修改一下 builder 配置的细节:
{ "variables": { "consul_version": "1.5.1" }, "builders": [ { "type": "docker", "image": "centos:7", "commit": true, "changes": [ "CMD ["tail -f /dev/null"]", "ENTRYPOINT [""]" ] } ], "provisioners": [ { "type": "shell", "scripts": [ "scripts/config-yum.sh", "scripts/consul-service.sh", "scripts/consul-server.sh" ], "environment_vars": [ "CONSUL_VERSION={{user consul_version
}}" ] } ], "post-processors": [ [ { "type": "docker-tag", "repository": "lonegunmanb/consulServer", "tag": "0.1" }, "docker-push" ] ] } 在公有云平台上已通过测试的构建脚本,就能够直接用来构建 Docker 镜像,而且在构建完成后,自动打上 tag,push 到 Docker Hub 仓库去。而且,因为 Packer 是执行完 provisioner 后,经过 docker commit 的方式构建镜像,因此 Packer 的构建只会增长额外的一个层,避免不恰当的 Dockerfile 增长多个层的问题。
Packer +Terraform,1+1>2
Packer 配合 Git、Terraform、UCloud CLI 等使用,能够实现 DevOps 下的基础设施即代码(IaC),达到持续集成和快速交付。
以下图,Packer 配合 Git 对镜像的配置文件作版本化控制,从而来实现服务的版本化,保证了实例的最终一致性,而后利用 Packer 和 Terraform 自动化构建服务的目的。
在自动化流程中,首先变动镜像配置仓库,触发执行 Terraform 命令;
Terraform 执行 packer build 命令构建镜像;
将制做成功的镜像查询给 Terraform 使用;
最后由 Terraform 构建并启动新实例替换原有的旧实例,完成服务自动化部署。
UCloud 此前已提供对 Terraform 的官方集成,可经过产品文档了解更多详情。文档连接:docs.ucloud.cn/compute/ter…
总结
UCloud 经过对 Packer 的接入,提供了一种在云主机中自动化配置环境的能力,并且它能够配合 cloud-init 及一些经常使用的自动化部署软件使用,进一步拓展功能。另外,经过配合UCloud Terraform 、UCloud CLI 等工具,能够实现对基础架构的版本化和代码化管理,达到精准交付和快速部署以及最终一致性。
官方参考文档地址:www.packer.io/docs/builde…