Azure Local离线模式VM 管理(系列篇十二)

Azure Local离线模式VM 管理(系列篇十二) Azure Local VM 管理离线 / Disconnected 模式文档体例说明本节采用三栏组织——✅官方要求Official Requirement—— 微软 Learn 原文支撑的事实技术分析Technical Analysis—— 官方没明说但可从架构/脚本推断的原理企业最佳实践Best Practice—— 工程建议、风险提示、扩展性考量关键架构分层贯穿全文Azure Local HCI Hyper-V SDN 底座Arc Resource Provider Azure 控制面扩展stack-hci-vmCLI extension 管理 API 客户端不是runtime因此Azure Local VM严格说应是Azure Local Arc-enabled VM通过stack-hci-vmCLI / Arc API 调用。0. 三层架构理解整篇文档的入口关键边界CLI 不等于 runtime——stack-hci-vmextension 只是 API 客户端VM 不等于 Azure IaaS VM——HA/resize/migration 模型都是 Hyper-V 层语义Portal 不等于 control plane——Portal 是 ARM façade1. Guest OS 支持矩阵✅ 官方要求Azure Local VM 在 disconnected / Arc-enabled 场景下支持以下 Guest OSWindows Server 2019 / 2022 / 2025Windows 10 / Windows 11 Enterprise部分场景Ubuntu 20.04 / 22.04 / 24.04 LTS取决于版本 技术分析Azure Local VM 基于Hyper-V Arc VM 管理平面。Guest OS 支持取决于Hyper-V Integration Services集成服务Arc VM Agent 兼容性矩阵Linux 并不被禁止而是无 Azure 官方 image pipeline需用户自建 VHDXGen2 hv drivers关于 RHEL / SLES技术上可运行但不在官方验证矩阵Arc guest management 支持可能受限 企业最佳实践优先选择Windows Server 2022 / 2025Ubuntu LTS22.04 / 24.04RHEL / SLES仅建议用于自建镜像自主补丁体系非强依赖 Arc guest management 的场景2. VM 功能与限制清单2.1 VM 镜像管理✅ 官方要求VM 镜像必须来源Cluster Shared VolumeCSV本地路径导入 VHD/VHDX❌不支持Azure MarketplaceAzure Storage 直接挂载远程 image streaming 技术分析Azure Local VM没有 ARM image pull capability所有 image 必须本地 block storage 可访问Hyper-V compatible VHD/VHDX 企业最佳实践建立内部 golden image library标准化 VHDX pipelineCI/CD2.2 网络与 NIC✅ 官方要求NIC通过 CLI 创建依赖logical networklnetIP必须来自预定义 IP pool 技术分析Arc VM networking 依赖Azure Local SDN abstraction layerPortal 支持有限可查看不适合复杂配置static IP / custom logical network 基本仍依赖 CLI 企业最佳实践网络全部 CLI IaC 化Bicep / PowerShell / TerraformPortal 仅用于观测2.3 Trusted Launch安全启动✅ 官方要求支持 Trusted Launch视版本而定Preview / GA depending version包括Secure Boot稳定支持vTPM支持 技术分析重要约束Trusted Launch 在 Azure Local✔ Secure Boot稳定支持✔ vTPM支持⚠Measured Boot不等价Azure public VM⚠Defender for Cloud attestation通常不可用disconnected Azure 端 attestation 链路不完整关键约束Trusted Launch 在 Azure Local 上主要用于本地 Hyper-V security enforcement不等同 Azure IaaS VM 的完整 attestation pipeline。也就是说——开了 Secure Boot vTPM 不等于你获得了 Azure public cloud 那套 attestation / compliance report 能力。 企业最佳实践生产环境开启 Secure Boot vTPM安全审计仍需结合外部 SIEMDefender for EndpointGuest OS 内不依赖Defender for Cloud attestation不可用2.4 Proxy 行为✅ 官方要求VM 自身不提供Azure 管理的 outbound proxy 功能Azure Local本地控制面Appliance / Arc Resource Bridge支持且通常必须配置 Outbound Proxy通过FullEnvironment.json或本地网络环境注入 技术分析关键区分层级是否提供 proxy说明Azure 公有云控制面❌ 不提供VM 跟公有云之间的 proxy 不归 Azure 管Azure Local 本地控制面Appliance / ARB✔支持通过FullEnvironment.json或环境变量注入仅在断网模式下关闭外发链路——组件本身具备代理感知能力Guest OS 网络✔支持OS-level / transparent / NAT 随意重要澄清之前表述 ❌ Azure 控制面不提供 proxy →不准确准确版本Azure 公有云控制面VM ↔ ARM不提供 proxyAzure Local 本地控制面Appliance ↔ Outbound支持 proxy仅在完全断网True Disconnected时才关闭外发链路 企业最佳实践VM ↔ Guest 外网用OS-level proxyEnterprise transparent proxyFirewall NATAppliance ↔ Outbound配置在FullEnvironment.json提前声明否则部署期会失败或反复重试2.5 Portal 与 CLI 支持✅ 官方要求VM lifecycle 管理以 CLI / Arc API 为主Portal 支持有限 技术分析Portal ARM façade门户只是 UI 外壳实际控制面 Azure Arc resource providerVM 创建入口通过Azure Arc enabled VM resource provider不是传统 Azure VM portal 企业最佳实践CLI GitOps强烈推荐Portal仅用于观测3. VM 创建流程CLI 流水3.1 前置准备# 1. 安装支持的 CLI 扩展 # ⚠️ extension 名随版本变化 # - stack-hci-vm旧 # - azurestackhci / az stack-hci新版组合 # ⚠️ 版本号必须对齐 Azure Local release train不是 Azure CLI 本身的版本 az extension add -n stack-hci-vm # 2. 登录disconnected 模式已切到 local cloud az login 技术分析extension 用于Azure Local VM resource provider bindingdisconnected 模式仍依赖本地 control plane metadata3.2 变量配置# ⚠️ 变量大小写必须统一——$subscriptionId 和 $SubscriptionId 混用会导致脚本静默失败 $subscriptionId SubscriptionId $resource_group disconnected-test-rg $customloc_name s-cluster-customlocation $location autonomous # Custom Location ID 拼接 $customLocationID /subscriptions/$subscriptionId/resourceGroups/$resource_group/providers/Microsoft.ExtendedLocation/customLocations/$customloc_name3.3 创建 Storage Pathaz stack-hci-vm storagepath create --resource-group $resource_group --custom-location $customLocationID --location $location --path C:\\ClusterStorage\\UserStorage_1\\VMPath --name New_StoragePath $storagePathID (az stack-hci-vm storagepath show --name New_StoragePath --resource-group $resource_group --query id -o tsv)3.4 创建 VM ImageVHDX# 1. 下载 / 拷贝 VHDX 到 cluster storage curl.exe -o C:\\ClusterStorage\\UserStorage_1\\testimage.vhdx VHDX_URL # 2. 创建 image 元数据 az stack-hci-vm image create --resource-group $resource_group --custom-location $customLocationID --location $location --storage-path-id $storagePathID --image-path C:\\ClusterStorage\\UserStorage_1\\testimage.vhdx --name test-gallery-image --os-type Windows 技术分析image create只创建元数据 VHDX 引用不上传到 Azure storage——是本地元数据⚠️ Ubuntu 镜像关键提示Ubuntu 在 Azure Local VM 上不能直接用 cloud image——必须Hyper-V Gen2 compatible VHDX已安装hv_vmbus drivers部分版本经sysprep/cloud-init准备参考 Prepare Ubuntu image for Azure Local VM via Azure CLI3.5 创建 Logical Network# ⚠️ PowerShell 会把 () 当子表达式解析必须用单引号嵌套双引号包裹 switch name az stack-hci-vm network lnet create --resource-group $resource_group --custom-location $customLocationID --location $location --name arcvm-lnet-static --vm-switch-name ConvergedSwitch(managementcomputestorage) --ip-allocation-method Static --address-prefixes 192.168.200.0/24 --ip-pool-start 192.168.200.180 --ip-pool-end 192.168.200.190 --gateway 192.168.200.1 --dns-servers 192.168.200.222⚠️ Switch name 不是固定字符串vm-switch-name必须从部署时生成的FullEnvironment.json获取——不存在标准固定命名。变化来源不同 appliance→ Network Intent 命名约定可能不同不同 OEM→ 参考架构不同不同 SDN profile→ storage / management / compute 分离 vs 融合必须从HostNetwork.Intents.Name/DeploymentData.InfrastructureNetwork段读取实际 switch 名称。3.6 创建 NIC# ⚠️ HCI extension 里该参数是复数形式 --subnet-ids即使只有一个子网也用复数 # IP 必须在 lnet 的 ip-pool 区间内 az stack-hci-vm network nic create --resource-group $resource_group --custom-location $customLocationID --location $location --name arcvm-vnic --subnet-ids arcvm-lnet-static --ip-address 192.168.200.1853.7 创建 VM# ⚠️ 以下两个错误必须避免 # 1. Azure Local 不支持 vm-sizeCustom该参数在 HCI extension 中不存在 # 2. processors / memory-mb 不是 --hardware-profile 里的键值对而是顶级参数 # 3. 引用本地自建 image 元数据时参数名是 --image-name不是 --image az stack-hci-vm create --resource-group $resource_group --custom-location $customLocationID --location $location --nics arcvm-vnic --storage-path-id $storagePathID --computer-name test-machine --admin-username admin --admin-password StrongPassword! --image-name test-gallery-image --name test-vm --processors 4 --memory-mb 8192 --enable-agent true 技术分析什么是--enable-agent true这不是推测——--enable-agent是Arc VM Agent onboarding flag明确开关自动部署Azure Arc VM agent启用以下 Guest 能力Guest managementPolicyExtension management⚠️ 密码安全文档示例中的example是弱密码——生产务必换强密码密码复杂度满足 AD / 域策略要求。3.8 Trusted LaunchPreviewaz stack-hci-vm create --resource-group $resource_group --custom-location $customLocationID --location $location --nics arcvm-vnic --storage-path-id $storagePathID --computer-name test-machine --admin-username admin --admin-password StrongPassword! --image-name test-gallery-image --name test-vm-tl --processors 4 --memory-mb 8192 --security-type TrustedLaunch --enable-secure-boot true --enable-vtpm true --enable-agent true4. 架构级补充官方未显式说明4.1 Arc VM Agent--enable-agent 技术分析自动部署 Azure Arc VM agent用于Guest managementPolicyExtensions4.2 Monitoring监控 技术分析监控源Disconnected 模式可用性Azure Monitor AgentAMA✔可部署但 disconnected 模式下无 Azure ingestion endpoint——无法完成数据上传链路仅保留本地运行能力Log Analytics❌ Disconnected 不可用本地 SIEM / Syslog✔ 推荐Prometheus / Grafana✔ 推荐SCOM 管理包✔ 可用但需 SCOM 基础设施生产建议统一 SIEM 接入不依赖 Azure Monitordisconnected 模式下无法上传。不要混用表述AMA 可装但不可用——准确的工程描述是可部署但无数据上传链路。4.3 Image Lifecycle镜像生命周期 技术分析Azure Local VM≠ Azure VM没有 ARM image gallery pipeline只能手工 VHDX企业 golden imageCI/CD pipeline 构建4.4 VM 生命周期能力语义边界 技术分析操作支持情况关键限制resize✔ 支持依赖 VM stop/start——不支持热调整 vCPU/内存live migration✔ 支持仅 cluster 内不是跨 cluster / 跨 regionHA✔ 支持依赖Failover Cluster——不具备 Azure Region SLA 语义也不是 Availability Set快照✔ 支持Hyper-V checkpointextension✔ 支持通过 Arc VM agent--enable-agent true关键差异必须理解Azure Local VM 的 HA 属于 Hyper-V Failover Cluster 模型不具备 Azure Region SLA 语义。也就是说——Azure Local VM 故障转移 ≠ Azure IaaS VM 的 SLA 99.99%。不要把 Azure Local VM 的 HA 跟 Azure IaaS VM SLA 混为一谈。4.5 删除存储路径的级联约束顺序敏感删除顺序至关重要——错误顺序会留下Arc 控制面的孤立镜像元数据导致Storage Path 永久无法解绑。 正确删除顺序删除 VM先停后删删除磁盘data disk / OS disk优先删除 image 元数据这一步最常被忽略最后删除 Storage Path⚠️ 反面教训绝对不要绕过 Arc 控制面直接通过底层 Hyper-V cmdlet 删除物理 VHDX 文件Arc 控制面持有的 image 元数据不会自动消失该元数据仍然引用已经不存在的 VHDX 文件路径结果Storage Path 永远无法解绑——只能用强制清理脚本 反向修补如果已经走错不能通过 Portal / CLI 直接解绑需要手动清理 Appliance 上的吊桶引用或重新部署 Appliance最坏情况5. 企业级最佳实践总结 架构建议VM 镜像统一 golden image 管理CLIIaC 化GitOpsVM metadata 全部纳入 CMDB 安全建议必须启用Secure BootvTPM密码策略必须企业级禁止示例弱密码关键 VM 集成 Defender for Endpoint 网络建议所有 IP pool 预规划DNS / gateway固定化写进 lnet 配置网络全 CLI 化不依赖 Portal 复杂配置 运维建议统一 SIEM非依赖 Azure MonitorArc agent 统一版本管理VM metadata 变更走 PR GitOps 流程 升级与兼容升级前查看Azure Local release notes升级顺序CLI → extension → OperationsModule → Appliance——逐项验证VM resize / HA / 迁移能力应与连网模式对齐基本无差异6. Disconnected vs Connected 关键差异表企业最关心的维度——同一份 VM 配置在两种模式下的实际差异。维度Connected 模式Disconnected 模式影响VM lifecycle 管理入口Portal CLI APICLI API 为主Portal 有限自动化优先VM image 来源Azure Marketplace 自建仅自建 VHDXCSV需内部 golden image pipelineArc VM Agent自动 持续上报自动部署无 Azure 端上报失去云端 Guest 监控Azure Monitor✔ 上报到 Log Analytics❌ 无 ingestion endpoint必须本地 SIEMDefender for Cloud✔ Attestation 策略⚠ 组件可装attestation 不可用安全合规需本地替代Trusted Launch✔ 完整 attestation⚠ Secure Boot vTPMmeasured boot 有限不等价 Azure IaaSMarketplace 同步✔ 自动❌无离线镜像库必须自建Patch / Update✔ Windows Update / apt via Azure⚠必须本地 WSUS / 离线 apt mirror需自建补丁源HA 模型Azure Region SLAHyper-V Failover Cluster不等价 SLALive Migration跨 region / 跨订阅仅 cluster 内不能跨 cluster 迁移BackupAzure Backup第三方 / 本地 Veeam 等无 Azure 原生备份Disaster RecoveryAzure Site Recovery第三方 / 业务连续性方案需自建 DRCost 模型按 vCPU / GB-hour预付费 / 容量承诺计费模型不同核心结论API 兼容——同一份az stack-hci-vm脚本在两种模式下基本都能跑能力不等价——很多在 connected 模式可用的功能在 disconnected 模式下只是组件在但数据不通企业替代方案——必须自建补丁 / 监控 / 备份 / DR7. CLI vs Portal vs API Capability Matrix企业选型必看——决定自动化与运维策略。能力CLIstack-hci-vmPortalArcREST APIVM 创建✔ 完整⚠ 基础✔ 完整VM resize✔ 完整✔ 基础✔ 完整VM 删除✔ 完整✔✔ 完整VM 启动 / 停止✔ 完整✔✔ 完整VHDX image 创建✔ 完整❌✔ 完整VHDX image 删除✔ 完整❌✔ 完整Storage path 管理✔ 完整❌✔ 完整Logical network 创建✔ 完整⚠ 查看为主✔ 完整NIC 创建static IP✔ 完整❌✔ 完整Trusted Launch 配置✔ 完整⚠ 部分✔ 完整Arc VM Agent 启用✔ 完整✔✔ 完整Extension 部署✔ 完整⚠ 部分✔ 完整Monitoring 查看⚠ 需 AMA 本地✔ 基础✔ 完整Live migration❌cluster 层❌❌HA 配置❌cluster 层❌❌快照 / Checkpoint⚠ 通过 Hyper-V cmdlet❌⚠图例✔ 完整支持⚠ 部分支持 / 受限❌ 不支持企业建议日常 lifecycleCLI IaCGitOpsPortal 仅用于临时观测、故障定位REST API 用于CI/CD、自动化平台对接Cluster 层操作HA / live migration用 Failover Cluster Manager / Hyper-V cmdlet——不走 Arc API8. 工程级原则Rule of Thumb这些原则是从微软架构推断的工程铁律——脱离这些会出现明明文档说能为啥跑不通的问题。8.1 CLI extension 必须对齐 release trainCLI extension version must align with Azure Local release train (not Azure CLI version).Azure CLI 自身版本如 2.81.0跟 Azure Local 兼容性是间接关系stack-hci-vm/azurestackhciextension 版本才是直接绑定的不要装最新版 Azure CLI 最新版 extension——可能跨 release train应该看 Azure Local release notes → 找该 release 对应的 extension 版本 落地抓手操作前必跑清查命令# 操作前必须跑列出所有可用 extension 版本显式核对 az extension list-available -o table # 具体要核对 # - azurestackhci 或 stack-hci-vm 的版本号 # - 是否在 OEM 硬件厂商提供的白名单内Dell / Lenovo / HPE 通常有 version matrix # - 是否与 Appliance build 、Operations Module 版本一致三方一致性原则操作前必须检查组件核对来源Azure Local releaseOEM release notes / Azure Local catalogCLI extension versionaz extension list-available -o tableAppliance buildGet-Module -Name Az.Local -ListAvailable任意一项不匹配先把版本对齐再继续操作。8.2 能力 ≠ 完整Azure Local VM 的很多功能是 Hyper-V 层语义不是 Azure IaaS 语义HA Failover Cluster不是SLA 99.99%resize stop/start不是热调整live migration cluster 内不是跨 clusterTrusted Launch 本地 enforcement不是Azure attestation8.3 组件在 ≠ 数据通Disconnected 模式下AMA可装≠ 数据能上传Defender可装≠ attestation 可用Arc Agent可装≠ Guest 能上报 Azure凡是需要 Azure 端 ingestion / attestation / 同步的功能组件装好只是第一步Azure 端不可达就失去完整能力。8.4 镜像管理是本地工程没有 Marketplace 必须内部 golden image pipeline没有自动 patch 必须本地 WSUS / 离线 apt mirror没有 ARM image pull 所有 VHDX 必须落 CSV这三件事没有官方托管方案——必须企业自建