QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

如何在 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:451909

评论

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

大型供应链物流企业的数字化转型方法论

明道云

架构训练营-模块9秒杀系统

张Dave

统一观测丨使用 Prometheus 监控 E-MapReduce,我们该关注哪些指标?

阿里巴巴中间件

阿里云 云原生

async 与 Thread 的错误结合

newbe36524

C#

使用OpenAI接口释放ChatGPT API 的力量

devpoint

React nextjs ChatGPT

经验分享:高德地图如何短时间快速完成春节出行备战工作?

阿里巴巴中间件

阿里云 云原生 函数计算

将老人拉出无声的世界,AI是怎么做的?

脑极体

AI医疗

国内AGV调度系统到底是什么水平?

申扬科技

调度系统 AGV

强强联合:Neovim+ChatGPT | 社区征文

SkyFire

ChatGPT neovim

前端学习

阡陌r

一天吃透Git面试八股文

程序员大彬

git 面试

Kubernetes容器状态探测的艺术

俞凡

Kubernetes 云原生

极氪汽车 APP 系统云原生架构转型实践

阿里巴巴中间件

阿里云 云原生

FL Studio21中文语言版水果编曲工具

茶色酒

FL Studio21

JavaScript异步编程的深入理解,使用回调函数实现异步编程

兴科Sinco

JavaScript 前端 前端开发 异步编程

前端学习路径

阡陌r

订单超时怎么处理?我们用这种方案

阿里巴巴中间件

阿里云 云原生

工作一年,我重新理解了《重构》

阿里巴巴中间件

阿里云 云原生 重构

阿里云消息队列 Kafka 生态集成的实践与探索

阿里巴巴中间件

kafka 阿里云 云原生 消息队列

如何设计一个优秀的 Go Web 项目目录结构

江湖十年

Go 设计 后端 项目 Web Service

初识大热的ChatGPT的几点思考|社区征文

穿过生命散发芬芳

ChatGPT

Orika JavaBean映射工具使用

京东科技开发者

JAVA开发 京东云 JavaBean 企业号 3 月 PK 榜

在前端领域摸爬滚打7年,我终于掌握了这些沉淀技巧

小鑫同学

巧用GenericObjectPool创建自定义对象池

京东科技开发者

京东云 API 编排 对象池 京东物流 企业号 3 月 PK 榜

Portraiture2023人像免费磨皮插件

茶色酒

Portraiture2023

浅谈kafka

京东科技开发者

数据库 中间件 京东云 kafka manager 企业号 3 月 PK 榜

架构师日记-软件高可用实践那些事儿

京东科技开发者

高可用 软件架构 京东云 企业号 3 月 PK 榜

从混乱到完备:我的研发流程之路

SkyFire

研发流程

AutoCompleteTextView的基本使用

芯动大师

android 控件 AutoCompleteTextView

28岁小公司程序员,无车无房不敢结婚,要不要转行?

程序员晚枫

程序员 收入

如何有效的进行用例评审

京东科技开发者

用例 京东云 代码评审 企业号 3 月 PK 榜

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