跳转至

0.kubevirt install

kubevirt安装

KubeVirt是Kubernetes的一个虚拟化插件。官方安装文档

配置清单

  • 主机列表
主机名 OS 内核 管理网(NAT-eth0) 业务网(仅主机-eth1) 存储网(LAN区段-eth2) 默认网关 硬件配置
ha01 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.238/24 192.168.61.238/24 10.168.61.238/24 192.168.59.2 1C2G 1*200GB
ha02 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.239/24 192.168.61.239/24 10.168.61.239/24 192.168.59.2 1C2G 1*200GB
test-kubevirt.demo.com - - 192.168.59.240/24 - - -
k8s01/ceph01 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.241/24 192.168.61.241/24 10.168.61.241/24 192.168.59.2 4C12G 2*300GB
k8s02/ceph02 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.242/24 192.168.61.242/24 10.168.61.242/24 192.168.59.2 4C12G 2*300GB
k8s03/ceph03 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.243/24 192.168.61.243/24 10.168.61.243/24 192.168.59.2 4C12G 2*300GB
k8s04 openEuler release 22.03 (LTS-SP1) 5.10.0-136.12.0.86.oe2203sp1.x86_64 192.168.59.244/24 192.168.61.244/24 10.168.61.244/24 192.168.59.2 4C12G 2*300GB
registry.demo.com CentOS Linux release 7.9.2009 5.4.225-1.el7.elrepo.x86_64 192.168.59.251/24 192.168.61.251/24 10.168.61.251/24 192.168.59.2 2C6G 1*300GB

Pod和Service网络规划: POD网络:12.244.0.0/16; Service网络:12.96.0.0/12

  • 主要软件清单
名称 版本 来源
docker 20.10.23 github
cri-containerd 1.7.2 github
docker-compose v2.18.1 github
harbor v2.8.1-offline github
ceph 17.2.7 quincy(stable) quay.io
haproxy haproxy-2.6.6-9.oe2203sp1.x86_64 yum源
keepalived keepalived-2.2.4-2.oe2203sp1.x86_64 yum源
kubeadm kubeadm-1.27.6-0.x86_64 本地编译
kubelet kubelet-1.27.6-0.x86_64 yum源
kubectl kubectl-1.27.6-0.x86_64 yum源
kube-ovn v1.11.13 github
multus-cni v3.9.2-thick github
metallb v0.13.12 github
ceph-csi v3.9.0 github
external-snapshotter v6.3.3 github
kubevirt v1.1.1 github
cdi v1.58.1 github
kubevirt-manager 1.3.1 github
kube-prometheus release-0.13 github

k8s高可用拓扑图

topological.png

组网规划

network.png

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
# HA
192.168.59.238 ha01
192.168.59.239 ha02
192.168.59.240 test-kubevirt.demo.com

# public network
192.168.61.241 ceph01
192.168.61.242 ceph02
192.168.61.243 ceph03

# cluster network
10.168.61.241 ceph01-cl
10.168.61.242 ceph02-cl
10.168.61.243 ceph03-cl

# manage network 
# k8s eth0
192.168.59.241 k8s01
192.168.59.242 k8s02
192.168.59.243 k8s03
192.168.59.244 k8s04
# rgw
192.168.61.241 rgw.testgw images.demo.com dl.demo.com
# harbor
192.168.59.251 harbor registry.demo.com

安装前提条件

  • 已有本地harbor镜像仓库【可选】。
  • 已安装好ceph,能为kubernetes提供持久化的块存储,参考0-ceph-quincy部署.md【必须】。
  • 已安装好kubernetes集群,参考0-k8s-1.27.6-高可用部署.md【必须】。
  • kubernetes 的apiserver 已开启了 --allow-privileged=true,默认已开启【必须】。
  • 有 kubectl 工具【必须】。

支持的容器运行时Container Runtime

  • docker
  • crio(with runv)
  • 其他不使用虚拟化特性的容器运行时也应该也支持,只是没有经过测试。

