5.7. 配置更高的虚拟机工作负载密度
您可以通过过量使用内存(RAM)来增加节点上的虚拟机(VM)的数量。在以下情况下,增加虚拟机工作负载密度非常有用:
- 您有许多类似的工作负载。
- 您有没有被充分利用的工作负载。
内存过量使用可能会在高度使用的系统中降低工作负载性能。
5.7.1. 使用 wasp-agent 来提高虚拟机工作负载密度 复制链接链接已复制到粘贴板!
wasp-agent 组件通过将交换资源分配给 worker 节点来实现内存过量使用。
如果在首次创建 HyperConverged 自定义资源(CR)时,如果 memoryOvercommitPercentage 设为 100,则会自动部署 wasp-agent 组件。
交换资源只能分配给 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 对象具有特权。
流程
通过创建
MachineConfig对象来置备 swap:使用以下示例中显示的参数创建
MachineConfig文件:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 90-worker-swap spec: config: ignition: version: 3.5.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,YXBpVmVyc2lvbjoga3ViZWxldC5jb25maWcuazhzLmlvL3YxYmV0YTEKa2luZDogS3ViZWxldENvbmZpZ3VyYXRpb24KZmFpbFN3YXBPbjogZmFsc2UK mode: 420 overwrite: true path: /etc/openshift/kubelet.conf.d/90-swap.conf systemd: units: - contents: | [Unit] Description=Enable swap ConditionFirstBoot=no ConditionPathExists=/var/tmp/swapfile [Service] Type=oneshot ExecStart=/bin/sh -c "sudo swapon /var/tmp/swapfile" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: swap-enable.service - contents: | [Unit] Description=Provision and enable swap ConditionFirstBoot=no ConditionPathExists=!/var/tmp/swapfile [Service] Type=oneshot Environment=SWAP_SIZE_MB=5000 ExecStart=/bin/sh -c "sudo fallocate -l ${SWAP_SIZE_MB}M /var/tmp/swapfile && \ sudo chmod 600 /var/tmp/swapfile && \ sudo mkswap /var/tmp/swapfile && \ sudo swapon /var/tmp/swapfile && \ free -h" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: swap-provision.service - contents: | [Unit] Description=Restrict swap for system slice ConditionFirstBoot=no [Service] Type=oneshot ExecStart=/bin/sh -c "sudo systemctl set-property --runtime system.slice MemorySwapMax=0 IODeviceLatencyTargetSec=\"/ 50ms\"" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: cgroup-system-slice-config.service为了在出现最糟糕的情况时有足够的交换空间,请确保置备的交换空间的数量最少与过量使用 RAM 相同。使用以下公式计算节点上置备的 swap 空间量:
NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)示例:
NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1) = 16 GB * (1.5 - 1) = 16 GB * (0.5) = 8 GB运行以下命令,等待 worker 节点与新配置同步:
$ oc wait mcp worker --for condition=Updated=True --timeout=-1s使用 Web 控制台或 CLI 在 OpenShift Virtualization 中启用内存过量使用。
Web 控制台
-
在 OpenShift Container Platform web 控制台中,进入 Virtualization
Overview Settings General settings Memory density。 - 将配置 内存密度 设置为 on。
- 扩展 当前内存密度 行。
通过移动 Requested 内存密度滑块来设置密度 的值。您可以以 25% 的增长将密度从 100% 增加到 400%。
Memory density 字段显示实际和请求的值。
- 点击 Save。
-
在 OpenShift Container Platform web 控制台中,进入 Virtualization
CLI
配置 OpenShift Virtualization 以启用更高的内存密度并设置过量分配率:
$ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged --type='json' -p='[ \ { \ "op": "replace", \ "path": "/spec/higherWorkloadDensity/memoryOvercommitPercentage", \ "value": 150 \ } \ ]'成功输出:
hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
验证
要验证
wasp-agent的部署,请运行以下命令:$ oc rollout status ds wasp-agent -n openshift-cnv如果部署成功,则会显示以下信息:
输出示例:
daemon set "wasp-agent" successfully rolled out要验证是否正确置备了 swap,请完成以下步骤:
运行以下命令,查看 worker 节点列表:
$ oc get nodes -l node-role.kubernetes.io/worker运行以下命令,从列表中选择节点并显示其内存用量:
$ oc debug node/<selected_node> -- free -m将
<selected_node>替换为节点名称。如果置备了交换,则
Swap:行会显示大于零的数量。Expand 表 5.2. 输出示例 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"}'输出示例:
{"memoryOvercommitPercentage":150}返回的值必须与之前配置的值匹配。