1、Kubevirt 虛機 CPU 綁定配置
1.1 為 QEMU 模擬器分配獨立 CPU 配置
在 KVM 虛擬機中,KVM 負責 CPU 和內存的虛擬化,不能模擬其他設備,對于 IO 設備(網卡、磁盤)的模擬,必須用到 QEMU 模擬器,但 QEMU 在模擬 IO 操作任務時,也要消耗 CPU 資源。因為 kubevirt 中 KVM 和 QEMU 默認跑在同一個 pod 中,所以他們會使用相同的 vCPU, 這樣對 VMI 的性能會有影響。為了提供更好的性能,kubevirt 又額外為 QEMU 分配了一個 cpu ,這樣模擬器和 VMI 所使用的 vCPU 相對獨立。
開啟這個功能需要在 VMI 的 yaml 配置文件 spec.domain.cpu 中添加 isolateEmulatorThread: true,并且需要和 dedicatedCpuPlacement: true 一起用。
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
spec:
domain:
cpu:
dedicatedCpuPlacement: true
isolateEmulatorThread: true
resources:
limits:
cpu: 2
memory: 2Gi
|
1.2 為支持CPU綁定的 node 節點添加標簽
在 yaml 配置文件里做了配置還不夠,要想能調度到 node上,還要給支持 CPU 綁定的 node 手動添加標簽 cpumanager=true
# 手動添加標簽 kubectl label node [node_name] cpumanager=true # 查看標簽 kubectl describe nodes |
1.3 配置 Kubevirt 識別支持 CPU 綁定的 node
為了讓添加了 CPU manager 標簽的 node 節點能被自動識別,還需要在 kubevirt-config 的 config map feature-gates下添加 CPUManager,或者編輯已存在的 kubevirt-config:
kubectl edit configmap kubevirt-config -n kubevirt
# 舉例:
apiVersion: v1
kind: ConfigMap
metadata:
name: kubevirt-config
namespace: kubevirt
labels:
kubevirt.io: ""
data:
feature-gates: "DataVolumes,CPUManager"
|
1.4 Kubevirt 中使用 Sidecar 容器
Kubevirt 有時用 Sidecar 容器(伴生容器)來為 VMI 掛載磁盤,要想使用 Sidecar 伴生容器,kubevirt 需要在 kubevirt-config 的 ConfigMap feature-gates下添加 Sidecar 配置。
... data: feature-gates: "DataVolumes,CPUManager,Sidecar" |
伴生容器默認的資源是:CPU:200m, Memory:64M
因為 CPU 資源默認沒有配成整數,所以 CPU manager 不會對伴生容器的 CPU 做綁定。
二、驗證
2.1 編輯 VMI 的 yaml 配置文件
# vim vmi-cpu-pin-vm.yaml
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
metadata:
name: vmi-cpu-pin
spec:
terminationGracePeriodSeconds: 5
domain:
cpu:
sockets: 2
cores: 1
threads: 1
dedicatedCpuPlacement: true
isolateEmulatorThread: true
resources:
requests:
memory: 1024M
devices:
disks:
- name: containerdisk
disk:
bus: virtio
volumes:
- name: containerdisk
containerDisk:
image: harbor.ctyun.dev:1443/kv-os/centos7-genericcloud:v1907
|
Kubevirt 虛機的 vCPU 數是用戶設置的 spec.domain.cpu (sockets, cores, threads) 或 spec.domain.resources.[requests/limits].cpu 的值。
如果 spec.domain.cpu 設置了,vCPU 數是 sockets * cores * threads,如果 spec.domain.cpu 沒設置,vCPU 數則取 spec.domain.resources.requests.cpu 或 spec.domain.resources.limits.cpu 的值。
提示:
(1)spec.domain.cpu 和 spec.domain.resources.[requests/limits].cpu 不需要同時設置;
(2)如果設置了spec.domain.resources.[requests/limits].cpu,spec.domain.resources.requests.cpu 和 spec.domain.resources.limits.cpu 的值必須一致;
(3)對于多 CPU 的情況,建議使用 spec.domain.cpu.sockets 代替 spec.domain.cpu.cores,性能會更好。
2.2 創建 VMI
# 創建 [ecf@server19 kubevirt]$ kubectl create -f vmi-cpu-pin.yaml virtualmachineinstance.kubevirt.io/vmi-cpu-pin created # 查看 [ecf@server19 kubevirt]$ kubectl get vmi NAME AGE PHASE IP NODENAME dcache 8d Running 10.244.0.44/24 server19 testvm 10d Running 10.244.0.17 server19 vmi-cpu-pin 23s Running 10.244.0.210 server19 |
2.3 進入 libvirt 容器查看 CPU 綁定情況
[ecf@server19 kubevirt]$ docker ps -a |grep vmi-cpu-pin
96e316cafadc a937ac91ab35 "/usr/bin/container-…" 50 seconds ago Up 44 seconds k8s_volumecontainerdisk_virt-launcher-vmi-cpu-pin-mgq6r_default_038ba55f-ced5-4d91-ad82-dbd7fcdc6475_0
6576d9f09468 c6672d186608 "/usr/bin/virt-launc…" 50 seconds ago Up 50 seconds k8s_compute_virt-launcher-vmi-cpu-pin-mgq6r_default_038ba55f-ced5-4d91-ad82-dbd7fcdc6475_0
c822eda00e62 k8s.gcr.io/pause:3.1 "/pause" 51 seconds ago Up 50 seconds k8s_POD_virt-launcher-vmi-cpu-pin-mgq6r_default_038ba55f-ced5-4d91-ad82-dbd7fcdc6475_0
# 進入容器
[ecf@server19 kubevirt]$ docker exec -it -u root k8s_compute_virt-launcher-vmi-cpu-pin-mgq6r_default_038ba55f-ced5-4d91-ad82-dbd7fcdc6475_0 /bin/bash
[root@vmi-cpu-pin /]# virsh list
Id Name State
-------------------------------------
1 default_vmi-cpu-pin running
# libvirt 容器內查看虛機 xml 文件
[root@vmi-cpu-pin /]# virsh dumpxml 1 |more
<domain type='kvm' id='1'>
<name>default_vmi-cpu-pin</name>
<uuid>b0a47815-bc43-4c45-bd43-0a1bb9441b62</uuid>
<metadata>
<kubevirt xmlns="//kubevirt.io">
<uid>1307155b-05eb-4685-8a59-2eb39d1934aa</uid>
<graceperiod>
<deletionGracePeriodSeconds>5</deletionGracePeriodSeconds>
</graceperiod>
</kubevirt>
</metadata>
<memory unit='KiB'>1000448</memory>
<currentMemory unit='KiB'>1000448</currentMemory>
<vcpu placement='static'>2</vcpu>
<iothreads>1</iothreads>
<cputune>
<vcpupin vcpu='0' cpuset='0'/>
<vcpupin vcpu='1' cpuset='1'/>
<emulatorpin cpuset='23'/>
</cputune>
|
2.4 查看 VMI 的 QoS 類
[ecf@server19 kubevirt]$ kubectl describe vmi vmi-cpu-pin
Name: vmi-cpu-pin
Namespace: default
Labels: kubevirt.io/nodeName=server19
Annotations: kubevirt.io/latest-observed-api-version: v1alpha3
kubevirt.io/storage-observed-api-version: v1alpha3
API Version: kubevirt.io/v1alpha3
Kind: VirtualMachineInstance
......
Node Name: server19
Phase: Running
Qos Class: Guaranteed
Events: <none>
|