本文适用版本:vSphere 7.0 U3 / 8.0 U2 / 9.0
阅读时长:约 6 分钟
难度:⭐⭐(需要在 vCenter 改配置 + 物理机接双网线)
一、真实案例:升级后的"集群分裂"惊魂夜
23:15 客户运维:"张工,我们升级完 ESXi 7.0 U3,vCenter 上一片红,集群报 'DPM: insufficient management network redundancy',DPM 完全不工作。"
23:18 我让客户截图 vCenter 集群配置 → 发现 8 台 ESXi,只有3 台配了双管理网卡,其余 5 台只有 1 块管理网卡。
23:25 我问:"升级前 DPM 是开着的吗?"客户:"开着的,一直跑了一年多都没问题。"
23:28 排查升级前后的差异 → U3 升级引入了更严格的 DPM 冗余校验。原来配置只检查单网卡 up/down,升级后要求双网卡交叉冗余(即:每个网段都有另一台主机的备用网卡)。
23:35 给客户方案:① 给 5 台缺双网卡的 ESXi 加备用网卡,② 或者把 DPM 暂时关掉,③ 或者改 DPM 高级选项降低冗余要求。
23:50 客户选了方案 2(关 DPM),然后预约下周维护窗口加网卡。
次日 09:30 客户反馈:生产环境恢复正常,告警消除。
关键提醒:DPM 报这个错不会立刻影响业务(DPM 只在低负载时关闭主机省电),但会让你失去自动节能能力,而且如果同时 HA 也在工作,某些主机可能被误判为"离线"。
二、原理:DPM 为什么要"管理网络冗余"?
DPM(Distributed Power Management)是 vSphere 的自动节能功能,在低负载时把 VM 集中到少数主机,然后把空载主机关机省电。
正常状态(白天): [ESXi-01: 20 VM] [ESXi-02: 18 VM] [ESXi-03: 22 VM] [ESXi-04: 19 VM] DPM 优化后(凌晨): [ESXi-01: 79 VM] [ESXi-02: 0 VM] [ESXi-03: 0 VM] [ESXi-04: 0 VM] ↓ ↓ (关机省电) (关机省电) 需要叫醒时: 关机主机 → IPMI/ILO 唤醒 → VM 重新分布DPM 的工作前提:
- vCenter 能正常和所有 ESXi 主机通信(管理网络)
- ESXi 主机能被远程唤醒(IPMI/iLO 必须配好)
- 管理网络必须冗余——否则一条网线故障,DPM 就找不到主机了
U3 升级后的新校验逻辑:
原来 vCenter 只要求"每个 ESXi 有可用的管理网络",U3 起要求"任意一条管理网线断了,集群里仍有足够的主机能维持 DPM 工作"。这需要双网卡交叉冗余。
三、3 步定位:确认是网络问题还是 DPM 配置问题
# 第 1 步:看每台 ESXi 的管理网卡数量 Get-VMHost | %{ $vmks = Get-VMHostNetworkAdapter -VMHost $_ -VMKernel | ? {$_.ManagementTrafficEnabled -eq $true} Write-Host "$($_.Name): $($vmks.Count) 个管理网卡" }# 第 2 步:看管理网卡的网络分布 # 物理网卡 vmnic0 → vSwitch0 → Management Network # 物理网卡 vmnic1 → vSwitch1 → Management Network (冗余) # 如果都走同一 vSwitch,也算"逻辑不冗余"# 第 3 步:看 DPM 当前状态 Get-Cluster "Production-Cluster" | %{ Write-Host "DPM 状态:$($_.DpmEnabled)" Write-Host "DPM 阈值:$($_.DpmThreshold)" }对照表:
| 检查项 | 合格 | 不合格 |
|---|---|---|
| 每台 ESXi 管理网卡数 | ≥ 2 块 | 只有 1 块 |
| 管理网卡所在 vSwitch | 不同 vSwitch | 同一 vSwitch |
| 物理网卡所在交换机 | 不同物理交换机 | 同一物理交换机 |
| IPMI/iLO 是否独立网络 | 独立网段 | 与管理网共用 |
四、解法:3 档修复方案
方案 A:给每台 ESXi 加备用管理网卡(推荐,根治)
# 1. 物理操作(机房里做): # - 给每台 ESXi 加一块独立网卡(千兆够用) # - 接另一台物理交换机 # - 配置独立 IP 网段 # 2. ESXi 上创建第二个 VMkernel 端口: # vSphere Client → Host → Configure → Networking → VMkernel adapters → Add # - 选备用 vSwitch # - 勾选 "Management traffic" # - 配置 IP(如 10.20.30.41/24) # 3. PowerCLI 批量操作(8 台主机示例) Get-VMHost "esxi-prod-0*" | %{ $vmhost = $_ # 找未使用的物理网卡 $usedVmnic = (Get-VMHostNetworkAdapter -VMHost $vmhost -Physical | Where-Object {$_.VMHostName -eq $vmhost}).Name $availableVmnic = Get-VMHostNetworkAdapter -VMHost $vmhost -Physical | Where-Object {$_.Name -notin $usedVmnic} | Select -First 1 if ($availableVmnic) { # 创建新 VMkernel 端口 $vmk = New-VMHostNetworkAdapter -VMHost $vmhost ` -PortGroup "Management-Network-Backup" ` -VirtualSwitch (Get-VirtualSwitch -VMHost $vmhost -Name "vSwitch1") ` -IP 10.20.30.41 ` -SubnetMask 255.255.255.0 ` -ManagementTrafficEnabled $true Write-Host "$($vmhost.Name): 加了备用管理网卡 $availableVmnic" } }方案 B:暂时关掉 DPM(快速但失去节能)
# PowerCLI 一键关掉 DPM Get-Cluster "Production-Cluster" | %{ Set-Cluster -Cluster $_ -DpmEnabled $false } # vCenter 端: # Cluster → Configure → Services → DPM → Edit # → 把 DPM 改成 "Off" 或 "Manual" # → 不勾选 "Automation Level"适用场景:临时缓解告警,等维护窗口再修。
方案 C:调整 DPM 高级选项(进阶)
# 降低 DPM 的冗余要求(不推荐生产用) Get-Cluster "Production-Cluster" | %{ Set-Cluster -Cluster $_ ` -DpmEnabled $true ` -DpmThreshold 3 # DpmThreshold:1=保守,2=中等,3=激进 # 数字越大,越倾向于关更多主机 } # 关键高级选项(在 vCenter 里改): # Cluster → Configure → vSphere HA → Advanced Options # → Add: das.ignoreRedundantNetRedundance = "true" # 这会绕过 DPM 的冗余校验踩坑提醒:忽略冗余校验会让 DPM 在网络故障时找不到主机,可能造成 VM 启动失败。建议只作临时方案。
五、防患于未然:3 个最佳实践
1. 管理网络分层设计
┌─────────────────────────────────────────┐ │ 管理网-A 网段:10.10.10.0/24 │ │ - 每台 ESXi 有 1 块网卡 │ │ - 接核心交换机 1 │ ├─────────────────────────────────────────┤ │ 管理网-B 网段:10.20.30.0/24 │ │ - 每台 ESXi 有 1 块备用网卡 │ │ - 接核心交换机 2 │ └─────────────────────────────────────────┘2. IPMI/iLO 网络独立
管理流量(VMkernel)和 IPMI 流量(BMC 网卡)走完全独立的网络,这样即使 ESXi 管理网卡全挂,DPM 仍能通过 IPMI 唤醒主机。
# Dell iDRAC 网络配置(BIOS/iDRAC 设置里): # - 默认独立网口(标注为 "iDRAC" 或 "MGMT") # - 配置独立 IP,如 192.168.1.101 # - 不要和管理网共用3. 升级前预检查
升级 vSphere 大版本前,先看集群是否满足新版本的冗余要求:
# PowerCLI 一键合规检查 $report = Get-Cluster | %{ $cluster = $_ $hosts = Get-VMHost -Location $_ $inCompliant = 0 foreach ($host in $hosts) { $mgmtVmks = Get-VMHostNetworkAdapter -VMHost $host -VMKernel | Where-Object {$_.ManagementTrafficEnabled -eq $true} if ($mgmtVmks.Count -lt 2) { $inCompliant++ } } [PSCustomObject]@{ Cluster = $cluster.Name TotalHosts = $hosts.Count NonCompliant = $inCompliant DPMStatus = $cluster.DpmEnabled } } $report | Format-Table -AutoSize # 升级前先修掉 NonCompliant > 0 的集群六、速查命令卡(可收藏转发)
# 1. 看管理网卡数 Get-VMHost | %{ $vmks = Get-VMHostNetworkAdapter -VMHost $_ -VMKernel | ?{$_.ManagementTrafficEnabled}; "$($_.Name): $($vmks.Count) 块" } # 2. 关 DPM(临时) Set-Cluster -Cluster "Production-Cluster" -DpmEnabled $false # 3. 加备用管理网卡 New-VMHostNetworkAdapter -VMHost esxi-prod-01 ` -PortGroup "Management-Backup" ` -VirtualSwitch "vSwitch1" ` -IP 10.20.30.41 -SubnetMask 255.255.255.0 ` -ManagementTrafficEnabled $true # 4. 升级前合规检查 Get-Cluster | %{ /* 见正文脚本 */ } # 5. 绕过 DPM 冗余校验(临时) # vCenter → Cluster → Configure → vSphere HA → Advanced Options # 添加: das.ignoreRedundantNetRedundance = "true" # 6. 看 DPM 当前状态 Get-Cluster | %{ "DPM:$($_.DpmEnabled), 阈值:$($_.DpmThreshold)" }