一、简介
这里介绍的虚拟机资源超卖指的是内存和CPU
kubevirt 创建的虚拟机采用Kubernetes通过Pod的Resource requests进行资源申请
通过之前KubeVirt的介绍,我们知道kubevirt创建的虚拟机会通过pod进行管理,即创建一个虚拟机就会生成一个pod。因此虚拟机的资源会体现在Pod的Resource requests上。我们知道,k8s node资源有限,会随着Resource requests的累加而减少。因此实现超卖的方案就是Pod的Resource requests小于虚拟机实际申请的资源小于。这样在虚拟机就能获取更多的资源而不被k8s记录,以便申请更多的虚拟机。
举个例子,假设设置CPU和内存都超卖200%,物理机配置为4C16G。这里忽略系统占用及k8s占用,如果创建1C4G的虚拟机最多可以创建4台,开启超卖后即可创建8台虚拟机。
二、设置超卖
kubectl edit kubevirt kubevirt -n kubevirt
...
spec:
certificateRotateStrategy: {}
configuration:
developerConfiguration:
cpuAllocationRatio: 20 # CPU超卖20倍
featureGates:
- HostDisk
- HardDisk
- DataVolumes
memoryOvercommit: 400 # 内存超卖4倍,百分比制
...
- cpuAllocationRatio:CPU超卖,如上设置为20,即vm设置20核,实际Resource requests为1核
- memoryOvercommit: 内存超卖,如上设置400,即vm设置4G,实际Resource requests为1G
三、创建虚拟机
...
spec:
domain:
cpu:
cores: 60
memory:
guest: 16Gi
devices:
disks:
- disk:
bus: virtio
name: cdromiso
...
注意:spec.template.domain.resources.requests无需指定,创建出的虚拟机会按照超卖设置进行自动配置,如果此处设置,会按照设置的requests结果进行计算,virt-launcher Pod将使用这个requests来请求k8s资源,这样就会不使用上面配置的比例。一般情况不需要再这里指定requests,KubeVirt使用比例计算出requests的资源量。
四、验证超卖成功
按照上面的我们设置vm cpu为60核内存为16G,创建虚拟机
登录虚拟机查看虚拟机内存及CPU
查看Resource requests
五、VM内既设置虚拟机真实资源又设置resources.requests
...
spec:
domain:
cpu:
cores: 40
memory:
guest: 16Gi
resources:
requests:
cpu: "3"
memory: 8Gi
...
可以看到Resource requests并未按照超卖比例计算,而使用VM声明的requests
这里需要注意,虽然requests可以随意设置,大于VM申请资源时,此设置即为实际POD的request,如果小于虚拟机设置的资源,创建后会根据虚拟机真实占用自动修改此值。
如果设置limits,需要注意limnts值小于设置的值,那么会报如下错误:
The request is invalid: spec.template.spec.domain.memory.guest: spec.template.spec.domain.memory.guest '16Gi' must be equal to or less than the memory limit spec.template.spec.domain.resources.limits.memory '1Gi'