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 资源池中创建的 VM 时,系统会构建一个简化 vApp 以包含每个发现的 VM。
放置引擎将根据以下条件为 VM 选择候选资源池。
  • CPU 容量
  • 内存容量
  • 虚拟 CPU 的数量
  • 主机支持且提供者 VDC 允许的硬件版本
  • 关联性规则

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

重要说明: 虚拟机-主机关联性规则必须具有一个条件,当满足该条件时,规则在组中的主机上 must run。虚拟机-主机反关联性规则必须具有一个条件,当满足该条件时,规则在组中的主机上 must not run
放置引擎将根据以下条件为 VM 选择候选数据存储。
  • 存储容量和阈值
  • 存储策略
  • VM 之间的关联性要求
  • IOPS 容量和 VM 磁盘 IOPS(如果激活了 IOPS)
VMware Cloud Director 有两个数据存储阈值。
  • 红色阈值 - 数据存储上的可用空间量,低于该阈值时,VMware Cloud Director 会在任何实体(如 VM、模板或磁盘)的放置期间筛选掉数据存储。

    当数据存储达到红色阈值时,工作负载放置引擎将停止在数据存储上放置新的 VM,但从 vCenter 导入 VM 时除外。在导入 VM 的情况下,如果 vCenter VM 已存在于红色阈值数据存储中,则放置引擎将优先选择现有的数据存储。

    工作负载放置引擎对所有工作流使用红色阈值。请求进行任何新的放置时,放置引擎会首先筛选掉已超出红色阈值的任何数据存储或存储单元。请求对现有实体进行放置时,如果磁盘驻留在超出红色阈值的数据存储上,VMware Cloud Director 会将磁盘重新放置到其他可用数据存储中。然后,引擎会通过 VMware Cloud Director 的选择器逻辑或通过 vSphere Storage DRS 建议,从剩余的数据存储或存储单元中选择一个数据存储。

  • 黄色阈值 - 数据存储上的可用空间量,低于该阈值时,VMware Cloud Director 会在影子 VM 的放置期间筛选掉数据存储,在此期间,VMware Cloud Director 会创建快速置备的 VM。有关影子 VM 的详细信息,请参见虚拟机的快速置备

    黄色阈值不适用于 VMware Cloud Director 用于快速置备 VM 的链接克隆。当放置引擎为链接克隆选择数据存储时,如果所选数据存储缺少影子 VM,VMware Cloud Director 会在该数据存储上创建影子 VM。在这种情况下,阈值不适用于影子 VM。

    黄色阈值仅适用于创建影子 VM 的定期后台作业。如果激活,作业每 24 小时运行一次,并针对给定的集线器和存储策略对在每个数据存储上使用预先 VM 创建。要激活作业以进行影子 VM 的预先置备,必须将以下属性设置为 true
    valc.catalog.fastProvisioning=true
    注: 定期后台作业会在所有模板的所有数据存储上创建影子 VM。即使未使用数据存储或影子 VM,该作业也会增加存储消耗。

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

实施阈值逻辑时,VMware Cloud Director 不会评估当前放置主体的要求。对于要将主体放置在数据存储上的工作负载放置引擎,可用空间(以字节为单位)必须大于阈值(以字节为单位)。例如,对于可用容量为 5 GB 且红色阈值设置为 4 GB 的数据存储,放置引擎可以放置要求 2 GB 的 VM。如果 VM 创建超出阈值,则放置引擎会筛选掉数据存储以进行进一步的放置。

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

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

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

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

打开 VM 电源时,VMware Cloud Director 会尝试在其当前位置打开电源。如果 vCenter 报告主机 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 

数据存储筛选器和存储放置算法

VMware Cloud Director 数据存储筛选器和存储放置算法决定了 VM 文件和磁盘在底层存储资源上的放置。存储容器表示存储资源,即数据存储或数据存储集群。

数据存储筛选器是存储筛选器链的一部分,有助于根据放置主体的要求缩小符合条件的存储容器的范围。筛选器使用提供者 VDC 中的可用存储容器作为输入列表。筛选器按预定义顺序运行,并且每个筛选器将优化后的存储容器列表传递到下一个筛选器。VMware Cloud Director 将跳过不适用的筛选器。例如,对于没有 IOPS 设置的 VM,VMware Cloud Director 不会运行 IOPS 筛选器。

