VMware Cloud Director 放置引擎可确定将 vApp 中的虚拟机 (VM) 放置在哪个资源(包括资源池、数据存储以及网络或网络池)中。引擎会根据每个 VM 的要求为 vApp 中的每个 VM 单独做出放置决策。

放置引擎在以下情况下运行。
注: VMware Cloud Director 根据每个 VM 的要求单独放置 vApp 中的 VM。
  • 创建 VM 时,放置引擎会确定要将 VM 放置在哪个资源池、数据存储和网络池中。
  • 启动 VM 时,如果 VM 无法打开电源,则 VMware Cloud Director 会选择性地将 VM 移至其他资源池、数据存储或网络池。
  • 编辑 VM 以更改其数据存储、资源或网络配置时,VMware Cloud Director 可能会将该 VM 移至支持新 VM 设置的不同数据存储和资源池。仅当当前资源无法支持新要求时,VMware Cloud Director 才移动 VM。
  • 将 VM 迁移到不同的资源池时。
  • 当组织虚拟数据中心 (VDC) 发现在支持该 VDC 的任何 vCenter Server 资源池中创建的 VM 时,系统会构建一个简化 vApp 以包含每个发现的 VM。
放置引擎将根据以下条件为 VM 选择候选资源池。
  • CPU 容量
  • 内存容量
  • 虚拟 CPU 的数量
  • 主机支持且提供者 VDC 允许的硬件版本
  • 关联性规则

放置引擎会从候选列表中筛选出已停用的资源池。如果可能,VMware Cloud Director 会将 VM 与组织 VDC 中的其他 VM 放置在同一主机集群上。

放置引擎将根据以下条件为 VM 选择候选数据存储。
  • 存储容量
  • 存储策略
  • VM 之间的关联性要求
  • IOPS 容量和 VM 磁盘 IOPS(如果激活了 IOPS)

在大多数情况下,放置引擎会从候选列表中筛选掉已停用的数据存储和达到红色阈值的数据存储。从 vCenter Server 导入 VM 时,引擎不会筛选掉这些数据存储。

放置引擎会根据网络名称为 vApp 及其 VM 选择候选网络池。

在放置引擎选择了一组候选资源之后,它便会根据每个 VM 的 CPU、虚拟 RAM 和存储配置对资源进行排名,并为每个 VM 挑选出最佳的位置。

在对资源进行排名的同时,放置引擎还会检查当前资源使用情况以及估计的未来资源使用情况。估计的未来使用情况将基于当前放置在给定资源池中的已关闭电源的 VM 及其打开电源后的预计使用情况进行计算。对于 CPU 和内存,放置引擎会考虑当前未预留的容量、最大使用情况以及估计的未来未预留容量。对于存储,引擎会考虑每个资源池所属集群提供的累计已置备容量。之后放置引擎会考虑每个资源池的当前适应性和未来适应性的加权衡量指标。

需要移动时,放置引擎会优先考虑具有最多未预留 CPU、内存和存储容量的资源池。它还将以较低的优先级考虑黄色集群,以便只有在没有满足放置条件的健康集群可用时才选择黄色集群。从 vCenter Server 中导入 VM 时,如果 VM 放置令人满意,为减少移动,引擎会忽略阈值。

打开 VM 电源时,VMware Cloud Director 会尝试在其当前位置打开电源。如果 vCenter Server 报告主机 CPU 和内存容量错误,则 VMware Cloud Director 会尝试资源池两次,然后再尝试将 VM 移至组织 VDC 上的其他兼容资源池。重新运行放置引擎以尝试找到兼容的资源池时,VMware Cloud Director 会排除以前尝试过和失败的资源池。如果没有合适的资源池连接到 VMDK 所在的数据存储,则将虚拟机移至另一个资源池可能会导致虚拟机的 VMDK 迁移到其他数据存储。如果在满足 VM 要求的所有位置放置 VM 均失败,则 VMware Cloud Director 将返回一条错误消息,指示放置不可行。如果与当前数据存储具有关联性,但该数据存储不可用,则放置引擎将返回“放置不可行”错误。当系统接近满负荷运行,并且建议的解决方案目前不满足所有要求时,这是系统的正常状态。要修复错误,可以添加或释放资源并启动重试。不需要特定的数据存储时,放置引擎会在候选主机集群或资源池中选择满足存储策略、存储容量和 IOPS 容量等其他要求的数据存储。

在并行部署期间,当资源池已接近其容量的情况下,即使资源池缺少足够的资源来为 VM 提供支持,对此资源池的验证可能依然会成功。在这些情况下,VM 将无法打开电源。如果在这种情况下 VM 无法打开电源,并且有多个资源池支持 VDC,要提示 VMware Cloud Director 将 VM 迁移到其他资源池,请再次启动打开电源操作。

当资源池所属的集群接近其容量时,如果没有单个主机为该资源池上 VM 的打开电源操作提供足够的容量,此 VM 可能无法打开电源。如果在集群级别存在容量碎片,就会发生这种情况。此时,系统管理员必须将一些 VM 从该集群中迁移出来,使集群维持足够的可用容量。

VM 放置引擎算法

