Azure Resource Manager で Azure Stack HCI 上に仮想マシンを作成する
azure azurestack arc
Published: 2021-11-27

Ignite Fall 2021 にて Azure Portal で Azure Stack HCI 上に仮想マシンを作れる機能が招待制プレビューになりました。

VM provisioning through Azure portal on Azure Stack HCI (preview)

本機能を利用すると、Azure Resource Manager を利用して Azure Stack HCI 上に仮想マシンを作成できます。また、Azure Resource Manager を利用して Azure Stack HCI 上の仮想マシンを起動・停止・再起動したり、CPU やメモリ、Disk の構成を変更できます。

本エントリーでは、この機能を試してみた結果をまとめます。

プレビューへの申し込み

2021年11月現在、本機能を利用するためには https://aka.ms/joinEAP にて申し込みを行い、サブスクリプションで本機能を利用できるようにしてもらう必要があります。この手続きが終わっていない場合、サブスクリプションに対して必要なリソースタイプが追加されていないために、作業の途中で次のエラーが出てしまいます。

PS C:\Users\AzureUser>  az arcappliance create hci --config-file $csv_path\workingDir\hci-appliance.yaml --kubeconfig $env:USERPROFILE\.kube\config
Command group 'arcappliance create' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Appliance create command failed with error:  (InvalidResourceType) The resource type could not be found in the namespace 'Microsoft.ResourceConnector' for api version '2020-09-15-privatepreview'.

Azure Arc Resource Bridge のデプロイ

本機能を有効化するためには、対象の Azure Stack HCI 上に Azure Arc Resource Bridge と呼ばれる仮想マシンを導入する必要があります。Azure Resource Manager はこの仮想マシンを通して Azure Stack HCI のリソースを操作します。

Azure Arc Resource Bridge をデプロイするの準備として、Azure Stack HCI のノード上で次のコマンドを実行します。

Install-PackageProvider -Name NuGet -Force 
Install-Module -Name PowershellGet -Force -Confirm:$false -SkipPublisherCheck  
Install-Module -Name Moc -Repository PSGallery -AcceptLicense -Force
Initialize-MocNode
Install-Module -Name ArcHci -RequiredVersion 0.2.6 -Force -Confirm:$false -SkipPublisherCheck -AcceptLicense

$vswitchName="ComputeSwitch"
$controlPlaneIP="192.168.1.100" 
$csv_path="C:\ClusterStorage\Volume2"
$cloudServiceIP="192.168.1.101" 
$vnet=New-MocNetworkSetting -Name hcirb-vnet -vswitchName $vswitchName -vipPoolStart $controlPlaneIP -vipPoolEnd $controlPlaneIP
Set-MocConfig -workingDir $csv_path\workingDir -vnet $vnet -imageDir $csv_path\imageStore -skipHostLimitChecks -cloudConfigLocation $csv_path\cloudStore -catalog arc-appliance-stable-catalogs-ext -ring stable -CloudServiceIP $CloudServiceIP
Install-moc

az extension remove --name arcappliance
az extension remove --name connectedk8s
az extension remove --name k8s-configuration
az extension remove --name k8s-extension
az extension remove --name customlocation
az extension remove --name azurestackhci

az extension add --name arcappliance --version 0.1.42
az extension add --name connectedk8s --version 1.2.0
az extension add --name k8s-configuration --version 1.1.1
az extension add --name k8s-extension --version 0.7.1
az extension add --name customlocation --version 0.1.3
az extension add --name azurestackhci --version 0.2.1

ここまでで重要な設定が $csv_path です。$csv_path で設定したクラスタ共有ボリュームが、本機能でデプロイする仮想マシンの VHD 置き場になります。Azure Stack HCI クラスタ上でたくさんの容量を持ったクラスタ共有ボリュームを指定しましょう。

準備が済んだら、次のコマンドで Resource Bridge をデプロイします。

$resource_group="azshci-eu"
$subscription="<MY SUB ID>"
$Location="eastus"
$customloc_name="nestedHci"

