基本的には AVD for Azure と同じなのですが、セッションホストのマスターイメージを作成する際に参考する情報をまとめておきたいと思います。(ブラウザで開いたままのタブを整理したかったということもあります)
Archive for the ‘Azure Stack HCI’ tag
Azure Stack HCI 上で Marketplace の Windows Client OS を展開した際のライセンス認証について
プレビュー機能となりますが、Azure Stack HCI では次の 2 つの機能を使用して、Azure Marketplace で提供されている Windows Client OS のイメージ (Multi Session 対応の Windows 10 / 11) を展開することが可能です。
- VM イメージを使用して Azure Stack HCI 上に Arc 仮想マシンを作成する (プレビュー)
- Azure Stack HCI 用 Azure Virtual Desktop の概要 (プレビュー)
Windows Client OS のイメージを実際に展開すると、環境がわかるのですが、Marketplace で提供されているこれらの OS イメージでは [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform] を確認しても KMS の設定はされておらず、それ以外の方法を使用して認証が行われています。
本投稿では Azure Stack HCI 上に展開した Marketplace の Windows Client OS のライセンス認証について情報をまとめておきたいと思います。
基本的な考え方としては Windows OS のアクティブ化 の次の記載が該当します。
Windows VM は、Azure Stack HCI で使用する前にライセンス認証を行い、アクティブ化する必要があります。
マルチセッション OS VM (Windows 10、Windows 11、またはそれ以降) をアクティブ化するには、VM の作成後に VM で Azure 特典を有効にします。 ホスト コンピューターでも Azure 特典が有効になっていることを確認します。 詳細については、「Azure Stack HCI での Azure 特典」を参照してください。
注意
Azure 特典が必要な VM ごとにアクセスを手動で有効にする必要があります。
他のすべての OS イメージ (Windows Server やシングル セッション OS など) については、Azure 特典は必要ありません。 既存のアクティブ化方法を引き続き使用してください。 詳細については、Azure Stack HCI での Windows Server VM のアクティブ化に関するページを参照してください。
Azure Stack HCI で評価版の Windows Server をベースにしてサブスクリプションで Windows Server を利用する
Azure Stack HCI 上で Windows Server を実行する場合、Windows Server サブスクリプション という利用形態で Windows Server OS を実行することができ、詳細については次のドキュメントで解説が行われています。
価格については Azure Stack HCI の価格 に記載されており、Azure Stack HCI のホスト OS の物理コアによる月額コストとなり、サブスクリプションモデルで、Windows Server OS の仮想マシンを実行する場合は、実行している仮想マシン単位のコストを考慮しなくてもよくなります。
ライセンス オプションの比較 に、次のように記載されていますが、CAL についても不要となり、シンプルな考え方で Windows Server を使用することができるようになります。
Windows Server サブスクリプションについても Azure Stack HCI の 60 日間の評価内容に含まれており、評価期間内であれば、コストを発生させることなく検証をすることができます。
Azure Virtual Desktop for Azure Stack HCI の物理検証環境を構築してみる
Azure Virtual Desktop (AVD) for Azure Stack HCI の検証環境については、Announcing Jumpstart HCIBox でアナウンスされた、Nested Hyper-V の環境を使用して構築することができます。
Azure Arc や Azure Stack HCI の評価環境ですが、Nested 環境として作るのもよいのですが、物理環境で構築したほうが、より実運用に近くなるのではないでしょうか。
ということで、自宅で AVD for Azure Stack HCI の検証環境を、物理環境で作った際のメモを。
Azure Stack HCI 上で SQL Server 2012 を稼働させた場合の ESU の登録方法
SQL Server 2012 は、2022/7/12 にサポートが終了し、現在は、拡張セキュリティ更新プログラム (ESU) でのみ Microsoft からサポートされるソフトウェアとなりました。
SQL Server の ESU については SQL Server 用の延長セキュリティ更新プログラムとは で情報がまとめられており、Azure Stack HCI 上で動作させた場合の特典についても本情報で次のように記載されています。(拡張セキュリティ更新プログラム (ESU) について でも情報がまとめられています)
Azure サービス。 オンプレミス サーバーを次のいずれかの Azure サービスに移行する場合は無料であり、既定で有効になります。
Azure Stack HCI で Azure 特典 を使用している場合、Azure サービスでの動作となり、ESU を特典として利用することができるため、Windows Server / SQL Server の ESU 提供を無償で受けることが可能となります。
当ブログでも、Windows Server 向けの ESU については、次の投稿で検証を実施していました。
- Azure Stack HCI 単一ノードクラスターの評価環境を作成して ESU の検証環境を作成する
- Windows Server 2008 R2 SP1 に最新の Windows Update を適用する
SQL Server 向けについては SQL Server 2012 対応した内容の検証ができていなかったのですが、SR で問い合わせをさせていただきながら情報を把握することができたので、本投稿でまとめておきたいと思います。
ESU では、次の二つの内容が提供されています。
- セキュリティ更新プログラムの提供
- 適切な Microsoft のサポートプランを介した SQL Server 2012 のテクニカルサポートの提供
現状セキュリティ更新プログラムは提供されていないため、本投稿で確認している内容については、セキュリティ更新プログラムの提供を受けるための事前準備までとなります。
Azure Stack HCI 単一ノードクラスターの評価環境を作成して ESU の検証環境を作成する
ライフサイクルサポートが終了した、Windows Server / SQL Server については、2008 以降は ESU (拡張セキュリティ更新プログラム) が提供されます。
ESU は有償のプログラムですが、Windows Server 2012、2012 R2、および SQL Server 2012 のサポート終了に備える で次のように記載されている通り、Azure のサービスと組み合わせることで無償で提供を受けることができます。
無料の拡張セキュリティ更新プログラムは、Azure Virtual Machines、Azure 専用ホスト、Azure VMWare Solution、Azure Nutanix Solution、Azure Stack Hub/Edge/HCI などの Azure のお客様が利用できます。
今回、検証で使用する Azure Stack HCI も対象となっており、Azure Stack HCI 上で動作している仮想マシンについても無償で ESU を受けることができる環境となります。
Build 2022 で Azure Stack HCI 単一ノードクラスターの一般提供 (GA) がアナウンスされました。
以前、別の評価に使用していた NUC8v7PNH が 1 台空いたので、この Azure Stack HCI 単一ノードの評価用としてセットアップして、ESU の適用を行うことろまで確認できましたので、情報をまとめておきたいと思います。
ESU については、次のドキュメントを参考にするとよいかと思います。
CPU 要件を満たしていているが Nested Hyper-V (入れ子になった仮想化) が有効化できない場合の対応
検証用で使用している Intel NUC Gen11 (NUC11TNHv70L) の CPU は、Core i7-1185G7 が搭載されており、VT-x が使用できますので、Nested Hyper-V (入れ子になった仮想化) を使用することができる CPU となっています。
Nested Hyper-V の有効化については、入れ子になった仮想化による仮想マシンでの Hyper-V の実行 で公開されており、今回使用している NUC のような物理ハードウェア上にインストールした仮想マシンで実行するのであれば、
- Nested Hyper-V を有効にしたい仮想マシンが停止した状態で、Nested Hyper-V を有効化
- Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
- Nested Hyper-V を有効にしたい仮想マシンで MAC アドレスのスプーフィングを有効化する
- Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On
ことで、Nested Hyper-V を使用することができます。
しかし、今回使用している Gen 11 の NUC では、上記の対応を行っても Nested Hyper-V を有効化することができませんでした。
Twitter でつぶやいたところ次のようなアドバイスをいただき、教えていただいた方法を使用することで Nested Hyper-V を有効化することができました。
こちらのコマンドではどうでしょうか?
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V,RSAT-Hyper-V-Tools-Feature,Microsoft-Hyper-V-Management-PowerShell
— いまにゅー (@imanyu) December 17, 2021
今後も何回か同じ事象でハマりそうなので、対応方法を残しておきたいと思います。
AKS on Azure Stack HCI の v1.21.2 の k8s でコントロールプレーンノードの再起動後に k8s が起動しない
タイトルの通りですが、AKS on Azure Stack HCI の k8s を v1.21.2 で展開した後に、コントロールプレーンノードを再起動した後に k8s が起動しないという事象が発生しました。
「systemctl status kubelet」で状態を確認してみると、次のようなエラーが発生し、kubelet が起動していませんでした。
Nov 30 11:35:13 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:13.936688 741 kuberuntime_sandbox.go:68] "Failed to create sandbox for pod" err="rpc error: code = Unknown desc = failed to get sandbox image \"ecpacr.azurecr.io/pause:3.2\": failed to pull image \"ec pacr.azurecr.io/pause:3.2\": failed to pull and unpack image \"ecpacr.azurecr.io/pause:3.2\": failed to resolve reference \"ecpacr.azurecr.io/pause:3.2\": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized" pod="kube-system /etcd-moc-lrr9qh1ew26" Nov 30 11:35:13 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:13.936713 741 kuberuntime_manager.go:790] "CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to get sandbox image \"ecpacr.azurecr.io/pause:3.2\": failed to pull image \"ec pacr.azurecr.io/pause:3.2\": failed to pull and unpack image \"ecpacr.azurecr.io/pause:3.2\": failed to resolve reference \"ecpacr.azurecr.io/pause:3.2\": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized" pod="kube-system /etcd-moc-lrr9qh1ew26" Nov 30 11:35:13 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:13.936764 741 pod_workers.go:190] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"etcd-moc-lrr9qh1ew26_kube-system(8e85a0583a698c64f4daca0d375decfa)\" with CreatePodSandboxErro r: \"Failed to create sandbox for pod \\\"etcd-moc-lrr9qh1ew26_kube-system(8e85a0583a698c64f4daca0d375decfa)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"ecpacr.azurecr.io/pause:3.2\\\": failed to pull image \\\"ecpacr.azurecr.io/pause:3 .2\\\": failed to pull and unpack image \\\"ecpacr.azurecr.io/pause:3.2\\\": failed to resolve reference \\\"ecpacr.azurecr.io/pause:3.2\\\": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized\"" pod="kube-system/etcd-moc-l rr9qh1ew26" podUID=8e85a0583a698c64f4daca0d375decfa Nov 30 11:35:13 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:13.981869 741 kubelet.go:2291] "Error getting node" err="node \"moc-lrr9qh1ew26\" not found" Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:14.035070 741 event.go:273] Unable to write event: '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"moc-lrr9qh1ew26.16bc4fcc087e2ba6", GenerateName:"", Namespace :"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Node", Namespace:"", Name:"moc-lrr9qh1ew26", UID:"moc-lrr 9qh1ew26", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"Starting", Message:"Starting kubelet.", Source:v1.EventSource{Component:"kubelet", Host:"moc-lrr9qh1ew26"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc061a0f98b59afa6, ext:11623948584, loc:( *time.Location)(0x74be600)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc061a0f98b59afa6, ext:11623948584, loc:(*time.Location)(0x74be600)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v 1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'Post "https://10.5.0.2:6443/api/v1/namespaces/default/events": EOF'(may retry after sleeping) Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:14.082278 741 kubelet.go:2291] "Error getting node" err="node \"moc-lrr9qh1ew26\" not found" Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: I1130 11:35:14.104104 741 trace.go:205] Trace[2056973426]: "Reflector ListAndWatch" name:k8s.io/client-go/informers/factory.go:134 (30-Nov-2021 11:35:02.280) (total time: 11824ms): Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: Trace[2056973426]: [11.824032031s] [11.824032031s] END Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:14.104137 741 reflector.go:138] k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.RuntimeClass: failed to list *v1.RuntimeClass: an error on the server ("") has prevented the request from succeeding (get runtimeclasses.node.k8s.io) Nov 30 11:35:14 moc-lrr9qh1ew26 kubelet[741]: E1130 11:35:14.182788 741 kubelet.go:2291] "Error getting node" err="node \"moc-lrr9qh1ew26\" not found"
kubelet の起動のパラメーターを見ると、「–pod-infra-container-image=ecpacr.azurecr.io/pause:3.2」が指定されており、上記のメッセージでも pause コンテナーのイメージのアクセスでエラーが発生しているようでした。
ACR と Helm と SQL Server のメモ
ACR に格納した Helm のチャートで SQL Server の展開を行おうとした場合のメモ。
AKS on HCI でも一部の展開には Helm が使用されているので、概要はつかんでおかないとと思った次第です。
この辺の情報を取り掛かりにすれば、手を動かすことはできそうです。
AKS on Azure Stack HCI (Windows Server 2019) に対して Azure DevOps でパイプラインを実行するためのメモ
AKS on Azure Stack HCI (OS は HCI OS ではなく、Windows Server 2019) に対して、Azure DevOps パイプラインを実行しようと思った際の作業した内容のメモを。
最終的には Azure Arc Enabled Kubernetes の GitOps を使用することになるのかなとは思うのですが、今回はそこまでは試せていません。