1.介绍:

         Kubevirt 是 Redhat 开源一套以容器方式运行虚拟机的项目,通过 kubernetes 云原生来管理虚拟机生命周期。

        KubeVirt是一个kubernetes插件,在调度容器之余也可以调度传统的虚拟机。它通过使用自定义资源(CRD)和其它 Kubernetes 功能来无缝扩展现有的集群,以提供一组可用于管理虚拟机的虚拟化的API。

2.kubevirt架构设计:

kubevirt主要实现了下面几种资源,以实现对虚拟机的管理:

  • VirtualMachineInstance(VMI):类似于kubernetes Pod,是管理虚拟机的最小资源。一个VirtualMachineInstance对象即表示一台正在运行的虚拟机实例,包含一个虚拟机所需要的各种配置。
  • VirtualMachine(VM):为集群内的VirtualMachineInstance提供管理功能,例如开机、关机、重启虚拟机,确保虚拟机实例的启动状态,与虚拟机实例是1:1的关系,类似与spec.replica为1的StatefulSet。
  • VirtualMachineInstanceReplicaSet:类似ReplicaSet,可以启动指定数量的VirtualMachineInstance,并且保证指定数量的VirtualMachineInstance运行,可以配置HPA。

Kubevirt的整体架构:

kubernetes部署zabbix kubevirt部署_虚拟化

 简化版:

kubernetes部署zabbix kubevirt部署_kubernetes_02

 3.磁盘和卷

        虚拟机镜像(磁盘)是启动虚拟机必不可少的部分,KubeVirt 中提供多种方式的虚拟机磁盘,虚拟机镜像(磁盘)使用方式非常灵活。这里列出几种比较常用的:

  • PersistentVolumeClaim : 使用 PVC 做为后端存储,适用于数据持久化,即在虚拟机重启或者重建后数据依旧存在。使用的 PV 类型可以是 block 和 filesystem,使用 filesystem 时,会使用 PVC 上的 /disk.img,格式为 RAW 格式的文件作为硬盘。block 模式时,使用 block volume 直接作为原始块设备提供给虚拟机。
  • ephemeral : 基于后端存储在本地做一个写时复制(COW)镜像层,所有的写入都在本地存储的镜像中,VM 实例停止时写入层就被删除,后端存储上的镜像不变化。
  • containerDisk : 基于 scratch 构建的一个 docker image,镜像中包含虚拟机启动所需要的虚拟机镜像,可以将该 docker image push 到 registry,使用时从 registry 拉取镜像,直接使用 containerDisk 作为 VMI 磁盘,数据是无法持久化的。
  • hostDisk : 使用节点上的磁盘镜像,类似于 hostpath,也可以在初始化时创建空的镜像。
  • dataVolume : 提供在虚拟机启动流程中自动将虚拟机磁盘导入 pvc 的功能,在不使用 DataVolume 的情况下,用户必须先准备带有磁盘映像的 pvc,然后再将其分配给 VM 或 VMI。dataVolume 拉取镜像的来源可以时 http,对象存储,另一块 PVC 等。

4.部署kubevirt

        安装前提已经安装好kubernetes集群。如果需要安装kubernetes请参考

4.1 安装libvirt和qemu软件包:

# yum install -y qemu-kvm libvirt virt-install bridge-utils
查看节点是否支持kvm硬件辅助虚拟化:
# virt-host-validate qemu
  QEMU: Checking for hardware virtualization                                 : PASS
   QEMU: Checking if device /dev/kvm exists                                   : PASS
   QEMU: Checking if device /dev/kvm is accessible                            : PASS
   QEMU: Checking if device /dev/vhost-net exists                             : PASS
   QEMU: Checking if device /dev/net/tun exists                               : PASS
   QEMU: Checking for cgroup 'memory' controller support                      : PASS
   QEMU: Checking for cgroup 'memory' controller mount-point                  : PASS
   QEMU: Checking for cgroup 'cpu' controller support                         : PASS
   QEMU: Checking for cgroup 'cpu' controller mount-point                     : PASS
   QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
   QEMU: Checking for cgroup 'cpuacct' controller mount-point                 : PASS
   QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
   QEMU: Checking for cgroup 'cpuset' controller mount-point                  : PASS
   QEMU: Checking for cgroup 'devices' controller support                     : PASS
   QEMU: Checking for cgroup 'devices' controller mount-point                 : PASS
   QEMU: Checking for cgroup 'blkio' controller support                       : PASS
   QEMU: Checking for cgroup 'blkio' controller mount-point                   : PASS
   QEMU: Checking for device assignment IOMMU support                         : PASS
   QEMU: Checking if IOMMU is enabled by kernel                               : WARN (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)