az login  --use-device-code
az account set -s "$subscription"
$resource_name= ((Get-AzureStackHci).AzureResourceName) + "-arcbridge"
mkdir $csv_path\workingDir
New-ArcHciConfigFiles -subscriptionID $subscription -location $location -resourceGroup $resource_group -resourceName $resource_name -workDirectory $csv_path\workingDir
az arcappliance prepare hci --config-file $csv_path\workingDir\hci-appliance.yaml
az arcappliance deploy hci --config-file  $csv_path\workingDir\hci-appliance.yaml --outfile $env:USERPROFILE\.kube\config
az arcappliance create hci --config-file $csv_path\workingDir\hci-appliance.yaml --kubeconfig $env:USERPROFILE\.kube\config --debug

大事な値が $customloc_name です。Azure Portal はここで指定した名前を HCI 上の仮想マシンのリージョンとして表示します。かっこいい名前を付けましょう。

Azure Portal 上での Custom Location の表示

デプロイが完了すると、Azure 上に Resource Bridge と Custom Location が作成されます。

Azure Portal 上に作成された Resource Bridge と Custom Location

HCI クラスタ上には Azure Arc Resource Bridge を担う仮想マシンが起動します。

Resource Bridge 用の仮想マシン

イメージと仮想ネットワークの登録

Azure Resource Manager と Azure Stack HCI を紐づける役割を持つ Azure Arc Resource Bridge がデプロイできたので、仮想スイッチを Azure Resource Manager に登録します。

$vnetName="ComputeSwitch"
az azurestackhci virtualnetwork create --subscription $subscription --resource-group $resource_group --extended-location name="/subscriptions/$subscription/resourceGroups/$resource_group/providers/Microsoft.ExtendedLocation/customLocations/$customloc_name" type="CustomLocation" --location $Location --network-type "Transparent" --virtualnetworks-name $vnetName

$vnetName は HCI クラスタ上に存在する仮想スイッチの名前にする必要があります。登録が完了すると、Azure 上に Microsoft.AzureStackHCI/virtualNetworks というリソースタイプのリソースが作成されます。

Azure 上に作成された仮想スイッチ相当のリソース

同様に、仮想マシンのベースとなる VHD も Azure Resource Manager に登録します。今回の検証では、Azure 上の Windows Server 2019 Server Core を利用しました。

$urns = (az vm image list --all --publisher "microsoftwindowsserver" --offer "WindowsServer" --sku "2019-datacenter-core-smalldisk-g2"| ConvertFrom-Json)
$urn = ($urns | Sort-Object version -Descending)[0].urn
$diskName = "2019-datacenter-core-smalldisk-g2" #Name for new disk to be created
$diskRG = "azshci-eu"
az disk create -g $diskRG -n $diskName --image-reference $urn
$sas = az disk grant-access --duration-in-seconds 36000 --access-level Read --name $diskName --resource-group $diskRG
$diskAccessSAS = ($sas | ConvertFrom-Json)[0].accessSas
# 上記の SAS を利用して、Storage Explorer で VHD をダウンロード
Convert-VHD -Path '\\azshcinode02\c$\ClusterStorage\Volume1\2019-datacenter-core-smalldisk-g2.vhd' -DestinationPath '\\azshcinode02\c$\ClusterStorage\Volume1\2019-datacenter-core-smalldisk-g2.vhdx'

# ダウンロードした VHD を Azure Resource Manager に登録 
$galleryImageName="2019-datacenter-core-smalldisk-g2"
$galleryImageSourcePath="c:\\ClusterStorage\Volume1\2019-datacenter-core-smalldisk-g2.vhdx"
$osType="Windows"
az azurestackhci galleryimage create --subscription $subscription --resource-group $resource_group --extended-location name="/subscriptions/$subscription/resourceGroups/$resource_group/providers/Microsoft.ExtendedLocation/customLocations/$customloc_name" type="CustomLocation" --location $Location --image-path $galleryImageSourcePath --galleryimages-name $galleryImageName --os-type $osType

登録が完了すると、Azure 上に Microsoft.AzureStackHCI/galleryImages というリソースタイプのリソースが作成されます。

Azure 上に作成された ベース用 VHD 相当のリソース

仮想マシンの作成

仮想スイッチと仮想マシンのベースとなる VHD の登録が完了したので、Azure Resource Manager を利用して仮想マシンを作ります。ドキュメントでは Azure Portal から仮想マシンを作れるような記載があるのですが、11月29日現在私の環境では次のエラーが出てしまい先に進めませんでした。

Can’t create a virtual machine on AzSHCI from portal due to no virtual machine kind

