前两篇文章,我们分别介绍 Kubevirt 的安装、基本使用 以及 将 oVirt 虚拟机迁移到 KubeVirt,我们留了两个ToDo,一个是本地磁盘的动态分配,一个是固定 IP 的需求,本期我们先解决第一个,本地磁盘的动态分配。
使用 OpenEBS-LVM 替换 local-storage
OpenEBS-LVM 对比 local-storage,主要新增了容量限额、动态分配PV、resize 功能,本文不做过多介绍,后面会单独讲 。
创建 sc 时,注意两个点,开启卷扩展,
allowVolumeExpansion: true
,卷绑定方式选择延迟绑定,volumeBindingMode: WaitForFirstConsumer
进阶功能介绍
设置超卖比[1]
kubectl -n kubevirt edit kubevirts.kubevirt.io kubevirt
...
spec:configuration:developerConfiguration:cpuAllocationRatio: 2 # CPU 超卖2倍memoryOvercommit: 200 # 内存超卖2倍
...
示例,设置虚拟机规格为 8c16g,不声明 Request
...spec:domain:cpu:cores: 8memory:guest: 16Gi
...
创建成功后, 查看 Pod 的 Request 值,发现是设置值的1/2 ,符合预期
requests:cpu: "4"devices.kubevirt.io/kvm: "1"devices.kubevirt.io/tun: "1"devices.kubevirt.io/vhost-net: "1"ephemeral-storage: 50Mmemory: 8506Mi
登录虚拟机查看,为 8c16g,符合预期
如果声明了 Request 值,则优先走 Request 值
CPU/MEM 升配
修改 CPU/MEM 值, 重启 VM 即可
virtctl restart <vmi>
Kubevirt 也支持热升配[2],不停机,但有些限制,比如内核版本,存储读写模式等,后续实践后分享
磁盘在线扩容[3]
开启磁盘扩容功能
kubectl -n kubevirt edit kubevirts.kubevirt.io kubevirt
spec:configuration:developerConfiguration:featureGates:- ExpandDisks
查看当前数据盘大小,为500Gi
在线扩容到 600G 步骤, 手动修改关联 PVC 的大小即可, openebs-lvm 会自动扩容
...
spec:resources:requests:storage: "600Gi"
登录服务器,扩容文件系统
resize2fs /dev/vdb # ext4 文件系统,数据盘为 vdb
固定 IP、设置亲和性[4]
因为暂时还没实现固定 IP, 但是担心 虚拟机重启, IP 发生改变,对业务产生影响,所以暂时,指定 Node 进行分配 VM
从指定 的 Node 上选择 VMI IP:
# 查看 Node 分配的 block
kubectl get blockaffinities.crd.projectcalico.org
# 挑选一个 没有分配的 IP
calicoctl ipam show --ip=$(ip_addr)
# 指定 Pod IP
...
spec:template:metadata:annotations:cni.projectcalico.org/ipAddrs: '["pod-ip"]'
指定 Node 亲和性
...spec:nodeSelector:kubernetes.io/hostname: "nodename"
...
VM 完整 Yaml 文件如下:
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:labels:kubevirt.io/vm: <vmi-name>name: <vmi-name>
spec:running: falsetemplate:metadata:labels:kubevirt.io/vm: <vmi-name>annotations:cni.projectcalico.org/ipAddrs: '["pod-ip"]'spec:nodeSelector:kubernetes.io/hostname: "nodename"domain:cpu:cores: 8memory:guest: 16Gidevices:disks:- disk:bus: virtioname: datavolumedisk1-sys- disk:bus: virtioname: datavolumedisk1-datainterfaces:- name: defaultbridge: {}#resources:# requests:# memory: 8Ginetworks:- name: defaultpod: {}volumes:- dataVolume:name: demo-1-sysname: datavolumedisk1-sys- dataVolume:name: demo-1-dataname: datavolumedisk1-datadataVolumeTemplates:- metadata:name: demo-1-sysspec:storage:storageClassName: openebs-lvmaccessModes:- ReadWriteOnceresources:requests:storage: 80Gisource:http:url: <img_url>- metadata:name: demo-1-dataspec:storage:storageClassName: openebs-lvmaccessModes:- ReadWriteOnceresources:requests:storage: 500Gisource:blank: {}
参考链接:
[1] Node overcommit:https://kubevirt.io/user-guide/compute/node_overcommit/#node-overcommit
[2] CPU Hotplug:https://kubevirt.io/user-guide/compute/cpu_hotplug/#cpu-hotplug
Memory Hotplug:https://kubevirt.io/user-guide/compute/memory_hotplug/#memory-hotplug
[3] disk expansion https://kubevirt.io/user-guide/storage/disks_and_volumes/#disk-expansion
[4] Node assignment https://kubevirt.io/user-guide/compute/node_assignment/#node-assignment