表 1. 数据存储筛选器
筛选器 描述
AffinityDatastoreFilter 根据为数据存储定义的关联性和反关联性规则筛选存储容器。在从 vCenter 导入 VM 和迁移租户等情况下,VMware Cloud Director 会设置数据存储关联性规则。
AlreadyOnValidDatastoreFilter 如果放置主体已放置在有效的数据存储上,则此筛选器会拒绝所有其他存储容器并仅保留有效的数据存储。
BadHostsFilter 筛选掉至少一个已连接、可正常运行且已打开电源的主机都没有的存储容器。筛选掉已从清单中删除的存储容器。
DatastoreClusterFilter

筛选出所有数据存储集群和属于数据存储集群的数据存储。当放置主体不需要数据存储集群时,将使用此筛选器。例如,如果 config: vcloud.disk.shared.allowOnSpod 指定不允许在数据存储集群上使用共享的给定磁盘。

DatastoreFsFilter 筛选掉属于指定文件系统的所有存储容器。例如,如果 config: vcloud.disk.shared.allowOnNfs 指定不允许在 NFS 数据存储上使用共享的给定磁盘,则放置算法会将此筛选器添加到链中。
DisabledDatastoreFilter 从输入列表中筛选掉所有已停用的存储容器。
IopsCapacityDatastoreFilter

筛选掉没有足够 IOPS 容量供 VM 使用的所有数据存储。

如果满足以下必备条件,将运行此筛选器。

  • VM 具有 IOPS 设置。
  • 没有存储 Pod。
  • 所有数据存储均已设置 iopsCapacities
  • VM 已激活存储策略的 VCD/IOPS 功能,并且存储策略设置中的影响放置选项处于激活状态。
LeastProvisionedFilter 选择置备最少的存储容器。
LinkedCloneFilter 筛选掉没有源 VM 或在某个数据存储上没有相应影子 VM 的所有数据存储。筛选掉源 VM 超过 VM 中虚拟磁盘允许的最大链长度的任何数据存储。
MinFreeSpaceFilter 筛选掉没有足够的可用空间用于放置主体的任何存储容器。对于存储 Pod,子数据存储的最大可用空间决定了子数据存储的可用空间,而不是其总可用空间,或者存储 Pod 的可用空间。例如,如果一个存储 Pod 具有两个数据存储,并且这两个数据存储的可用空间分别为 3 GB 和 5 GB。VMware Cloud Director 将认为该存储 Pod 的可用空间为 5 GB。如果没有此类容器,筛选器会保留可用空间最多的容器。
MostFreeSpaceFilter 筛选掉可用空间最多的存储容器。
StorageClassFilter 筛选掉与其要求中定义的放置主体存储策略不匹配的任何存储容器或存储 Pod。
ThresholdFilter 筛选掉达到指定的可用容量阈值的存储容器。VMware Cloud Director 中有黄色和红色两种阈值。请参见在 VMware Cloud Director 中为提供者虚拟数据中心存储容器配置磁盘空间下限阈值
VirtualMachineFilter 筛选掉指定 VM 无权访问的所有存储容器。

VMware Cloud Director 会将筛选后的最终存储容器列表传递给存储放置算法,然后该算法会尝试将放置主体放置在所选存储容器中。

为了将一组放置主体放置在最合适的数据存储中,存储放置算法会使用一些可配置的条件以及有效数据存储的列表。存储放置算法使用以下工作流。
  1. 从放置引擎接收一组放置主体和支持提供者 VDC 的目标资源池。可以使用两种替代方法。

    • 通常,该算法会接收一个虚拟机主文件,其中包含元数据和配置信息以及一组磁盘,用于常规、非快速置备 VM 的放置。
    • 该算法可能会对给定磁盘和快速置备 VM 使用聚合磁盘方法。换句话说,对于每个快速置备 VM,该算法会接收该 VM 及其所有磁盘的一个要求。
  2. 接收符合该集线器条件的一组存储容器,其中包括数据存储和存储 Pod。
  3. 为了筛选掉无法容纳某个主体的存储容器,对于每个放置主体,该算法会对整个静态放置筛选器链运行。例如,如果某个数据存储无法容纳某个 VM 磁盘,则该算法会将该数据存储标记为不适合该 VM 磁盘。
  4. 依次按照以下考虑因素根据存储容器的优先顺序对每个主体的存储容器进行排名。
    1. 容器是存储 Pod 还是数据存储
    2. 还有多少其他放置主体将该存储 Pod 作为有效容器
    3. 容器的大小
  5. 如果任一容器为存储 Pod,则要将存储 Pod 减小至数据存储,该算法将运行 vSphere Storage DRS 调用算法。
  6. 输入放置主体及其一组有效的数据存储后,将确定放置主体必须驻留的位置。
  7. 返回最终放置结果,以确定每个放置主体必须驻留的数据存储;或者返回错误,指出 VMware Cloud Director 算法找不到合适的放置位置。