硬件虚拟化支持

  • 使用virt-host-validate命令来确保你的主机能够运行虚拟化工作负载(该命令需要安装libvirt-client)
    # yum -y install libvirt-client
    # 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
    ...
    
  • 如果cpu不支持虚拟化,则可以使用模拟虚拟化 模拟虚拟化
    kubectl edit kubevirt -n kubevirt 
    
    spec:
      configuration:
        developerConfiguration:
          useEmulation: true
    
  • 开启IOMMU(生产环境需要使用vGPU节点开启,实验环境可忽略该步骤)
    ## 启用 VT-d 的iommu功能和SR-IOV
    # vi /etc/default/grub 
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=vg00/root rd.lvm.lv=vg00/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc"
    GRUB_DISABLE_RECOVERY="true"
    
    
    ## 注:如果是amd的cpu,则需要修改成 amd_iommu=on
    
    ## 更新grub并重启生效
    # grub2-mkconfig -o /boot/grub2/grub.cfg
    # reboot
    
    ## 如果系统是UEFI启动,则要执行以下命令(在这折腾了半天功夫)
    # grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    # reboot
    ## 检查是否生效
    #cat /proc/cmdline 
    BOOT_IMAGE=/vmlinuz-3.10.0-1160.59.1.el7.x86_64 root=/dev/mapper/vg00-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=vg00/root rd.lvm.lv=vg00/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc
    
    ## 注:启用iommu和SR-IOV功能需要重启!另外,还需要确认已经在服务器BIOS中开启 VT和SR-IOV
    

在kubernetes中安装kubevirt

建议 为保证安装过程丝滑,建议先搭建本地harbor镜像仓库,然后将依赖到的镜像下载到本地私有镜像仓库中,避免安装过程中镜像拉取失败或安装时间过长。

# wget https://github.com/kubevirt/kubevirt/releases/download/v1.1.1/kubevirt-operator.yaml
# wget https://github.com/kubevirt/kubevirt/releases/download/v1.1.1/kubevirt-cr.yaml
# wget https://github.com/kubevirt/kubevirt/releases/download/v1.1.1/virtctl-v1.1.1-linux-amd64
- 修改kubevirt-operator.yaml,只需要修改镜像地址为本地harbor镜像仓库地址,修改好后,执行安装。
# kubectl apply -f kubevirt-operator.yaml

  • 修改kubevirt-cr.yaml,具体修改内容可参考修改后的kubevirt-cr.yaml, 新增的相关属性在feature_gates特性开关。修改后,执行安装:
    # kubectl apply -f kubevirt-cr.yaml
    
    ## 等待所有 KubeVirt 组件都启动,如果提前下载好了镜像,约1分钟就可就绪
    # kubectl -n kubevirt wait kv kubevirt --for condition=Available
    
  • 安装涉及到的镜像列表:
    quay.io/kubevirt/virt-api:v1.1.1
    quay.io/kubevirt/virt-controller:v1.1.1
    quay.io/kubevirt/virt-handler:v1.1.1
    quay.io/kubevirt/virt-launcher:v1.1.1
    quay.io/kubevirt/virt-operator:v1.1.1
    quay.io/kubevirt/virt-exportproxy:v1.1.1
    quay.io/kubevirt/conformance:v1.1.1
    
    上述镜像可正常拉取,无需科学上网,可从红帽镜像仓库检索拉取。
  • 检查kubevirt是否部署成功
    # kubectl get pods -n kubevirt
    NAME                                READY   STATUS    RESTARTS   AGE
    virt-api-5467f666c8-tdd5m           1/1     Running   0          3m46s
    virt-api-5467f666c8-vdz8q           1/1     Running   0          3m46s
    virt-controller-6dd68f7489-pn6q8    1/1     Running   0          3m21s
    virt-controller-6dd68f7489-v9gmh    1/1     Running   0          3m21s
    virt-exportproxy-55794c5496-jw5zm   1/1     Running   0          3m21s
    virt-exportproxy-55794c5496-ztt4r   1/1     Running   0          3m21s
    virt-handler-2b4zb                  1/1     Running   0          3m21s
    virt-handler-brwbm                  1/1     Running   0          3m21s
    virt-operator-7fbd96fb78-hzmjp      1/1     Running   0          8m59s
    virt-operator-7fbd96fb78-zkxcl      1/1     Running   0          8m59s
    
  • 将virtctl命令拷贝到/usr/bin
    # mv virtctl-v1.1.1-linux-amd64 /usr/bin/virtctl
    # chmod +x /usr/bin/virtctl
    

镜像上传服务 Containerized-Data-Importer 安装

Containerized-Data-Importer(CDI)是kubernetes的持久化存储管理插件,它的主要目标是提供一种声明式的方式来为Kubevirt虚拟机在PVC上构建虚拟机镜像(磁盘)。 CDI 与Kubernetes 资源一起工作并且与存储设备无关, 虽然它的主要是为 Kubevirt 构建磁盘映像,但它在 Kubevirt 之外也很有用,可用于数据初始化 Kubernetes 卷。

