写点什么

如何在 Azure Stack 中自定义虚拟机镜像?

  • 2017-10-01
  • 本文字数:4497 字

    阅读完需:约 15 分钟

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 所做的工作,希望能够对读者有一定的启发。

感谢江柳对本文的审校。

2017-10-01 18:452059

评论

发布
暂无评论
发现更多内容

美团前端必会vue面试题合集

bb_xiaxia1998

Vue

解读Teradata结束中国直营背后的原因!国产数据库能填补空缺吗?

雨果

数据库管理工具 国产数据库 teradata SQL工具

腾讯前端一面经典手写面试题合集

helloworld1024fd

JavaScript

unittest中使用ddt后生成的测试报告名称如何修改?(如test_api_0修改成test_api_0_titile)

单元测试 自动化测试 unittest 参数化 ddt

【FAQ】集成分析服务的常见问题及解决方案

HarmonyOS SDK

HMS Core

写过vue自定义指令吗,原理是什么?.m

bb_xiaxia1998

Vue

假如问:你是怎样优化Vue项目的,该怎么回答

bb_xiaxia1998

Vue

可视化分析能力MAX,瓴羊Quick BI带来全新数据分析体验

对不起该用户已成仙‖

面试了20+前端大厂,整理出的面试题

loveX001

JavaScript

谈谈Linux内核的噪声

统信软件

Linux 内核

万亿级对象存储的元数据系统架构设计和实践

百度开发者中心

对象存储 文件存储 百度沧海

LR性能测试常见问题及处理方法(一)

性能测试 问题排查 LoadRunner

Golang 编程“珠玑”

MatrixOrigin

golang 分布式数据库 编程语言 MatrixOrigin MatrixOne

腾讯前端必会面试题(必备)

loveX001

JavaScript

构建云边端一体的分布式云架构,软硬结合驱动边缘计算创新场景

百度开发者中心

云原生 边缘计算 #百度智能云#

堡垒机行业标杆产品是哪家呢?有哪些功能?

行云管家

网络安全 信息安全 等保 堡垒机

LR性能测试常见问题及处理方法(二)

性能测试 问题排查 LoadRunner

建设 TiDB 自动化平台:转转 DBA 团队实践

PingCAP

数据库 自动化 TiDB

百度前端必会react面试题总结

beifeng1996

React

面试官:你是怎样进行react组件代码复用的

beifeng1996

React

令人头秃的js隐式转换面试题,你能做对吗

loveX001

JavaScript

面试官:说说React-SSR的原理

beifeng1996

React

SQL工具性能实测:居然比Navicat还快,数百万行数据导出仅51秒

雨果

sql 数据库管理工具 Web SQL sql studio

Java 集合中的排序算法浅析

京东科技开发者

jdk 后端 Java、 排序算法 企业号 2 月 PK 榜

基于飞桨PaddleClas完成半导体晶圆图谱缺陷种类识别

飞桨PaddlePaddle

paddle 开源 飞桨

BeyondCampus-护航高校网络安全

权说安全

网络安全 零信任

Led透明显示屏的发展超乎你想象

Dylan

LED 显示器 LED显示屏

Unittest接口测试生成报告和日志方法

日志 单元测试 自动化测试 unittest 测试报告

目前兰州市等保测评机构有几家?有新增的吗?

行云管家

等保 等级保护 等保测评 兰州

有爱相伴,宠爱有家,皮皮App发起关爱流浪动物主题公益活动

联营汇聚

如何在Azure Stack中自定义虚拟机镜像?_微软_刘建志_InfoQ精选文章