一、先搞懂两个核心概念,别上来就谈冲突

很多做云服务器、虚拟机运维的朋友,经常会碰到这么个头疼的问题:本来想给某个虚拟机加内存、加CPU(就是垂直扩展),结果系统自动把这个虚拟机挪去了别的服务器(就是动态资源调度),要么扩展失败,要么挪完之后虚拟机又出问题。要解决这个问题,得先把两个核心概念拆明白,不能上来就说“冲突了怎么办”。

1.1 什么是动态资源调度(DRS)?

你可以把整个云服务器集群想象成一个“共享办公区”,里面有好几个“工位”(就是物理服务器),每个工位上放着几个“办公电脑”(就是虚拟机)。动态资源调度的功能,就是一个“工位管理员”,它会实时看每个工位的电脑占了多少内存、用了多少CPU:比如工位A有3台电脑,都快把内存占满了,工位B有5台电脑,大部分内存都空着,管理员就会把工位A的某台电脑挪去工位B,让大家都能正常干活,不会因为某台工位太挤导致电脑卡。

具体到vSphere(VMware的云服务器管理系统)里,DRS有个核心规则:亲和/反亲和规则,用来告诉管理员“哪些电脑不能挪去一起”或者“哪些电脑必须放在一起”。比如你有两台数据库服务器,得放在同一个工位才能保证网络速度快,就可以给它们加个“必须在一起”的亲和规则;如果某台电脑是做敏感数据处理的,不能和别的普通电脑放一起,就加个“不能和某组电脑一起”的反亲和规则。

1.2 什么是虚拟机垂直扩展?

垂直扩展就是给单台虚拟机“升级配置”,比如原来给这台虚拟机分配了4核CPU、8G内存,现在业务量涨了,就改成8核CPU、16G内存,或者加一块硬盘。这种操作一般是运维手动做的,或者通过自动化脚本定时触发,核心目的是让单台虚拟机的性能能扛住当前的业务压力。

但垂直扩展有个前提:它依赖的是当前虚拟机所在的物理服务器的“硬件资源”——比如你要给某台虚拟机加内存,首先得保证这台虚拟机所在的物理服务器还有空闲的内存,要是这个物理服务器已经把内存都用完了,你再加就会失败。

1.3 冲突到底是怎么产生的?

举个最常见的例子:你有一台跑电商订单系统的虚拟机,现在是“6核CPU、12G内存”,所在的物理服务器A还有20G空闲内存。你计划晚上12点做垂直扩展,给它加到“6核CPU、24G内存”。结果到了晚上11点50分,物理服务器B的业务量突然涨了,DRS管理员发现物理服务器B的CPU占了90%,而物理服务器A的CPU只占了30%,就自动把这台订单系统的虚拟机挪去了物理服务器B。到了12点你去扩展的时候,发现物理服务器B的空闲内存只有10G,不够给这台虚拟机加12G内存,扩展失败了——这就是冲突。

还有一种更麻烦的冲突:你给两台数据库加了“必须在一起”的亲和规则,结果垂直扩展的时候,其中一台因为所在物理服务器资源不够,DRS想把它挪去别的服务器,又触发了亲和规则,导致扩展失败,甚至整个集群的资源调度乱掉。

二、用vSphere的EVC模式,先把硬件的“兼容性”问题解决

很多人碰到冲突的时候,只想着调整DRS规则,却忽略了一个前提:物理服务器的硬件必须能“兼容”,不然就算DRS不挪,垂直扩展也可能出问题。这时候就需要用到EVC模式(增强vMotion兼容性)。

2.1 EVC模式到底是干啥的?

你可以把EVC模式想象成“统一硬件语言”:每个物理服务器的CPU都有自己的“特殊功能”,比如Intel的CPU有“AVX”指令集,AMD的CPU有“3DNow!”指令集,不同代的CPU支持的指令集也不一样。如果两台物理服务器的CPU指令集不兼容,虚拟机是不能从一台挪去另一台的——就像一个只会说中文的人,不能跟只会说英文的人交流,更不能一起工作。

