5.5. 配置更高的虚拟机工作负载密度
您可以通过过量使用内存(RAM)来增加节点上的虚拟机(VM)的数量。在以下情况下,增加虚拟机工作负载密度非常有用:
- 您有许多类似的工作负载。
- 您有没有被充分利用的工作负载。
内存过量使用可能会在高度使用的系统中降低工作负载性能。
5.5.1. 使用 wasp-agent 来提高虚拟机工作负载密度 复制链接链接已复制到粘贴板!
wasp-agent
组件通过将交换资源分配给 worker 节点来实现内存过量使用。它还管理节点因高交换 I/O 流量或高利用率而面临风险时进行 pod 驱除。
交换资源只能分配给 Burstable
服务质量 (QoS) 类的虚拟机工作负载 (VM pod)。属于虚拟机的 Guaranteed
QoS 类和任何 QoS 类的 pod 不能交换资源。
有关 QoS 类的描述,请参阅为 Pod 配置服务质量 (Kubernetes 文档)。
在 VM 清单中使用 spec.domain.resources.requests.memory
禁用内存过量使用配置。使用 spec.domain.memory.guest
替代。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
使用
cluster-admin
角色登录到集群。 - 定义内存过量使用比率。
- 节点属于 worker 池。
wasp-agent
组件部署开放容器项目 (OCI) hook,以启用节点级别上容器的交换使用情况。低级性质要求 DaemonSet
对象具有特权。
流程
将
kubelet
服务配置为允许交换使用:使用以下示例中显示的参数创建或编辑
KubeletConfig
文件:KubeletConfig
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待 worker 节点与新配置同步:
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过创建
MachineConfig
对象来置备 swap。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为了在出现最糟糕的情况时有足够的交换空间,请确保置备的交换空间的数量最少与过量使用 RAM 相同。使用以下公式计算节点上置备的 swap 空间量:
NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)
NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如
NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1) = 16 GB * (1.5 - 1) = 16 GB * (0.5) = 8 GB
NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1) = 16 GB * (1.5 - 1) = 16 GB * (0.5) = 8 GB
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建特权服务帐户:
oc adm new-project wasp
$ oc adm new-project wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create sa -n wasp wasp
$ oc create sa -n wasp wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create clusterrolebinding wasp --clusterrole=cluster-admin --serviceaccount=wasp:wasp
$ oc create clusterrolebinding wasp --clusterrole=cluster-admin --serviceaccount=wasp:wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm policy add-scc-to-user -n wasp privileged -z wasp
$ oc adm policy add-scc-to-user -n wasp privileged -z wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待 worker 节点与新配置同步:
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,确定 wasp 代理镜像的 pull URL:
oc get csv -n openshift-cnv -l=operators.coreos.com/kubevirt-hyperconverged.openshift-cnv -ojson | jq '.items[0].spec.relatedImages[] | select(.name|test(".*wasp-agent.*")) | .image'
$ oc get csv -n openshift-cnv -l=operators.coreos.com/kubevirt-hyperconverged.openshift-cnv -ojson | jq '.items[0].spec.relatedImages[] | select(.name|test(".*wasp-agent.*")) | .image'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过创建一个
DaemonSet
对象来部署wasp-agent
,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
image
值替换为上一步中的镜像 URL
通过创建
PrometheusRule
对象来部署警报规则。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将
cluster-monitoring
标签添加到wasp
命名空间中:oc label namespace wasp openshift.io/cluster-monitoring="true"
$ oc label namespace wasp openshift.io/cluster-monitoring="true"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Web 控制台或 CLI 在 OpenShift Virtualization 中启用内存过量使用。
Web 控制台
-
在 OpenShift Container Platform web 控制台中,进入 Virtualization
Overview Settings General settings Memory density。 - 将 Enable memory density 设置为 on。
-
在 OpenShift Container Platform web 控制台中,进入 Virtualization
CLI
配置 OpenShift Virtualization 以启用更高的内存密度并设置过量分配率:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出
hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证
wasp-agent
的部署,请运行以下命令:oc rollout status ds wasp-agent -n wasp
$ oc rollout status ds wasp-agent -n wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果部署成功,则会显示以下信息:
输出示例
daemon set "wasp-agent" successfully rolled out
daemon set "wasp-agent" successfully rolled out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证是否正确置备了 swap,请完成以下步骤:
运行以下命令,查看 worker 节点列表:
oc get nodes -l node-role.kubernetes.io/worker
$ oc get nodes -l node-role.kubernetes.io/worker
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,从列表中选择节点并显示其内存用量:
oc debug node/<selected_node> -- free -m
$ oc debug node/<selected_node> -- free -m
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<selected_node>
替换为节点名称。
如果置备了交换,则
Swap:
行会显示大于零的数量。Expand 表 5.1. 输出示例 total
使用的
free
shared
buff/cache
可用
Mem:
31846
23155
1044
6014
14483
8690
Swap:
8191
2337
5854
运行以下命令验证 OpenShift Virtualization 内存过量使用配置:
oc -n openshift-cnv get HyperConverged/kubevirt-hyperconverged -o jsonpath='{.spec.higherWorkloadDensity}{"\n"}'
$ oc -n openshift-cnv get HyperConverged/kubevirt-hyperconverged -o jsonpath='{.spec.higherWorkloadDensity}{"\n"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
{"memoryOvercommitPercentage":150}
{"memoryOvercommitPercentage":150}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 返回的值必须与之前配置的值匹配。
5.5.2. 删除 wasp-agent 组件 复制链接链接已复制到粘贴板!
如果您不再需要内存过量使用,您可以从集群中删除 wasp-agent
组件和相关资源。
先决条件
-
使用
cluster-admin
角色登录到集群。 -
已安装 OpenShift CLI(
oc
)。
流程
删除
wasp-agent
DaemonSet:oc delete daemonset wasp-agent -n wasp
$ oc delete daemonset wasp-agent -n wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果部署,删除警报规则:
oc delete prometheusrule wasp-rules -n wasp
$ oc delete prometheusrule wasp-rules -n wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果没有其他资源,删除 is
p
命名空间:oc delete namespace wasp
$ oc delete namespace wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复内存过量使用配置:
oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged \ --type='json' \ -p='[{"op": "remove", "path": "/spec/higherWorkloadDensity"}]'
$ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged \ --type='json' \ -p='[{"op": "remove", "path": "/spec/higherWorkloadDensity"}]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除置备交换内存的
MachineConfig
:oc delete machineconfig 90-worker-swap
$ oc delete machineconfig 90-worker-swap
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除关联的
KubeletConfig
:oc delete kubeletconfig custom-config
$ oc delete kubeletconfig custom-config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 worker 节点协调:
oc wait mcp worker --for condition=Updated=True --timeout=-1s
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认
wasp-agent
DaemonSet 已被删除:oc get daemonset -n wasp
$ oc get daemonset -n wasp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 不应列出
wasp-agent
。确认节点上不再启用 swap:
oc debug node/<selected_node> -- free -m
$ oc debug node/<selected_node> -- free -m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
Swap:
行显示0
或没有交换空间显示为 provisioned。
5.5.3. wasp-agent 使用的 Pod 驱除条件 复制链接链接已复制到粘贴板!
当系统大量加载且节点面临风险时,wasp 代理会管理 pod 驱除。如果满足以下条件之一,则会触发驱除:
- 高交换 I/O 流量
当与交换相关的 I/O 流量过高时,会满足此条件。
状况
averageSwapInPerSecond > maxAverageSwapInPagesPerSecond && averageSwapOutPerSecond > maxAverageSwapOutPagesPerSecond
averageSwapInPerSecond > maxAverageSwapInPagesPerSecond && averageSwapOutPerSecond > maxAverageSwapOutPagesPerSecond
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,
maxAverageSwapInPagesPerSecond
和maxAverageSwapOutPagesPerSecond
设置为 1000 页。计算平均的默认时间间隔是 30 秒。- 高 swap 使用率
当交换利用率过高时满足此条件,导致当前虚拟内存用量超过因数的阈值。
MachineConfig
对象中的NODE_SWAP_SPACE
设置可能会影响这种情况。状况
nodeWorkingSet + nodeSwapUsage < totalNodeMemory + totalSwapMemory × thresholdFactor
nodeWorkingSet + nodeSwapUsage < totalNodeMemory + totalSwapMemory × thresholdFactor
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.5.3.1. 环境变量 复制链接链接已复制到粘贴板!
您可以使用以下环境变量来调整用于计算驱除条件的值:
环境变量 | 功能 |
|
设置 |
|
设置 |
|
设置用于计算高 swap 使用率的 |
| 设置计算平均交换使用量的时间间隔。 |