1. 程式人生 > >Azure Stack技術深入淺出系列4: Azure Stack自定義虛擬機鏡像和Gallery Item

Azure Stack技術深入淺出系列4: Azure Stack自定義虛擬機鏡像和Gallery Item

azurestack 雲計算 微軟 混合雲

Azure Stack環境中服務的提供者或運營者從微軟變成了Azure Stack集成環境的運營者,通過Azure Stack的MarketPlace,我們可以根據用戶的特定需求,提供一些定制化的應用,獲得與公有雲不一樣的用戶體驗。本文將主要介紹如何在Azure Stack的MarketPlace中如何添加一個自定義的虛擬機進行並定制滿足需求的Gallery Item,同時通過自服務的模式提供給業務的消費者。


這一篇,我們將探討以下幾個問題:

  • 如何制作自定義鏡像

  • 從自定義鏡像創建虛擬機的幾種方式

  • 如何創建自定義的Gallery Item

1、制作自定義鏡像

Azure Stack的鏡像分為 generalized

specialized兩種不同的形式。

Generalized鏡像中已經刪除了所有個人賬戶信息及一些其它數據,可以作為模板來創建一個或者多個虛擬機。微軟對Windows和Linux鏡像都提供了相應的工具,Windows下可以采用Sysgrep,Linux下可以安裝Azure Linux Agent,執行sudo waagent –deprovision來實現。

Specialized鏡像中保留了原始虛擬機中的用戶賬戶、應用程序和其它狀態數據,可以作為模板創建一臺虛擬機。Specialized鏡像可以看作是原始虛擬機在某個時間的snapshot。

鏡像既可以從Azure Stack或者Azure上運行的虛擬機來制作,比如捕獲或者克隆虛擬機,也可以將在本地基於Hyper-V Manager啟動的虛擬機導出作為鏡像。幾種不同的自定義鏡像的詳細制作過程請參考下面鏈接:

  • 捕獲Azure Stack上運行的虛擬機

  • 創建在Azure Stack或者Azure上運行的虛擬機的副本

  • 從本地VM創建虛擬機鏡像

2、從自定義鏡像創建虛擬機

在獲得虛擬機鏡像之後,如何在Azure Stack中根據鏡像創建虛擬機?

這部分介紹如何將本地VHD鏡像上傳到Azure Stack中,並且創建虛擬機。Azure Stack中需要通過Portal、PowerShell,ARM Template等方式來進行相應的操作,這些操作包括2步:

  • 第一步:上傳本地VHD鏡像到Azure Stack上(見 2.1)

  • 第二步:創建虛擬機(見 2.2)

2.1通過Portal新建存儲賬戶並上傳本地鏡像

  • 登陸Azure Stack

    技術分享

  • 新建存儲賬戶

    技術分享

  • 新建Blob Container,名字為vhds

    技術分享

  • 將本地VHD文件以PageBlob的類型上傳到新建的Container中

    技術分享

2.2通過ARM Template從鏡像創建新的虛擬機

鏡像上傳後,就可以開始創建虛擬機了。從VHD創建虛擬機有兩種模式:AttachFrom-Image

Attach模式下,VHD文件是直接附加到新建的虛擬機上。因此采用Attach模式,一個VHD文件只能創建一臺虛擬機。而From-Image模式,首先會將VHD文件復制一份到指定的Blob Container中,然後將VHD的副本附加到虛擬機上,因此可以從一個generalized VHD創建多臺虛擬機

采用ARM Template來創建虛擬機, ARM Template的使用方式及創建虛擬機的完整Template可以在AzureStack-QuickStart-Templates上獲得,這裏僅提供兩種模式下差異部分來進行對比分析:

-> Attach模式

"storageProfile": {        "osDisk": {          "name": "[concat(parameters(‘vmName‘))]",          "osType": "[parameters(‘osType‘)]",          "caching": "ReadWrite",          "vhd": {            "uri": "[parameters(‘osDiskVhdUri‘)]"
          },          "createOption": "Attach"
        }
      },

Attach 模式下只需要提供VHD的URI,createOption采用“Attach”
這裏parameters(‘osDiskVhdUri‘)為前面通過Portal上傳的VHD文件的URL:

