Azure Stack 环境中服务的提供者或运营者从微软变成了 Azure Stack 集成环境的运营者,通过 Azure Stack 的 MarketPlace,我们可以根据用户的特定需求,提供一些定制化的应用,获得与公有云不一样的用户体验。本文将主要介绍如何在 Azure Stack 的 MarketPlace 中如何添加一个自定义的虚拟机镜像并定制满足需求的 Gallery Item,同时通过自服务的模式提供给业务的消费者。 这一篇,我们将探讨以下几个问题:
- 如何制作自定义镜像
- 从自定义镜像创建虚拟机的几种方式
- 如何创建自定义的 Gallery Item
制作自定义镜像
Azure Stack 的镜像分为 generalized 和 specialized 两种不同的形式。 Generalized 镜像中已经删除了所有个人账户信息及一些其它数据,可以作为模板来创建一个或者多个虚拟机。微软在 Windows 和 Linux 下都提供了相应的工具来 generalize 镜像,Windows 下可以采用 Sysgrep,Linux 下可以安装 Azure Linux Agent,执行 sudo waagent –deprovision 来实现。 Specialized 镜像中保留了原始虚拟机中的用户账户、应用程序和其它状态数据,可以作为模板创建一台虚拟机。Specialized 镜像可以看作是原始虚拟机在某个时间的的 snapshot。 镜像既可以从 Azure Stack 或者 Azure 上运行的虚拟机来制作,比如捕获或者克隆虚拟机,也可以将在本地基于 Hyper-V Manager 启动的虚拟机导出作为镜像。几种不同的自定义镜像的详细制作过程请参考下面链接:
从自定义镜像创建虚拟机
在获得虚拟机镜像之后,如何在 Azure Stack 中根据镜像创建虚拟机? 这部分介绍如何将本地 VHD 镜像上传到 Azure Stack 中,并且创建虚拟机。Azure Stack 中可以通过 Portal、PowerShell,ARM Template 等方式来进行相应的操作,这些操作包括 2 步:
- 上传本地 VHD 镜像到 Azure Stack 上
- 创建虚拟机
通过 Portal 新建存储账户并上传本地镜像
- 登陆 Azure Stack
- 新建存储账户
- 新建 Blob Container,名字为 vhds
- 将本地 VHD 文件以 PageBlob 的类型上传到新建的 Container 中
通过 ARM Template 从镜像创建新的虚拟机
镜像上传后,就可以开始创建虚拟机了。从 VHD 创建虚拟机有两种模式:Attach 和 From-Image。Attach 模式下,VHD 文件是直接附加到新建的虚拟机上。因此采用 Attach 模式,一个 VHD 文件只能创建一台虚拟机。而 From-Image 模式,首先会将 VHD 文件复制一份到指定的 Blob Container 中,然后将 VHD 的副本附加到虚拟机上,因此可以从一个 generalized VHD 创建多台虚拟机。
这里采用 ARM Template 来创建虚拟机, ARM Template 的使用方式及创建虚拟机的完整 Template 可以在 AzureStack-QuickStart-Templates 上获得,这里仅提供两种模式下不同的部分来进行对比分析:
- Attach 模式
Attach 模式下只需要提供 vhd 的 uri,createOption 采用"Attach" 这里 parameters(‘osDiskVhdUri’) 为
也就是前面通过 Portal 上传的 VHD 文件的 URL。
Attach 模式流程:
- From-Image 模式
From-Image 模式下需要提供 image 的 uri 和 vhd 的 uri, createOption 采用 FromImage variables(‘userImageUri’) 为前面用 Portal 上传的 VHD 文件的 URL
而 variables(‘osDiskVhdUri’) 为
是用户指定的新的虚拟机绑定的 VHD 文件,实际上是 CentOS7-AzureStack-WithAgent.vhd 的副本。
注:这里为了方便,将 CentOS7-AzureStack-WithAgent.vhd 和 testVM.vhd 放在了同一个 Blob Container 中。实际上,副本 VHD 可以放在其他的存储账户中,并且名字也可以根据需要设置。
From-Image 模式流程:
Azure Stack 镜像库
上一节中介绍了如何上传镜像及通过 ARM Template 从镜像创建虚拟机。VHD 镜像上传到我们自己新建的存储账号中。创建虚拟机的时候直接通过 Blob 的 URL 来定位镜像文件。
那么除了用户自己维护镜像的存储,Azure Stack 有没有提供一个统一的镜像库来方便的存储镜像呢?除了用 URL 来标识和定位镜像,有没有别的方式来唯一指定镜像呢?
答案是有。本节讨论 Azure Stack 的镜像库,主要介绍下面几个问题:
- 自定义镜像上传到镜像库
- 镜像库中镜像的标识
- 从镜像库中的镜像创建虚拟机
通过 Admin Portal 上传自定义镜像到镜像库
Azure Stack 的镜像库在 Resource Provider 的 Compute 当中,需要 admin 权限才能进行操作。
1、从 admin portal 用 admin 账号登陆 Azure Stack
admin portal 地址:
2、点击 Resource Providers-- 点击 Compute–VM images
可以看到目前已经上传到镜像库中的所有镜像。
3、点击 Add,填写镜像的相应标识信息,然后点击 Create
其中 OS Disk Blob URI: 就是我们上一小节中上传的 VHD 镜像的 Blob URL, 也即:
注: 由于上一小节是在 tenant portal 进行的操作,这里实际上需要在 admin portal 重新执行一遍。
4、成功后,即将镜像上传到了镜像库中
镜像库中镜像的标识
在上传镜像的过程中,我们需要填写一些相关信息,如 PUBLISHER, OFFER, SKU, VERSION, OSTYPE, OS DISK BLOB URI,那么这些信息到底有什么用呢?在点击了 Create 后,发生了什么过程呢?
实际上主要发生了两步:
1、将 OS DISK BLOB URI 指定的 vhd 文件复制到 VM Images 库中
在我们的 POC 测试环境中,镜像库位于 C:\ClusterStorage\Volume1\Shares\SU1_Infrastructure_1\CRP\PlatformImages 中,可以看到有两个文件夹,对应着我们在镜像库中的两个镜像。
2、生成该镜像的对应的 Manifest 文件,用来标识该镜像。
进入刚刚上传的镜像对应的文件夹中可以看到,除了存在着一个复制过来的 VHD 文件外还有一个 Manifest 文件。
Manifest 文件的内容如下:
Manifest 文件中包含了前面填写的 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 信息,也包含了镜像文件在镜像库中的存储位置以及镜像是从哪里复制过来的。
其中 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 唯一标识了当前的镜像。通过这些标识信息,就可以指定用该镜像创建虚拟机。
从镜像库中的镜像创建虚拟机
有了镜像的唯一标识信息,就可以创建虚拟机,前面小节介绍了如何通过 ARM Template 来创建虚拟机,这里则通过 PowerShell 来创建。
在 vmConfig 中通过标识信息来指定用我们刚刚上传的镜像来创建新的虚拟机。
自定义 Gallery Item
前面的几个小节介绍了从自定义镜像创建虚拟机的几种方式,无论是采用 PowerShell 还是 ARM Template,都需要一定的编程基础,那么有没有一种方式,可以在 Portal 上通过点击操作来创建自定义的虚拟机呢?本节就介绍如何为自定义镜像在 Portal 上创建图标,也就是 Gallery Item。
什么是 Gallery Item
简单的理解,在 Azure 中我们可以通过如下方式创建虚拟机:
如图点击对应的图标,就可以弹出创建虚拟机的界面:
不需要配置任何的开发环境,不需要一定的编程基础,只要点击,就可以弹出创建虚拟机的相关步骤和需要填写的项,来快速的创建一台虚拟机。
在 Azure Stack 中同样可以实现!
利用 Azure Stack Tool 创建 Gallery Item
在 Azure Stack 深入浅出系列的上一篇中介绍了 Azure Stack 运维工具 Azure Stack Tools 的使用,新版本的 Azure Stack Tools 提供了 Add-AzsVMImage 方法来实现:
执行上面的指令后就可以实现与 Azure 类似的通过 Portal 来创建虚拟机
更多 Azure Stack Tools 的内容请参考: Azure Stack Tools
深入理解自定义 Gallery Item 的流程
利用 Azure Stack Tools 的 Add-AzsVMImage 可快速的实现自定义 Gallery Item。那么 Add-AzsVMImage 到底封装了什么操作?自定义 Gallery Item 需要经过哪些过程呢? Add-AzsVMImage 主要做了 2 个工作:
- 将本地 VHD 文件上传到 Azure Stack 的镜像库
- 为镜像库中的镜像创建 Gallery Item
将本地 VHD 文件上传到 Azure Stack 镜像库
将镜像上传到镜像库的过程前面已经介绍过了,Add-AzsVMImage 所进行的操作与前面介绍的相同,流程如下:
- 在 Azure Stack 中创建新的临时资源组,存储账号,Blob Container
- 将本地 VHD 文件上传到新建的 Container 中
- 将临时存储账户中的 VHD 文件的 BLob URL 作为 OS DISK BLOB URI 的值,Add-AzsVMImage 指令中的参数 publisher, offer, sku, version, osType 的值作为 PUBLISHER, OFFER, SKU, VERSION, OSTYPE 的值,在镜像库中添加新的镜像
- 删除创建的临时资源组,包括其中的存储账号、Container 以及临时的 VHD 文件
为镜像库中的镜像创建 Gallery Item
本小节将通过 PowerShell 来详细分析自定义 Gallery Item 的流程。主要分为以下几步:
- 填写相应的 Json 描述文件
- 生成 azkpg 包
- 生成 Gallery Item
1、首先创建下面的目录结构及文件:
其中 DeploymentTmeplates、Icons、strings 为文件夹的名字。Icons 下面存放的是图标文件,可以选择自己需要的 png 文件进行替换。
注:可以从 github 上下载 CustomizedVMGalleryItem.azpkg,然后重命名为 CustomizedVMGalleryItem.zip。解压后删除掉多余的文件,只留下上面目录结构和文件。
2、编辑 Manifest 文件:
Manifest 文件包含了一些对图标的描述,包括名字,发布者,版本,图标样式等信息。也就是对下图中 CentOS 7.2 的一些描述。
3、编辑 UIDefinition.json
UIDefinition 定义了在创建新的虚机时 UI 显示的步骤和内容,有两种类型 一种是 Azure 的默认类型 CreateVMWizardBlade,如下图共 四步,一般都采用这种类型比较好。
另一种是 DeployFromTemplateBlade 类型,这种需要在 DeploymentTemplates 文件夹下,填写需要显示的内容,感兴趣的读者可以深入研究一下。
4、编辑 DeplymentTemplates\CreateUIDefinition.json
ImageReference 中可以设置下面的属性来表示采用的镜像:
5、编辑 Strings\resources.resjon 里面主要是 Manifest.json 中用到的几个变量的详细信息
6、生成 azkpg 包
-> 使用工具 AzureGalleryPackager,下载地址
-> 解压,进入目录
-> 执行 powershell 指令
.\AzureGalleryPackageGenerator\AzureGalleryPackager.exe -m C: \CentOS.72\Manifest.json -o C:\InesaMarketPlaceItems
-> 执行成功后会在 InesaMarketPlaceItems 文件夹下生成相应的 azkpg 文件 Inesa.CentOS72.1.0.0.azpkg 。
7、上传 azkpg 文件到 Blob 中,并记录文件在 Blob 中的 URL
8、执行下列 PowerShell 指令,根据 azkpg 文件生成 Gallery Item
其中, https://itemstore.blob.local.azurestack.external/templates/Inesa.CentOS72.1.0.0.azpkg 是上传的文件的 Blob URI
经过上面的 8 步,已经可以实现创建 Gallery Item 的功能,实际上,Add-AzsVMImage 中也是根据这个过程来实现的。
利用 Publishing Tool 来添加 Gallery Item
在前面小节中,需要执行 PowerShell 指令来添加 Gallery Item。随着 Azure Stack GA,微软提供了一个 Publishing Tool 来实现可视化的添加 Gallery Item。界面如下图:
Publishing Tool 的详细使用教程: Add marketplace items using publishing tool
总结
通过本文,我们了解了如何创建自定义的虚拟机镜像,并且通过自定义镜像来创建虚拟机,为自定义镜像创建 Gallery Item 等。从较简单的例子入手,逐步深入,来介绍 Azure Stack Tools 中 Add-AzsVMImage 所做的工作,希望能够对读者有一定的启发。
感谢江柳对本文的审校。
评论