CDI安装

# wget https://github.com/kubevirt/containerized-data-importer/releases/download/v1.58.1/cdi-operator.yaml
# wget https://github.com/kubevirt/containerized-data-importer/releases/download/v1.58.1/cdi-cr.yaml
- 修改cdi-operator.yaml,只需要修改镜像地址为本地harbor镜像仓库地址。修改好后,执行安装
# kubectl apply -f cdi-operator.yaml
注意 cdi-operator.yaml文件中包括cdi相关的所有镜像的地址,不是在cdi-cr.yaml中指定镜像仓库的。

  • 修改cdi-cr.yaml,具体修改内容可参考修改后的cdi-cr.yaml,修改后,执行安装:
    # kubectl apply -f cdi-cr.yaml
    
  • 安装涉及到的镜像列表:
    quay.io/kubevirt/cdi-operator:v1.58.1
    quay.io/kubevirt/cdi-controller:v1.58.1
    quay.io/kubevirt/cdi-uploadproxy:v1.58.1
    quay.io/kubevirt/kubevirt/cdi-apiserver:v1.58.1
    quay.io/kubevirt/cdi-importer:v1.58.1
    quay.io/kubevirt/cdi-uploadserver:v1.58.1
    quay.io/kubevirt/cdi-cloner:v1.58.1
    
    上述镜像可正常拉取,无需科学上网。

安装ceph-csi

ceph-csi目前最新的版本是3.10.1,此处选择ceph-csi-3.9,支持的k8s版是:v1.25, v1.26, v1.27

ceph-csi的版本要与ceph的版本对应,具体支持矩阵

在k8s集成外部ceph时,有对应ceph-csi的yaml,需要修改集群fsid、clusterID、monitors、mon_host等。修改好执行yaml。

# cd ceph-csi-3.9 
# kubectl apply -f ceph-conf.yaml 

# cd rbd 
# kubectl apply -f .

## 创建pvc进行测试,如果pvc状态是Bound,则说明安装成功。
# cd test 
# kubectl apply -f .
# kubectl get pvc
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
test-pvc-hdd   Bound    pvc-a04fe5c9-c51a-4fef-a945-65fe31264469   15Gi       RWX            ceph-hdd-block   6s
安装涉及到的镜像:
quay.io/cephcsi/cephcsi:v3.9.0
registry.cn-hangzhou.aliyuncs.com/google_containers/csi-attacher:v4.3.0
registry.cn-hangzhou.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.8.0
registry.cn-hangzhou.aliyuncs.com/google_containers/csi-provisioner:v3.5.0
registry.cn-hangzhou.aliyuncs.com/google_containers/csi-resizer:v1.8.0
registry.cn-hangzhou.aliyuncs.com/google_containers/csi-snapshotter:v6.2.2

安装卷快照