修改物理内核参数,解决WARN问题:

# vim /boot/efi/EFI/centos/grub.cfg

#添加 intel_iommu=on

kubernetes部署zabbix kubevirt部署_虚拟化_03

# reboot
方法二:
# vim /etc/default/grub
添加:
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on"
# grub2-mkconfig -o /boot/grub2/grub.cfg
验证:
# dmesg | grep -e DMAR | grep -i iommu
 [    0.000000] DMAR: IOMMU enabled
 # virt-host-validate qemu
   QEMU: Checking for hardware virtualization                                 : PASS
   QEMU: Checking if device /dev/kvm exists                                   : PASS
   QEMU: Checking if device /dev/kvm is accessible                            : PASS
   QEMU: Checking if device /dev/vhost-net exists                             : PASS
   QEMU: Checking if device /dev/net/tun exists                               : PASS
   QEMU: Checking for cgroup 'memory' controller support                      : PASS
   QEMU: Checking for cgroup 'memory' controller mount-point                  : PASS
   QEMU: Checking for cgroup 'cpu' controller support                         : PASS
   QEMU: Checking for cgroup 'cpu' controller mount-point                     : PASS
   QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
   QEMU: Checking for cgroup 'cpuacct' controller mount-point                 : PASS
   QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
   QEMU: Checking for cgroup 'cpuset' controller mount-point                  : PASS
   QEMU: Checking for cgroup 'devices' controller support                     : PASS
   QEMU: Checking for cgroup 'devices' controller mount-point                 : PASS
   QEMU: Checking for cgroup 'blkio' controller support                       : PASS
   QEMU: Checking for cgroup 'blkio' controller mount-point                   : PASS
   QEMU: Checking for device assignment IOMMU support                         : PASS
   QEMU: Checking if IOMMU is enabled by kernel                               : PASS

4.2 解决不支持虚拟化问题:

如果硬件虚拟化不可用或者想用虚拟机来安装kubevirt,则可以通过在kubeVirt CR中设置启动:

spec.configuration.developerConfiguration.useEmulation true

# kubectl edit -n kubevirt kubevirt kubevirt
添加如下内容:
spec: ...
     configuration:
         developerConfiguration:
             useEmulation: true

4.3 安装kubevirt

ply -f kubevirt-operator.yaml
# kubectl apply -f kubevirt-cr.yaml
安装最新版本:
# export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml
# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml
查看部署结果:
# kubectl get pod -n kubevirt 
 NAME                               READY   STATUS    RESTARTS   AGE
 virt-api-6677fb87c6-cqmsh          1/1     Running   0          15m
 virt-api-6677fb87c6-hsh9k          1/1     Running   0          15m
 virt-controller-5dd87c95c4-5zg76   1/1     Running   0          14m
 virt-controller-5dd87c95c4-dwh2z   1/1     Running   0          14m
 virt-handler-7x4wc                 1/1     Running   0          14m
 virt-operator-85b8997768-f74zp     1/1     Running   0          88m
 virt-operator-85b8997768-nw7jr     1/1     Running   0          88m

4.4 安装CDI

CDI(Containerized Data Importer):用于使用PVC作为kubevirt VM磁盘功能。

# kubectl apply -f cdi-operator.yaml
# kubectl apply -f cdi-cr.yaml 
查看部署结果:
# kubectl get pod -n cdi
 NAME                               READY   STATUS    RESTARTS   AGE
 cdi-apiserver-5dc575cc5b-tw5r5     1/1     Running   0          4m35s
 cdi-deployment-596b69f4bd-hhdd5    1/1     Running   0          4m28s
 cdi-operator-59fd74c5df-nlqpj      1/1     Running   0          6m1s
 cdi-uploadproxy-6b46f965f6-5vk9l   1/1     Running   0          4m22s安装最新版本:
# export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases |  grep -o "v[0-9]\.[0-9]*\.[0-9]*"| head -1)
# kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
# kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml

4.5 virtctl命令部署

virtctl是kubevirt一个命令行工具
# export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
# curl -L -o /usr/local/bin/virtctl https://github.com/kubevirt/kubevirt/releases/download/$VERSION/virtctl-$VERSION-linux-amd64
 #  chmod +x /usr/local/bin/virtctl

4.6 安装vnc

安装vnc,为后续安装操作做准备:

#  yum install -y tigervnc