放置算法从主机集群列表中选取一个主机集群,这些主机集群具有所需的可用存储配置文件,并且满足任何现有的 VM-VM、VM-主机关联性或反关联性规则。 VMware Cloud Director 通过各种评分计算放置解决方案。要更改引擎的行为,可以使用单元管理工具修改以下划线 (_) 符号开头的可配置参数。
  1. 对于每个主机集群,工作负载放置引擎计算 capacityScorefutureCapacityScorereservationScore。放置引擎分别计算 CPU、内存和存储的每个评分。
    capacityScore: (not available in some cases ) 
    
    CPU = (cpuUnreservedCapacityMHz - (cupBurstMHz * _cpuBurstRatio)) / cpuRequirementMHz 
    Memory = (memoryUnreservedCapacityMB - (memBurstMB * _memoryBurstRatio)) / memRequirementMB 
    Storage = storageFreeCapacityMB / stgRequirementMB 
    
    futureCapacityScore (not available in some cases) 
    
    CPU = (cpuUnreservedCapacityMHz - (cpuUndeployedReservationMHz * _futureDeployRatio)) / cpuRequirementMHz 
    Memory = (memoryUnreservedCapacityMB - (memUndeployedReservationMB * _futureDeployRatio)) / memRequirementMB 
    Storage = storageFreeCapacityMB / stgRequirementMB 
    
    reservationScore: (used for capacityScore and futureCapacityScore when those scores are unavailable) 
    
    CPU = cpuUnreservedCapacityMHz / cpuRequirementMHz 
    Memory = memoryUnreservedCapacityMB / memRequirementMB 
    Storage = storageFreeCapacityMB / stgRequirementMB 
  2. 对于每个主机集群,放置引擎计算 CPU、内存和存储的 weightedCapacityScore
    weightedCapacityScore = capacityScore * _currentScoreWeight + futureCapacityScore * (1 - _currentScoreWeight)

    每个 weightedCapacityScore 是一个介于 0 和 1 之间的比率,值越高表示可用资源越多。可以跨不同的资源类型(例如 CPU、内存和存储)比较 weightedCapacityScore 值,因为它们表示无单位的可用性度量。weightedCapacityScore 越高,表示主机集群中相应资源的可用性越高。

  3. 放置引擎验证是否具有足够的 CPU、内存和存储资源。
    totalAvailable * _[memory|cpu|storage]headRoom < free / UnreservedCapacity
  4. 放置引擎根据 weightedCapacityScore 对主机集群列表进行排序,将限制最小的主机集群排在前面,将限制最大的主机集群排在最后。
  5. 放置引擎处理列表中的每个主机集群。
    • 如果必须避免使用主机集群(例如,由于反关联性规则),引擎会将其添加到 avoidHubList
    • 如果主机集群没有足够的额外资源,引擎会将其添加到 noHeadRoomHubList
    • 如果主机集群是首选集群(例如,由于强关联性规则或为当前主机集群),引擎会将其添加到 preferredHubList
    • 所有其他主机集群添加到 acceptableHubList

    在每个列表中,优先级最高的主机集群排在最前面,优先级最低的主机集群排在最后。

  6. 引擎集成这四个列表。

    preferredHubList + acceptableHubList + noHeadRoomHubList + avoidHubList

    引擎对生成的列表进行排序,将主机集群按优选级别从高到低依次排列。

  7. 放置引擎从列表中选取排名最高的主机集群作为目标集线器。

可调整的参数

要影响各种选择算法阈值,可以自定义几个参数。但是,只有对 VMware Cloud Director 操作有深入了解的服务提供商管理员才能尝试更改这些参数的默认值,因为这可能会产生不可预测的意外结果。首先在非生产环境中测试任何参数更改。

可以使用单元管理工具自定义以下参数。

参数 描述
vcloud.placement.ranking.currentScoreWeight 主机集群评分的当前组成部分的相对重要性。该值必须在 [0.1] 内。值为 0 时,引擎仅根据未来评分对主机集群进行排名。值为 1 时,引擎仅根据当前评分对主机集群进行排名。默认值为 0.5。

vcloud.placement.ranking.memoryBurstRatio

vcloud.placement.ranking.cpuBurstRatio

VM 中分配超出预留的百分比,排名程序使用该值估算集群负载。该值介于 0 到 1 之间。0 表示 VM 仅使用其预留。1 表示 VM 非常繁忙。默认值为 0.67。
vcloud.placement.ranking.futureDeployRatio 此主机集群上预计要部署并消耗内存和 CPU 的 VM 的百分比。该值介于 0 到 1 之间。默认值为 0.5。

vcloud.placement.ranking.memoryHeadRoom

vcloud.placement.ranking.cpuHeadRoom

vcloud.placement.ranking.storageHeadRoom

这些参数可控制在主机集群上保留额外资源以用于增长。引擎将余量定义为未预留资源的比率。例如,如果 vcloud.placement.ranking.memoryHeadRoom 为 0.2,则主机集群的可用资源低于 20% 后,引擎会将其视为内存余量不足的集群,并将其排在其他主机集群后面。此值必须介于 0 到 1 之间。默认值为 0.2。

示例:
./cell-management-tool manage-config -n vcloud.placement.ranking.memoryHeadRoom -v 0.3