云计算的强大优势之一是能够以可重复的方式设置虚拟机,使用适当的工具在虚拟机启动时向其中注入信息,以便根据您的确切需求对其进行配置。在本教程中,我们将研究如何将 OpenStack 的原生 Heat 代理插入到镜像中,以允许使用 Heat 进行应用程序设置。
大多数 OpenStack 镜像都启用了 cloud-init。这意味着此镜像创建的每个实例都可以在早期启动时运行 cloud-init 脚本,以便进行一些配置。目录 /var/lib/cloud
包含 cloud-init 特定的子目录。在这些子目录中,您将找到当前实例 ID、上一个实例 ID(可能与当前实例 ID 不同)、当前和上一个数据源、开始和结束时间、错误(如果存在)、由相应的处理程序(在 handlers/ 子目录中)下载或创建的自定义脚本(在 scripts/ 子目录中)、从元数据服务下载的用户数据等等。
但是,如果我们希望在实例生命周期的不同部分(而不仅仅是在早期启动时)进行一些配置/操作怎么办?例如,如果我们正在使用 OpenStack 自动扩展服务,我们的服务器将被自动添加和删除,无需人工干预。 “当任何这些服务器被确定为已结束时,它们需要一些时间来清理自己,并且需要一些配置(例如,结束活动会话、关闭与其他服务的活动连接等)。
这就是基于 Heat 的软件部署的价值所在,它促进了 OpenStack Heat 单元和实例之间的通信,以便在不同的生命周期配置实例。自 OpenStack Icehouse 版本以来,此功能已可用。要使用它,我们需要在镜像上安装一些代理,以及 Heat 模板中的一些定义(主要基于 OS::Heat::SoftwareDeployment
和 OS::Heat::SoftwareConfig
资源类型)。
代理可以在启动时安装(通过在启动时安装代理的脚本,或通过 Heat 模板中的定义)。这里我将讨论如何在镜像中安装代理。在本示例中,我们将使用的代理有:heat-config、os-collect-config、os-refresh-config、os-apply-config、heat-config-cfn-init、heat-config-puppet、heat-config-salt 和 heat-config-script。
准备镜像构建
在本示例中,我假设您拥有自己的 OpenStack 就绪镜像,并且您想将 Heat 代理添加到您的镜像中。我将使用 Diskimage-builder 来构建镜像。Diskimage-builder (DIB) 是一个由 HP、Red Hat 和 Cisco 管理的开源项目,并根据 Apache License(版本 2.0)获得许可。我的操作系统是 Fedora 21,在本示例中,我将构建一个带有 Heat 支持的 CentOS 7 自定义镜像。
如果您的镜像已经在云端,您可以使用 Glance 客户端 在提供您的凭据后下载它。要在 Fedora 上安装 Glance 客户端,请键入
# yum install python-devel libffi-devel
# pip install python-glanceclient
要下载镜像,请执行
# glance image-download --file outputImageFilename imageID
通过这样做,您将在本地磁盘上获得文件 outputImageFilename
。
Diskimage-builder 需要足够的 RAM 用于缓存。如果您的镜像很大,并且您没有足够的内存,您可以使用 /tmp 在磁盘上进行缓存。有关执行此操作的说明,请参阅本文档的后面部分。
现在我们需要克隆存储库:Diskimage-builder、镜像元素和 heat-templates
# git clone https://git.openstack.org/openstack/diskimage-builder.git
# git clone https://git.OpenStack.org/OpenStack/tripleo-image-elements.git
# git clone https://git.openstack.org/openstack/heat-templates.git
需要导出一些环境变量
DIB_LOCAL_IMAGE
:此变量包含本地镜像的路径(在我的例子中为 my_image.qcow2)。如果未设置此变量,Diskimage-builder 将访问 Internet 并获取通用镜像。如果您没有任何镜像,请不要导出此变量以保留默认值。DIB_CLOUD_IMAGES
(HTTP 地址):如果您的镜像在 Internet 上公开,您可以导出此变量。ARCH
:此变量包含架构。在我的例子中为“amd64”:# export ARCH="amd64"
。这将转换为 x86_64。
在我的 CentOS 7 示例中,使用此变量的源文件是“.../Diskimage-builder/elements/centos7/root.d/10-centos7-cloud-image”。我建议您检查您选择的操作系统对应的文件(转到您选择的 OS 目录中的 root.d 目录,并检查 ARCH
支持的内容)。还要检查此文件中的 DIB_CLOUD_IMAGES
变量和其他变量。
然后我们需要安装一些软件包
# yum install qemu 或 # yum install qemu-img
# yum install python-pip git
# pip install git+git://git.openstack.org/openstack/dib-utils.git
镜像构建
接下来,我将使用 Diskimage-builder 将 Heat 代理添加到我的镜像中,以便从我的镜像创建的实例可以在不同的生命周期与 Heat 交互。在 bash 脚本中编写以下内容并执行它,或者逐行执行它。注意:您需要位于克隆存储库的目录中,或者使用绝对路径。
export ELEMENTS_PATH=tripleo-image-elements/elements:heat-templates/hot/software-config/elements
# 自定义此行。可能的值:fedora centos7、debian、opensuse、rhel、rhel7 或 ubuntu
export BASE_ELEMENTS="centos7 selinux-permissive"
export AGENT_ELEMENTS="os-collect-config os-refresh-config os-apply-config"
export DEPLOYMENT_BASE_ELEMENTS="heat-config heat-config-script"
# 对于任何其他选择的配置工具。例如 heat-config-cfn-init、heat-config-puppet 或 heat-config-salt。不在我的例子中。
export DEPLOYMENT_TOOL=""
export IMAGE_NAME=software-deployment-image-gold
diskimage-builder/bin/disk-image-create vm $BASE_ELEMENTS $AGENT_ELEMENTS $DEPLOYMENT_BASE_ELEMENTS $DEPLOYMENT_TOOL -o $IMAGE_NAME.qcow2
(注意变量 IMAGE_NAME
决定了镜像名称。)
镜像上传
构建镜像后,您将获得文件 software-deployment-image-gold.qcow2。如果您的镜像很大,您可以在将其上传到 OpenStack (Glance 单元) 之前对其进行压缩
# tar -zcvf gw-software-deployment-gold.qcow2.tar.gz gw-software-deployment-gold.qcow2
您还可以将选项“-t tar”传递给命令 diskimage-builder/bin/disk-image-create
,以使镜像由 Diskimage-builder 压缩。也可以对上面提到的 ARCH 使用此选项“-a i386|amd64|armhf”。有关更多详细信息,请参阅完整文档 。
要上传压缩后的镜像,请执行
# glance image-create --name "gw-software-deployment-gold" --is-public false --disk-format qcow2 --file gw-software-deployment-gold.qcow2.tar.gz
我在使用 Firefox 上传大型文件(如镜像)时遇到了问题,但 Chrome 通常似乎可以工作。我建议使用 Chrome 浏览器从 OpenStack 控制面板 (Horizon) 上传您的镜像。
您可能还需要调整操作系统(即,您可能需要更新系统文件)和应用程序本身的性能参数,以便从镜像创建的服务器已经过调整。您可以在拍摄快照之前在实时服务器上进行调整,或者您可以使用 guestfish 更新本地镜像的系统文件,然后再上传。
现在您可以从新上传的镜像创建实例,您可以在其中开始使用 Heat 模板中不同生命周期的软件部署。
使用“/tmp”进行磁盘缓存
如果您的计算机缺少足够的 RAM 来完成镜像构建过程,您将需要增加 /tmp 的大小。例如(使用 15GB)
# dd if=/dev/zero of=/usr/tmp-dir bs=1024M count=15
# mke2fs -j /usr/tmp-dir; chmod 777 /usr/tmp-dir
# mount /usr/tmp-dir /tmp>
注释
- 在镜像构建期间,如果您遇到与软件包更新相关的问题,您可以通过在创建镜像之前的实时服务器中使用
yum-config-manager --disable repositoryName
临时禁用导致问题的存储库(您将从云端下载以进行操作的镜像)。 - 注释掉文件“..../heat-templates/hot/software-config/heat-container-agent/scripts/configure_container_agent.sh”中的行
yum -y update
可以解决更新时出现的问题,例如不同版本软件包之间的冲突。 - 您可以多次执行此过程,进行不同的更新,直到镜像创建过程成功完成。如果您使用默认值,则不应有任何问题。
- 您可以指定软件包依赖项。在我的示例中,我使用的是“.../diskimage-builder/elements/centos7/element-deps”中的 CentOS 7 默认值:如果您愿意,您可以在此处添加更多内容,以便安装它。
有关更多信息,您可能希望查看最近在温哥华举行的 OpenStack 峰会上的“为 Diskimage-builder 创建自定义元素”。
本文的早期版本之前发表在 VOIP Magazine 上。经许可重新发布。
评论已关闭。