Portal がだめなら CLI で作ればいいじゃないということで、Azure CLI と ARM テンプレートを試しました。 Azure CLI の場合は次のような形で仮想マシンを作ります。先ほど登録した仮想スイッチを NIC の接続するサブネットに指定します。また、先ほど登録した VHD ファイルを仮想マシンが参照するイメージに指定します。

# NIC の作成
$customloc_id="/subscriptions/<YOUR SUB ID>/resourceGroups/azshci-eu/providers/Microsoft.ExtendedLocation/customLocations/nestedHci"
az azurestackhci networkinterface create --resource-group  $resource_group --extended-location name=$customloc_id type="CustomLocation" --location $Location --ip-configurations '[{\"name\":\"ipconfig\",\"properties\":{\"subnet\":{\"id\":\"ComputeSwitch\"}}}]' --networkinterfaces-name "vmfromazclinic20" --debug

# VM の作成
az azurestackhci virtualmachine create --resource-group  $resource_group --extended-location name=$customloc_id type="CustomLocation" --location $Location --hardware-profile vm-size="Standard_A2_v2" --nic-id "/subscriptions/9c171efd-eab4-4f0b-91d7-c5bd3103e127/resourceGroups/azshci-eu/providers/Microsoft.AzureStackHCI/networkinterfaces/vmfromazcli20" --os-profile '{\"adminPassword\":\"<YOUR PASSWORD>\",\"adminUsername\":\"aimless\",\"computerName\":\"vmfromazcli\"}' --image-reference "2019-datacenter-core-smalldisk-g2" --virtualmachines-name "vmfromazcli20"

ARM テンプレートも基本的な考え方は同じです。仮想マシンがデプロイできた ARM テンプレートは次の通りです。

https://gist.github.com/kongou-ae/8ec9aaf7596b97d83b173c3c5e267080

なお、私の環境では仮想マシン作成の処理がたまにタイムアウトしてしまいました。ただし、HCI クラスタへの VM 作成指示は出せたのか、タイムアウト後にしばし待ったら HCI クラスタ上に仮想マシンが作成されました。他にも次のような怪しい挙動に遭遇しましたが、プレビューなので仕方ない

  • CLI やテンプレートで VM のサイズを Azure の SKU で指定しても、4コア4Gメモリの仮想マシンができてしまう
  • CLI やテンプレートで NIC の IP アドレスを静的に指定しようとすると、処理がエラーになる

仮想マシンの確認

作成した仮想マシンは Azure Portal に Azure Stack HCI virtual machine として表示されます。リソースタイプは microsoft.azurestackhci/virtualmachines です。通常の仮想マシンと比べるとメニューが少ないです。

Azure Stack HCI virtual machine の画面

Azure Portal 上で起動や停止・再起動を選択すると、HCI クラスタ上で動作する仮想マシンも起動・停止・再起動します。コアとメモリを変更できますし、ディスクを足すこともできます。

Azure Stack HCI virtual machine のサイズ変更画面

Azure Stack HCI virtual machine のディスク追加画面

Azure Arc-enabled servers に登録すると?

作成した仮想マシンには Azure Arc-enabled server に存在する拡張機能や Azure Policy、Update Management、Insight などの運用関連のメニューが存在しません。同じ Azure Arc であっても microsoft.azurestackhci/virtualmachines と Microsoft.HybridCompute/machines は別物ということでしょう。

試しに Azure Resource Manager で作った仮想マシンを Azure Arc-enabled servers に登録してみたところ、作成済みの microsoft.azurestackhci/virtualmachines に機能が追加されることはなく Microsoft.HybridCompute/machines が新たに出来上がってしまいました。ちょっと残念です。1つの仮想マシンが2つの Azure Arc リソースとして Azure に登録されるのは無駄なので、microsoft.azurestackhci/virtualmachines でも Microsoft.HybridCompute/machines と同じことができるようになってほしい。

2つの Azure Arc リソース

終わりに

本エントリでは、Azure Resource Manager を利用して Azure Stack HCI 上に仮想マシンを作る機能を評価した結果をまとめました。Azure Resource Manager と HCI クラスタを接続する Resource Bridge によって、HCI クラスタ上のリソースを Azure Resource Manager 配下のリソースのように見せる点がポイントです。プレビューということもありまだまだ粗削りな印象を受けますが、今後の機能追加に期待です。