5.5. 配置更高的虚拟机工作负载密度
要增加虚拟机 (VM) 的数量,您可以通过过量使用内存 (RAM) 来在集群中配置更高的虚拟机工作负载密度。
配置更高的工作负载密度只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
以下工作负载特别适用于更高的工作负载密度:
- 许多类似的工作负载
- 低使用的工作负载
虽然过度使用的内存可能会导致工作负载密度更高,但也可能会降低高使用系统的工作负载性能。
5.5.1. 使用 wasp-agent
来配置更高的虚拟机工作负载密度
wasp-agent
组件允许 OpenShift Container Platform 集群为虚拟机(VM) 工作负载分配交换资源。只有在 worker 节点上才支持交换使用量。
交换资源只能分配给 Burstable
服务质量 (QoS) 类的虚拟机工作负载 (VM pod)。属于虚拟机的 Guaranteed
QoS 类和任何 QoS 类的 pod 不能交换资源。
有关 QoS 类的描述,请参阅为 Pod 配置服务质量 (Kubernetes 文档)。
先决条件
-
oc
工具可用。 - 使用 cluster-admin 角色登录到集群。
- 定义内存 over-commit 比率。
- 节点属于 worker 池。
流程
输入以下命令来创建特权服务帐户:
$ oc adm new-project wasp
$ oc create sa -n wasp wasp
$ oc create clusterrolebinding wasp --clusterrole=cluster-admin --serviceaccount=wasp:wasp
$ oc adm policy add-scc-to-user -n wasp privileged -z wasp
注意wasp-agent
组件部署 OCI hook,以便在节点级别上为容器启用交换使用情况。低级性质要求DaemonSet
对象具有特权。通过创建
DaemonSet
对象来部署wasp-agent
,如下所示:kind: DaemonSet apiVersion: apps/v1 metadata: name: wasp-agent namespace: wasp labels: app: wasp tier: node spec: selector: matchLabels: name: wasp template: metadata: annotations: description: >- Configures swap for workloads labels: name: wasp spec: serviceAccountName: wasp hostPID: true hostUsers: true terminationGracePeriodSeconds: 5 containers: - name: wasp-agent image: >- registry.redhat.io/container-native-virtualization/wasp-agent-rhel9:v4.16 imagePullPolicy: Always env: - name: "FSROOT" value: "/host" resources: requests: cpu: 100m memory: 50M securityContext: privileged: true volumeMounts: - name: host mountPath: "/host" volumes: - name: host hostPath: path: "/" priorityClassName: system-node-critical updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 10% maxSurge: 0 status: {}
将
kubelet
服务配置为允许交换:如示例所示,创建一个
KubeletConfiguration
文件:KubeletConfiguration
文件示例apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: custom-config spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: '' # MCP #machine.openshift.io/cluster-api-machine-role: worker # machine #node-role.kubernetes.io/worker: '' # node kubeletConfig: failSwapOn: false evictionSoft: memory.available: "1Gi" evictionSoftGracePeriod: memory.available: "10s"
如果集群已使用现有的
KubeletConfiguration
文件,请将以下内容添加到spec
部分:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: custom-config # ... spec # ... kubeletConfig: evictionSoft: memory.available: 1Gi evictionSoftGracePeriod: memory.available: 1m30s failSwapOn: false
运行以下命令:
$ oc wait mcp worker --for condition=Updated=True
创建
MachineConfig
对象以置备交换,如下所示:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 90-worker-swap spec: config: ignition: version: 3.4.0 systemd: units: - contents: | [Unit] Description=Provision and enable swap ConditionFirstBoot=no [Service] Type=oneshot Environment=SWAP_SIZE_MB=5000 ExecStart=/bin/sh -c "sudo dd if=/dev/zero of=/var/tmp/swapfile count=${SWAP_SIZE_MB} bs=1M && \ sudo chmod 600 /var/tmp/swapfile && \ sudo mkswap /var/tmp/swapfile && \ sudo swapon /var/tmp/swapfile && \ free -h && \ sudo systemctl set-property --runtime system.slice MemorySwapMax=0 IODeviceLatencyTargetSec=\"/ 50ms\"" [Install] RequiredBy=kubelet-dependencies.target enabled: true name: swap-provision.service
为了在出现最糟糕的情况时有足够的交换空间,请确保置备的交换空间的数量最少与过量使用 RAM 相同。使用以下公式计算节点上置备的交换空间量:
NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)
Example:
NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1) = 16 GB * (1.5 - 1) = 16 GB * (0.5) = 8 GB
按如下方式部署警报规则:
apiVersion: monitoring.openshift.io/v1 kind: AlertingRule metadata: name: wasp-alerts namespace: openshift-monitoring spec: groups: - name: wasp.rules rules: - alert: NodeSwapping annotations: description: Node {{ $labels.instance }} is swapping at a rate of {{ printf "%.2f" $value }} MB/s runbook_url: https://github.com/openshift-virtualization/wasp-agent/tree/main/runbooks/alerts/NodeSwapping.md summary: A node is swapping memory pages expr: | # In MB/s irate(node_memory_SwapFree_bytes{job="node-exporter"}[5m]) / 1024^2 > 0 for: 1m labels: severity: critical
使用 OpenShift Container Platform Web 控制台或编辑 HyperConverged 自定义资源 (CR) 文件,将 OpenShift Virtualization 配置为使用内存过量使用,如下例所示。
Example:
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: higherWorkloadDensity: memoryOvercommitPercentage: 150
输入以下命令将所有配置应用到集群中的计算节点:
$ oc patch --type=merge \ -f <../manifests/hco-set-memory-overcommit.yaml> \ --patch-file <../manifests/hco-set-memory-overcommit.yaml>
注意应用所有配置后,交换功能仅在所有
MachineConfigPool
rollouts 完成后完全可用。
验证
要验证
wasp-agent
的部署,请运行以下命令:$ oc rollout status ds wasp-agent -n wasp
如果部署成功,则会显示以下信息:
daemon set "wasp-agent" successfully rolled out
要验证是否正确置备了 swap,请执行以下操作:
运行以下命令:
$ oc get nodes -l node-role.kubernetes.io/worker
从提供的列表中选择节点并运行以下命令:
$ oc debug node/<selected-node> -- free -m
如果正确置备了 swap,则会显示大于零的数量,如下所示:
total
使用的
free
shared
buff/cache
可用
Mem:
31846
23155
1044
6014
14483
8690
Swap:
8191
2337
5854
运行以下命令验证 OpenShift Virtualization 内存过量使用配置:
$ oc get -n openshift-cnv HyperConverged kubevirt-hyperconverged -o jsonpath="{.spec.higherWorkloadDensity.memoryOvercommitPercentage}" 150
返回的值(如
150
)必须与之前配置的值匹配。