KubeVirt虚拟机资源超卖

一、简介

这里介绍的虚拟机资源超卖指的是内存和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'

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code