EVC模式的作用,就是给整个集群里的所有物理服务器,统一设置一个“最低的CPU指令集标准”:比如整个集群里的CPU,有的支持AVX2,有的只支持AVX,EVC就把所有服务器的指令集都降到“AVX”这个标准,这样所有服务器之间的虚拟机都能随便挪,不会因为指令集不兼容导致挪失败。

2.2 EVC模式的配置方法(技术栈:vSphere 7.0)

先明确整个示例的技术栈:vSphere 7.0 U3(包含vCenter Server和ESXi物理服务器),集群里有3台ESXi服务器,CPU分别是Intel Xeon E5-2670 v2(支持AVX)、Intel Xeon E5-2670 v3(支持AVX2)、Intel Xeon E5-2670 v4(支持AVX2)。

配置EVC模式的步骤很简单,用vCenter的管理界面就能完成:

  1. 登录vCenter,找到你的集群,右键选择“编辑设置”;
  2. 在弹出的窗口里,找到“VMware EVC”选项,选择“为集群启用EVC”;
  3. 选择“Intel EVC模式”,然后选择“Intel Xeon E5-2670 v2”对应的指令集(也就是最低的那个标准);
  4. 点击“确定”,等待系统同步完成。

配置完成后,你可以用下面的PowerCLI命令验证EVC模式是否生效:

# 技术栈:PowerCLI 12.5(vSphere配套的命令行工具)
# 连接到vCenter Server(替换为你的vCenter地址、用户名、密码)
Connect-VIServer -Server vcenter01.example.com -User administrator@vsphere.local -Password "your-password"

# 获取集群的EVC模式信息(替换为你的集群名称)
Get-Cluster -Name "Production-Cluster" | Select-Object Name, EVCMode, EVCModeStatus

执行后会输出类似下面的结果:

Name               EVCMode                          EVCModeStatus
----               -------                          -------------
Production-Cluster IntelXeonE52670v2 (AVX)          Enabled

这就说明EVC模式已经生效,整个集群的CPU指令集统一成了AVX标准,虚拟机可以在这3台服务器之间自由移动。

2.3 EVC模式的优缺点和注意事项

优点:

  • 彻底解决了虚拟机跨服务器移动的硬件兼容性问题,为DRS的灵活调度和垂直扩展的资源调整打下基础;
  • 配置简单,不需要修改任何虚拟机的配置,也不需要重启虚拟机(除了个别特殊情况)。

缺点:

  • 会牺牲部分新CPU的性能:比如原来支持AVX2的CPU,被限制成只能用AVX,相当于新CPU的“新功能”用不了,性能会有一定损失(一般在5%-10%之间,对大部分业务来说可以接受);
  • 不能跨CPU品牌配置:比如集群里既有Intel的CPU,又有AMD的CPU,是不能启用EVC模式的,必须把不同品牌的CPU分到不同的集群里。

注意事项:

  • 启用EVC模式之前,必须确保集群里的所有物理服务器都支持你选择的EVC标准:比如你选了“Intel Xeon E5-2670 v2”,就不能再往集群里加比这个更早的CPU;
  • 对于性能要求极高的业务(比如高性能计算、视频渲染),不建议启用EVC模式,因为会损失性能;
  • 启用EVC模式后,不能随便升级物理服务器的CPU固件,否则可能导致EVC模式失效。

三、协调DRS规则和垂直扩展的冲突,分4步走

解决了硬件兼容性的问题,接下来就是核心的冲突协调了。我们可以把整个流程拆解成4步,每一步都有具体的操作方法,还会结合实际的示例来讲解。

3.1 第一步:给需要垂直扩展的虚拟机打“标签”

首先,你得告诉DRS管理员,哪些虚拟机是需要做垂直扩展的,不能随便挪。vSphere里的“标签”功能就像给虚拟机贴一个“特殊标记”,比如“待垂直扩展”,这样DRS就能识别这些虚拟机。

具体操作(技术栈:vSphere 7.0):

  1. 登录vCenter,找到“标签和类别”,创建一个新的标签类别,比如“扩展状态”;
  2. 在这个类别里创建一个标签,比如“待垂直扩展”;
  3. 把需要做垂直扩展的虚拟机(比如之前提到的订单系统虚拟机),都贴上这个标签。