https://liugestore.blob.local.azurestack.external/vhds/CentOS7-AzureStack-WithAgent.vhd

下圖為Attach模式流程:

技術分享

-> From-Image模式

        "storageProfile": {          "osDisk": {            "name": "[concat(variables(‘vmName‘),‘-osDisk‘)]",            "osType": "[parameters(‘osType‘)]",            "caching": "ReadWrite",            "image":{              "uri": "[variables(‘userImageUri‘)]"
            },            "vhd": {              "uri": "[variables(‘osDiskVhdUri‘)]"
            },            "createOption": "FromImage"

          }
        },

From-Image模式下需要提供Image的URI和VHD的URI, createOption采用 FromImage
variables(‘userImageUri‘)為前面用Portal上傳的VHD文件的URL

https://liugestore.blob.local.azurestack.external/vhds/CentOS7-AzureStack-WithAgent.vhd

variables(‘osDiskVhdUri‘)

https://liugestore.blob.local.azurestack.external/vhds/testVM.vhd

是用戶指定的新的虛擬機綁定的VHD文件,實際上是CentOS7-AzureStack-WithAgent.vhd的副本。

註:這裏為了方便,將 CentOS7-AzureStack-WithAgent.vhd和 testVM.vhd放在了同一個Blob Container中。實際上,副本VHD可以放在其他的存儲賬戶中,並且名字也可以根據需要在設置。

From-Image模式流程:

技術分享

3、Azure Stack 鏡像庫

上一節中介紹了如何上傳鏡像及通過ARM Template從鏡像創建虛擬機。VHD鏡像上傳到我們自己新建的存儲賬號中。創建虛擬機的時候直接通過Blob的URL來定位鏡像文件。

那麽除了用戶自己維護鏡像的存儲,Azure Stack有沒有提供一個統一的鏡像庫來方便的存儲鏡像呢?除了用URL來標識和定位鏡像,有沒有其它方式來唯一指定鏡像呢?

答案是有。本節討論Azure Stack的鏡像庫,主要介紹下面幾個問題:

  • 自定義鏡像上傳到鏡像庫(見 3.1)

  • 鏡像庫中鏡像的標識(見 3.2)

  • 從鏡像庫中的鏡像創建虛擬機(見 3.3)

3.1 通過Admin Portal上傳自定義鏡像到鏡像庫

Azure Stack的鏡像庫在Resource Provider的Compute當中,需要admin權限才能進行操作。

  • 從admin portal用admin賬號登陸Azure Stack
    技術分享

admin portal地址:

https://adminportal.local.azurestack.external/
  • 點擊Resource Providers–點擊Compute–VM images
    技術分享

可以看到目前已經上傳到鏡像庫中的所有鏡像。

  • 點擊Add,填寫鏡像的相應標識信息,然後點擊Create
    技術分享

其中OS Disk Blob URI:就是我們上一小節中上傳的VHD鏡像的Blob URL,也即:

https://liugestore.blob.local.azurestack.external/vhds/CentOS7-AzureStack-WithAgent.vhd
  • 成功後,即將鏡像上傳到了鏡像庫中
    技術分享

3.2 鏡像庫中鏡像的標識

在上傳鏡像的過程中,我們需要填寫一些相關信息,如PUBLISHER, OFFER, SKU, VERSION, OSTYPE, OS DISK BLOB URI,那麽這些信息到底有什麽用呢?在點擊了Create後,發生了什麽過程呢?

實際上主要發生了兩步:

第一步- 將OS DISK BLOB URI指定的vhd文件復制到VM Images庫中

技術分享

在我們的POC測試環境中,鏡像庫位於
C:\ClusterStorage\Volume1\Shares\SU1_Infrastructure_1\CRP\PlatformImages中,可以看到有兩個文件夾,對應著我們在鏡像庫中的兩個鏡像。
技術分享

第二步- 生成該鏡像的對應的Manifest文件,用來標識該鏡像。

技術分享
進入剛剛上傳的鏡像對應的文件夾中可以看到,除了存在著一個復制過來的VHD文件外還有一個Manifest文件。

Manifest文件的內容如下:

{"Offer":"CentOS","Sku":"7.0-withagent","Version":"1.0.0","PlatformImage":
  {    "Publisher":"Inesa",    "Offer":"CentOS",    "Sku":"7.0-withagent",    "Version":"1.0.0",    "OsDisk":{       "OsType":"Linux",       "Filename":"CentOS7-AzureStack-WithAgent.vhd",       "FullPath":"\\\\SU1FileServer\\SU1_Infrastructure_1\\CRP\\PlatformImages\\3ee92630-cf36-454a-8a4f-123a7ad7b9a5",       "Uri":"https://liugestore.blob.local.azurestack.external/temp/CentOS7-AzureStack-WithAgent.vhd"
    }

  },"Publisher":"Inesa"}

Manifest文件中包含了前面填寫的PUBLISHER, OFFER, SKU, VERSION, OSTYPE信息,也包含了鏡像文件在鏡像庫中的存儲位置以及鏡像是從哪裏復制過來的。其中PUBLISHER, OFFER, SKU, VERSION, OSTYPE 唯一標識了當前的鏡像。通過這些標識信息,就可以指定用改鏡像創建虛擬機

3.3 從鏡像庫中的鏡像創建虛擬機

有了鏡像的唯一標識信息,就可以創建虛擬機,前面小節介紹了如何通過ARM Template來創建虛擬機,這裏則通過PowerShell來創建。

# Define a credential object$cred = Get-Credential# Create a virtual machine configuration$vmConfig = New-AzureRmVMConfig -VMName myVM -VMSize Standard_DS2 | `
    Set-AzureRmVMOperatingSystem -Linux -ComputerName myVM -Credential $cred | `
    Set-AzureRmVMSourceImage -PublisherName Inesa -Offer CentOS `
    -Skus 7.0-withagent -Version latest | Add-AzureRmVMNetworkInterface -Id $nic.Id# create new vm    New-AzureRmVM -ResourceGroupName liuge -Location local -VM $vmConfig

在vmConfig中通過標識信息來指定用我們剛剛上傳的鏡像來創建新的虛擬機。

4、自定義Gallery Item

前面的幾個小節介紹了從自定義鏡像創建虛擬機的幾個方式,無論是采用PowerShell還是ARM Template,都需要一定的編程基礎,那麽有沒有一種方式,可以在Portal上通過點擊操作來創建自定義的虛擬機呢?本節就介紹如何為自定義鏡像在Portal上創建圖標,也就是Gallery Item。

4.1 什麽是Gallery Item

簡單的理解:

在Azure中我們可以通過如下方式創建虛擬機:

技術分享

如圖點擊對應的圖標,就可以彈出創建虛擬機的界面:
技術分享

不需要配置任何的開發環境,不需要一定的編程基礎,只要點擊,填寫相關項,就可以快速的創建一臺虛擬機。

在Azure Stack中同樣可以實現!

4.2 利用Azure Stack Tools 創建Gallery Item

在Azure Stack深入淺出系列的上一篇中介紹了Azure Stack運維工具Azure Stack Tools的使用,Azure Stack Tools提供了Add-AzsVMImage方法來實現:

$ImagePath = "<Path to VHD>"Add-AzsVMImage -publisher "Inesa" -offer "CentOS" -sku "7.0-withagent" -version "1.0.0" -osType Linux`  
-osDiskLocalPath $ImagePath -tenantID $TenantId -EnvironmentName "AzureStackAdmin"

執行上面的指令後就可以實現與Azure 類似的通過Portal來創建虛擬機

技術分享

更多Azure Stack Tools的內容請參考:Azure Stack Tools

4.3 深入理解自定義Gallery Item的流程

利用Azure Stack Tools 的Add-AzsVMImage可快速的實現自定義Gallery Item。那麽Add-AzsVMImage到底封裝了什麽操作?自定義Gallery Item需要經過哪些過程呢?
Add-AzsVMImage主要做了2個工作:

  • 將本地VHD文件上傳到Azure Stack的鏡像庫(見 4.31)

  • 為鏡像庫中的鏡像創建Gallery Item(見 4.32)

4.31 將本地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文件

4.32 為鏡像庫中的鏡像創建Gallery Item

為了解自定義Gallery Item的流程,這部分將介紹如何自己通過PowerShell的指令來實現。主要分為以下幾步:

  • 填寫相應的Json描述文件

  • 生成azkpg包

  • 生成Gallery Item

Step 1.首先創建下面的目錄結構及文件:

技術分享

其中DeploymentTmeplates、Icons、strings為文件夾的名字。Icons下面存放的是圖標文件,可以選擇自己需要的png文件進行替換。

Step 2.編輯Manifest文件:

技術分享

Manifest文件包含了一些對圖標的描述,包括名字,發布者,版本,圖標樣式等信息。也就是對下圖中CentOS 7.2的一些描述.

技術分享

Step 3.編輯UIDefinition.json

技術分享

UIDefinition定義了在創建新的虛機時UI顯示的步驟和內容,有兩種類型:

  • 一種是Azure的默認類型CreateVMWizardBlade,如下圖共 四步,一般都采用這種類型。

技術分享

  • 另一種是 DeployFromTemplateBlade 類型,這種需要在 DeploymentTemplates文件夾下,填寫需要顯示的內容,感興趣的讀者可以深入研究一下。

Step 4.編輯DeplymentTemplates\CreateUIDefinition.json

技術分享

ImageReference中可以設置下面的屬性來表示采用的鏡像:

技術分享

Step 5.編輯Strings\resources.resjon

裏面主要是Manifest.json中用到的幾個變量的詳細信息

{  "summary": "Create a CentOS 7.2 VM",  "longSummary": "Create a CentOS 7.2 VM. Publisher: Inesa, Offer: CentosServer, Sku:7.0-WithAgent, Version:1.0.0",  "description": "Create a CentOS 7.2 VM. Publisher: Inesa, Offer: CentosServer, Sku:7.0-WithAgent 
}

Step 6.生成azkpg包
->使用工具AzureGalleryPackager,下載地址:http://www.aka.ms/azurestackmarketplaceitem
->解壓,進入目錄
->執行powershell指令:

.\AzureGalleryPackageGenerator\AzureGalleryPackager.exe -m C: \CentOS.72\Manifest.json -o C:\InesaMarketPlaceItems

->執行成功後會在InesaMarketPlaceItems文件夾下生成相應的azkpg文件Inesa.CentOS72.2.0.0.azpkg 。

Step 7.上傳azkpg文件到Blob中
技術分享

Step 8.根據azkpg文件生成Gallery Item

$subscriptionid = (Get-AzureRmSubscription -SubscriptionName ‘Default Provider Subscription‘).SubscriptionId

Add-AzureRMGalleryItem -SubscriptionId $subscriptionId -GalleryItemUri "https://liugestore.blob.local.azurestack.external/templates/Inesa.CentOS72.1.0.0.azpkg" -ApiVersion "2015-04-01"

其中https://liugestore.blob.local.azurestack.external/templates/Inesa.CentOS72.1.0.0.azpkg 是上傳的文件的URI

經過上面的8步,已經可以實現創建Gallery Item的功能,實際上,Add-AzsVMImage中也是根據這個過程來實現的。

4.4 利用Publishing Tool來添加 Gallery Item

在前面小節中,需要執行PowerShell指令來添加Gallery Item。隨著Azure Stack GA,微軟提供了一個Publishing Tool來實現可視化的添加Gallery Item。界面如下圖:

技術分享

Publishing Tool的詳細使用教程:

  • Add marketplace items using publishing tool

5、總結

通過本文,我們了解了如何創建自定義的虛擬機鏡像,並且通過自定義鏡像來創建虛擬機,為自定義鏡像創建Gallery Item等。從較簡單的例子入手,逐步深入,來介紹Azure Stack Tools中 Add-AzsVMImage所做的工作,希望能夠對讀者有一定的啟發。

作者:劉建誌



如果對文章內容感興趣請聯系:
儀電(集團)有限公司Azure Stack技術支持團隊( [email protected] / [email protected])
轉載請註明:轉載自Azure Stack Notes博客(http://a-stack.com)



Azure Stack技術深入淺出系列4: Azure Stack自定義虛擬機鏡像和Gallery Item