卷快照程序external-snapshotter包含了3部分:卷快照CRD、卷快照控制器、CSI驱动程序。 external-snapshotter目前最新版已是7.0.0,此处选择是`external-snapshotter-client-v6.3.3 - 下载

# wget https://github.com/kubernetes-csi/external-snapshotter/archive/refs/tags/v6.3.3.zip
- 修改相关yaml中镜像地址、名称空间,具体可参考 external-snapshotter帮助文档
## 安装 external-snapshotter 卷快照CRD
# cd external-snapshotter-6.3.3
kubectl kustomize client/config/crd |kubectl apply -f -
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created

## 安装卷 快照控制器 snapshot-controller
# cd external-snapshotter-6.3.3
# kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller/ |kubectl create -f -

## 安装 CSI驱动程序 csi-snapshotter
# cd external-snapshotter-6.3.3
# kubectl -n kube-system kustomize deploy/kubernetes/csi-snapshotter |kubectl create -f -

## 最后安装 卷快照类 VolumeSnapshotClass
# kubectl apply -f snapshotclass.yaml

## 创建pvc并打快照进行验证
# kubectl apply -f 0-pvc-test.yaml
# kubectl apply -f 1-snapshot.yaml

# kubectl get volumesnapshot
NAME                   READYTOUSE   SOURCEPVC     SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS             SNAPSHOTCONTENT                                    CREATIONTIME   AGE
pvc-snapshot-test101   true         pvc-test101                           1Gi           csi-rbdplugin-snapclass   snapcontent-db53791b-5d27-4165-be7e-5e0c2c7f4fcb   12s            12s

# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
pvc-test101   Bound    pvc-fd69eab9-e382-4184-87ba-abe7357848bc   1Gi        RWX            ceph-hdd-block   2m20s
安装涉及到的镜像:
## 默认镜像仓库地址是 registry.k8s.io/sig-storage
registry.aliyuncs.com/google_containers/snapshot-controller:v6.3.1
registry.aliyuncs.com/google_containers/csi-provisioner:v3.4.0
registry.aliyuncs.com/google_containers/csi-snapshotter:v6.3.1
registry.aliyuncs.com/google_containers/hostpathplugin:v1.11.0

安装kubevirt-manager(可选)

一款基于Angular开发的Web前端UI,来简化对Kubevirt的操作 github地址 kubevirt-manager 安装方式比较简单,根据readme.md中的步骤进行安装。 - 安装前置条件 1. CDI激活了特性HonorWaitForFirstConsumer,该特性默认在cdi-cr.yaml是开启的。

  config:
    featureGates:
    - HonorWaitForFirstConsumer
2. 默认使用的存储类StorageClass 启用了卷扩展allowVolumeExpansion特性,这个默认也是开启的。
apiVersion: storage.k8s.io/v1
kind: StorageClass
...
...
allowVolumeExpansion: true
volumeBindingMode: Immediate
注意 如果使用的是host-path或者local-storage,则需要在对应的存储类中配置volumeBindingMode: WaitForFirstConsumerWaitForFirstConsumer表示: 当用户创建PVC时,并不会立即为PVC绑定PV,需是等到有Pod使用这个PVC并被调度到某个节点上时,才会根据Pod所在的节点来动态绑定合适的PV,这种模式有利于避免预先分配存储资源。

  • 开始安装kubevirt-manager
    # cd kubevirt-manager
    ## 创建名称空间
    # kubectl apply -f kubernetes/ns.yaml
    
    ## 创建服务帐户和RBAC授权
    kubectl apply -f kubernetes/rbac.yaml
    
    ## 为前端nginx添加basic-auth认证,默认账户/密码:admin/admin
    # kubectl apply -f kubernetes/auth-secret.yaml
    # kubectl apply -f kubernetes/auth-config.yaml
    
    ## 部署服务
    kubectl apply -f kubernetes/deployment.yaml
    
    ## 创建优先级类  
    kubectl apply -f kubernetes/pc.yaml
    
    ## 创建Service,修改为NodePort类型,例如端口为32000,便于外部访问
    kubectl apply -f kubernetes/service.yaml
    
    
    # kubectl get pods -n kubevirt-manager 
    NAME                                READY   STATUS    RESTARTS   AGE
    kubevirt-manager-57d8ff6685-2ptj2   1/1     Running   0          73m
    # kubectl get svc -n kubevirt-manager
    NAME               TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    kubevirt-manager   NodePort   12.108.203.213   <none>        8080:32000/TCP   97s
    
  • 访问kubevirt-manager 访问url: http://IP:32000 ,默认用户名/密码:admin/admin

安装涉及到的镜像:

kubevirtmanager/kubevirt-manager:1.3.1

安装VirtualVNC(可选)

VNC github 地址

修改yaml,调整nodeSelector的值为node-role.kubernetes.io/control-plane;另外service类型改为NodePort,可以手工指定nodePort: 31002

# kubectl apply -f virtvnc.yaml

# kubectl get svc -n kubevirt virtvnc
NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
virtvnc   NodePort   12.100.141.142   <none>        8001:31002/TCP   29m

导入镜像测试

使用virtctl命令通过CDI上传镜像

## --uploadproxy-url 取的是 cdi-uploadproxy svc的地址
virtctl image-upload dv dv-image-cirros2 --size 2Gi --insecure --uploadproxy-url=https://12.107.65.150 --image-path=./cirros-0.5.1-x86_64-disk.img
virtctl image-upload pvc pvc-image-cirros2 --size 2Gi --insecure --uploadproxy-url=https://12.107.65.150 --image-path=./cirros-0.5.1-x86_64-disk.img

virtctl image-upload pvc pvc-image-cirros3 \
--size 2Gi \
--access-mode=ReadWriteMany \
--volume-mode=block \
--insecure \
--uploadproxy-url=https://12.107.65.150  \
--image-path=./cirros-0.5.1-x86_64-disk.img
使用http方式导入镜像
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: img-cirros
  namespace: default
spec:
  source:
    http:
      url: http://192.168.59.241:10800/images/cirros-0.5.1-x86_64-disk.img
  pvc:
    storageClassName: "ceph-hdd-block"
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 1Gi
    volumeMode: Block
注意 事先准备一个http服务,提供镜像下载,此处先用nginx,后期可以放在minio里面
## 增加一个server,端口用10800,locatoin如下
## http://192.168.59.241:10800/images/
location / {
    autoindex_localtime on;
    autoindex on;
    autoindex_exact_size on;
    root html;
  }

创建vm测试

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cirros-vm01
  namespace: default
spec:
  storageClassName: "ceph-hdd-block"
  volumeMode: Block
  accessModes:
    - ReadWriteMany
  dataSource:
    kind: PersistentVolumeClaim
    name: img-cirros
  resources:
    requests:
      storage: 4Gi
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: cirros-vm01
  namespace: default
spec:
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: cirros-vm01
      #annotations:
      #  ovn.kubernetes.io/ip_address: 10.244.10.203
    spec:
      domain:
        cpu:
          cores: 1
          model: host-passthrough
        memory:
          guest: 2Gi
        devices:
          disks:
            - name: root-disk
              disk:
                bus: virtio
          interfaces:
            - name: default
              masquerade: {}
        resources:
          requests:
            memory: 2048M
      networks:
        - name: default
          pod: {}
      volumes:
        - name: root-disk
          persistentVolumeClaim:
            claimName: cirros-vm01

常用镜像下载地址 可从openstack镜像向导页进入

cirros: - https://download.cirros-cloud.net/ - http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img

centos: - https://cloud.centos.org/centos/7/images/ - https://cloud.centos.org/centos/8/x86_64/images/

ubuntu: - https://cloud-images.ubuntu.com/releases

KubeVirt 一致性测试(在安装好CDI、csi、snapshot等组件后,再做一致性测试)

运行Sonobuoy对kubevirt进行一致性测试。 KubeVirt在github上提供了conformance.yaml,该文件定义了一个Sonobuoy插件配置,目的是执行KubeVirt的一致性测试(Conformance Tests)。 Sonobuoy是vmware开源的一个k8s诊断工具,它被设计用来对k8s集群进行健康检查和一致性(conformance)验证。通过以一种可访问和非破坏性的方式运行一组k8s一致性测试插件,可以更容易地了解k8s集群的状态。

# wget https://github.com/kubevirt/kubevirt/releases/download/v1.1.1/conformance.yaml
# wget https://github.com/vmware-tanzu/sonobuoy/releases/download/v0.57.1/sonobuoy_0.57.1_linux_amd64.tar.gz
# tar -xvf sonobuoy_0.57.1_linux_amd64.tar.gz
# mv sonobuoy /usr/bin/
# sonobuoy run --plugin conformance.yaml 

## 获取结果,并且会在当前目录生成tar.gz文件
# results=$(sonobuoy retrieve)
# ls
202402060444_sonobuoy_d8491ebc-c9a8-459a-99ca-440fa5b09134.tar.gz

## 获取测试失败的结果。将列出测试失败的数量及其名称,也可以直接解压获取文件的整个内容
# sonobuoy results $results
...
Errors:
4133 podlogs/kube-system/csi-rbdplugin-provisioner-7ff5d75499-hhjww/logs/csi-rbdplugin-controller.txt
1064 podlogs/kube-system/csi-rbdplugin-provisioner-7ff5d75499-pggqg/logs/csi-snapshotter.txt
...



## 删除Sonobuoy测试任务,需要删除其命名空间以及一些集群范围的资源。
# sonobuoy delete --wait
#conformance.yaml
sonobuoy-config:
  driver: Job
  plugin-name: kubevirt-conformance
  result-format: junit
spec:
  command:
  - /usr/bin/conformance
  image: quay.io/kubevirt/conformance:v1.1.1-amd64
  imagePullPolicy: Always
  name: plugin

conformance.yaml说明: sonobuoy-config 定义了Sonobuoy运行时使用的驱动器类型是Job,这意味着将会创建一个k8s Job来执行测试任务。同时指定了插件名称为kubevirt-conformance,表示这是针对KubeVirt组件的一致性测试插件。 而"result-format: junit"表示输出结果的格式为JUnit格式,这是一种常见的单元测试和集成测试结果报告格式,便于自动化测试工具和其他CI/CD系统解析和展示测试结果。 spec下的command 字段列出了容器内要执行的命令,这里指定的是 /usr/bin/conformance,即运行一个名为 conformance 的可执行文件,该文件应该包含执行KubeVirt一致性测试所需的脚本或程序。 image 指定使用的镜像为 quay.io/kubevirt/conformance:v1.1.1,这是一个包含了执行KubeVirt一致性测试所需环境和工具的容器镜像。 imagePullPolicy: Always 表示每次运行时都要从仓库拉取最新版本的镜像。 name: plugin 是这个Sonobuoy插件在Kubernetes资源中的名字。

各组件用途
  • virt-api

    virt-api是KubeVirt的API服务器,它提供了与KubeVirt相关的RESTful API端点,允许用户和其他组件与KubeVirt进行交互和通信。通过virt-api,用户可以管理虚拟机实例、虚拟机模板、存储和网络等资源。

  • virt-controlller

    virt-controller是KubeVirt的控制器,负责监视和管理KubeVirt中的虚拟机资源。它确保虚拟机的状态与定义的规范保持一致,并根据需要执行调谐操作,以满足预期状态。

  • virt-handler

    virt-handler负责在Kubernetes集群中创建和管理虚拟机实例(VMIs)。它与Kubernetes的调度器协作,确保VMIs被正确地调度到集群中的节点上,并负责监控和维护这些VMIs的运行状态。 Virt-handler会以Daemonset形式部署在每个节点上,负责监控节点上每个虚拟机实例状态变化,一旦检测到状态变化,会进行响应并确保相应操作能达到所需状态。

  • virt-launcher

    负责创建和管理虚拟机实例的生命周期,包括启动、停止、监控和维护。每个virt-lanuncher pod对应着一个VMI,也对应着一个libvirtd, kubelet只是负责virt-lanuncher pod运行状态,不会去关心VMI创建情况。 virt-lanuncher pod生命周期结束,virt-lanuncher也会通知VMI终止。 virt-lanuncher通过libvirtd去管理VM的生命周期,一个libvirtd只管理一个VM,而不像openstack那样,一个libvirtd管理多个VM。

  • virt-operator

    Kubevirt的运维组件,基于k8s的Operator模式,负责管理和操作KubeVirt的自定义资源(CRs)。virt-operator监视k8s集群中的CRs,包括但不限于 VirtualMachine(VM)、VirtualMachineInstance(VMI)、VirtualMachineInstanceReplicaSet(VMIRS)等。 virt-operator 监视 k8s 集群中与 KubeVirt 相关的自定义资源对象,并根据这些资源的状态和定义执行相应的操作, 比如安装、更新或卸载 KubeVirt 组件,以及确保 Kubevirt 所管理的虚拟机实例处于预期状态。 当用户创建、更新或删除了某个自定义资源时,virt-operator 将自动响应并采取相应措施来保持集群中 KubeVirt 环境的一致性和稳定性。

  • virtctl

    KubeVirt 提供的一个命令行工具,它允许用户与 k8s 集群中的虚拟化资源进行交互。通过 virtctl,您可以创建、删除、查看和管理 VirtualMachine、VirtualMachineInstance 以及 VirtualMachineInstanceReplicaSet 等资源。例如,您可以使用 virtctl 来启动或停止虚拟机实例、连接到虚拟机控制台、迁移虚拟机等操作。

  • VirtualMachine (VM)

    VM 是 KubeVirt 中提供的一种有状态的自定义资源对象,用于定义虚拟机的规范和配置,类似于虚拟机模板,描述了虚拟机的期望状态和属性。用户可以创建、更新和删除VM来定义虚拟机的规范和配置。 一个 VM 可以关联多个 VMI 实例,例如当希望在需要的时候能够恢复到某个已知的虚拟机状态时,可以通过 VM 这个高级抽象来实现。

  • VirtualMachineInstance (VMI)

    VMI 是Kubevirt中的自定义资源,代表了一个运行时的虚拟机实例。每个 VMI 对象描述了虚拟机实例的配置信息,包括镜像、内存大小、CPU核心数、存储大小、网络配置等。 当一个 VMI 被创建并调度至集群中的节点后,KubeVirt 将根据该配置启动实际的虚拟机,用户可以创建、更新和删除VMI。

  • VirtualMachineInstanceReplicaSet (VMIRS)

    VMIRS 类似于 k8s 中的 ReplicaSet 或 StatefulSet,用于管理一组相同配置的虚拟机实例集合。当创建一个 VMIRS 时,它将确保集群中始终保持指定数量且具有相同配置的 VMI 实例处于运行状态。 这种机制非常适合需要高可用性、负载均衡或者弹性伸缩的场景,可以根据需求自动调整 VMI 的副本数量。