贴完标签后,你可以用下面的PowerCLI命令验证标签是否贴对:

# 技术栈:PowerCLI 12.5
# 连接到vCenter(和之前的命令一样)
Connect-VIServer -Server vcenter01.example.com -User administrator@vsphere.local -Password "your-password"

# 获取所有贴了“待垂直扩展”标签的虚拟机
Get-VM | Where-Object { $_.Tag -contains "待垂直扩展" } | Select-Object Name, Tag

执行后会输出类似下面的结果:

Name           Tag
----           ---
Order-System-01 {待垂直扩展}

3.2 第二步:调整DRS的“反亲和规则”,锁定虚拟机的位置

接下来,你需要给这些贴了标签的虚拟机,设置一个特殊的DRS反亲和规则:“这些虚拟机不能被挪走”。具体来说,就是给每个需要垂直扩展的虚拟机,单独设置一个“反亲和规则”,规则的内容是“这台虚拟机不能和除了它自己之外的所有虚拟机放在一起”——这样DRS就会认为,这台虚拟机是“特殊的”,不能随便移动,因为挪去别的服务器就会和别的虚拟机放在一起,违反规则。

具体配置(技术栈:vSphere 7.0):

  1. 找到你的集群,右键选择“编辑设置”;
  2. 找到“规则”选项,点击“添加”;
  3. 规则类型选择“虚拟机-虚拟机”,规则名称比如“锁定-Order-System-01”;
  4. 规则类型选择“不能放在一起”;
  5. 选择虚拟机的时候,先选“Order-System-01”,然后再选所有其他的虚拟机(或者更简单的方法,创建一个包含所有其他虚拟机的“虚拟机组”,然后在规则里选这个组);
  6. 点击“确定”,保存规则。

配置完成后,你可以用下面的PowerCLI命令验证规则是否生效:

# 技术栈:PowerCLI 12.5
# 连接到vCenter
Connect-VIServer -Server vcenter01.example.com -User administrator@vsphere.local -Password "your-password"

# 获取集群的DRS规则(替换为你的集群名称)
Get-Cluster -Name "Production-Cluster" | Get-DrsRule | Select-Object Name, Type, Enabled

执行后会输出类似下面的结果:

Name               Type          Enabled
----               ----          -------
锁定-Order-System-01 VMToVMAntiAffinity True

3.3 第三步:执行垂直扩展操作,验证结果

规则设置好之后,就可以执行垂直扩展了。我们还是以订单系统虚拟机为例,原来的配置是“6核CPU、12G内存”,现在要扩展到“6核CPU、24G内存”。

具体操作(技术栈:vSphere 7.0):

  1. 找到“Order-System-01”虚拟机,右键选择“编辑设置”;
  2. 在弹出的窗口里,找到“内存”选项,把原来的“12 GB”改成“24 GB”;
  3. 点击“确定”,等待扩展完成。

扩展完成后,你可以用下面的PowerCLI命令验证扩展结果:

# 技术栈:PowerCLI 12.5
# 连接到vCenter
Connect-VIServer -Server vcenter01.example.com -User administrator@vsphere.local -Password "your-password"

# 获取Order-System-01的配置和所在物理服务器
Get-VM -Name "Order-System-01" | Select-Object Name, NumCpu, MemoryGB, VMHost

执行后会输出类似下面的结果:

Name           NumCpu MemoryGB VMHost
----           ------ -------- ------
Order-System-01 6     24       esxi01.example.com

这就说明扩展成功了,而且虚拟机还在原来的物理服务器esxi01上,没有被DRS挪走。

3.4 第四步:扩展完成后,及时解除锁定规则

垂直扩展完成后,就不需要再锁定虚拟机了,否则会影响DRS的正常调度——比如如果原来的物理服务器esxi01的资源被占满了,DRS不能把这台虚拟机挪去别的服务器,就会导致整个集群的资源利用率下降。所以扩展完成后,必须及时解除锁定规则。

具体操作(技术栈:vSphere 7.0):

  1. 找到你的集群,右键选择“编辑设置”;
  2. 找到“规则”选项,找到刚才创建的“锁定-Order-System-01”规则;
  3. 点击“编辑”,把“已启用”的勾选去掉,或者直接删除这个规则;
  4. 点击“确定”,保存设置。

解除规则后,你可以用之前的PowerCLI命令再次验证,会发现这台虚拟机的“待垂直扩展”标签已经没有了,DRS规则也不再锁定它,DRS可以正常调度它了。

四、应用场景、优缺点和注意事项

4.1 核心应用场景

这个协调策略主要适用于以下几种场景:

  1. 业务峰值前的扩容:比如电商平台在“双11”前,需要给订单系统、支付系统做垂直扩展,同时要保证扩展过程中虚拟机不被挪走,避免扩展失败;
  2. 核心业务的升级:比如银行的核心交易系统,需要升级配置,同时要保证系统的稳定性,不能因为调度导致中断;
  3. 批量扩展的场景:比如一次性给10台需要扩展的虚拟机做配置升级,用标签和DRS规则可以批量锁定,提高效率;
  4. 资源紧张的集群:如果集群的整体资源比较紧张,DRS的调度频率很高,很容易在扩展的时候把虚拟机挪走,这时候就需要用这个策略来避免冲突。

4.2 这个协调策略的优缺点

优点:

  • 逻辑简单,容易理解和操作:不需要复杂的开发,只需要用vSphere自带的标签、DRS规则、EVC模式就能实现;
  • 灵活可控:可以根据需要随时调整标签、规则,适配不同的业务需求;
  • 兼容性好:不依赖任何第三方工具,只需要vSphere本身的功能就能完成;
  • 风险低:解除规则后不会影响DRS的正常调度,也不会对集群的稳定性造成影响。

缺点:

  • 手动操作多:如果需要扩展的虚拟机数量很多,手动贴标签、设置规则、解除规则会比较麻烦,需要结合自动化脚本才能提高效率;
  • 规则冲突的风险:如果设置的规则太多,可能会出现规则之间的冲突,导致DRS无法正常调度;
  • 对运维的要求高:需要运维人员熟悉vSphere的各项功能,尤其是DRS规则的配置方法,否则容易出错。

4.3 注意事项

  1. 标签和规则的命名要规范:比如用“锁定-虚拟机名称”来命名规则,用“扩展状态”来命名标签类别,这样容易识别和管理;
  2. 扩展完成后必须及时解除规则:否则会影响DRS的正常调度,导致集群资源利用率下降;
  3. 批量操作时要提前测试:如果需要批量给多台虚拟机设置规则,要先拿一台虚拟机做测试,确认规则生效后再批量操作;
  4. 定期检查集群的DRS规则:避免规则过多导致冲突,定期清理已经不需要的规则;
  5. 对于需要长期高配置的虚拟机,建议考虑水平扩展:垂直扩展的能力是有限的,比如物理服务器的CPU最多支持24核,内存最多支持512G,超过这个限制就需要用水平扩展(加更多的虚拟机)来解决。

五、文章总结

动态资源调度(DRS)和虚拟机垂直扩展的冲突,本质上是“集群资源的全局调度”和“单台虚拟机的局部性能升级”之间的矛盾。要解决这个矛盾,不能只靠调整某一个功能,而是需要把EVC模式、标签、DRS规则这三个vSphere的核心功能结合起来,形成一套完整的协调策略:

首先,用EVC模式统一整个集群的硬件兼容性,让虚拟机可以在不同的物理服务器之间自由移动,为DRS的灵活调度和垂直扩展的资源调整打下基础;然后,用标签标记需要扩展的虚拟机,用DRS的反亲和规则锁定这些虚拟机的位置,避免扩展过程中被DRS挪走;最后,扩展完成后及时解除规则,恢复DRS的正常调度。

这套策略的核心逻辑是“先解决硬件兼容性问题,再临时调整调度规则,最后恢复正常调度”,既保证了垂直扩展的成功率,又不会影响集群的整体资源利用率。对于大部分使用vSphere的企业来说,这套策略是简单、有效、容易落地的解决方案。