跳转至
首页 解决方案 下载 文档
演示环境

KubeVirt部署

KubeVirt介绍

KubeVirt是一个开源项目,支持在Kubernetes集群中运行和管理虚拟机,就像管理容器一样,为传统的虚拟机工作负载提供现代化的容器编排平台。在Kubernetes中使用自定义资源定义(CRD)来表示虚拟机。

项目地址: https://github.com/kubevirt/kubevirt

KubeVirt架构

基础环境准备

  • 1.安装依赖的软件包
$ apt install -y libvirt-clients virt-manager bridge-utils
  • 2.检查节点是否支持虚拟化

生产环境建议使用物理主机,如果是实验环境,不支持硬件虚拟化,需要启用软件虚拟化进行模拟。

$ virt-host-validate qemu
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : WARN (Unknown if this platform has IOMMU support)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)

安装Kubevirt

  • 1.安装Kubevirt
# 获取最新的版本
$ export RELEASE=$(curl https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
# 部署KubeVirt operator
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
$ kubectl apply -f kubevirt-operator.yaml

# Create the KubeVirt CR (instance deployment request) which triggers the actual installation
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
# 如果不支持硬件虚拟化,需要修改启用软件模拟,增加useEmulation: true
$ vim kubevirt-cr.yaml
---
apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
  name: kubevirt
  namespace: kubevirt
spec:
  certificateRotateStrategy: {}
  configuration:
    developerConfiguration:
      useEmulation: true
      featureGates: []
  customizeComponents: {}
  imagePullPolicy: IfNotPresent
  workloadUpdateStrategy: {}
$ kubectl apply -f kubevirt-cr.yaml
# wait until all KubeVirt components are up
$ kubectl -n kubevirt wait kv kubevirt --for condition=Available
  • 2.检查Pod状态
root@kube-node1:~# kubectl get pods -n kubevirt
NAME                               READY   STATUS    RESTARTS   AGE
virt-api-fdbc87c9-rw4m8            1/1     Running   0          9m34s
virt-api-fdbc87c9-tsfvx            1/1     Running   0          9m34s
virt-controller-844699784f-72psc   1/1     Running   0          8m57s
virt-controller-844699784f-zpg44   1/1     Running   0          8m57s
virt-handler-clw89                 1/1     Running   0          8m57s
virt-handler-drbsn                 1/1     Running   0          8m57s
virt-operator-74bdf99686-nlxkk     1/1     Running   0          10m
virt-operator-74bdf99686-wxt5j     1/1     Running   0          10m
  • 3.部署virtctl

后续虚拟机的管理同时支持virtctl和kubectl两种方式进行虚拟机的管理。

$ cd /usr/local/src 
$ wget https://github.com/kubevirt/kubevirt/releases/download/v1.3.1/virtctl-v1.3.1-linux-amd64
$ mv virtctl-v1.3.1-linux-amd64 /usr/local/bin/virtctl
$ chmod +x /usr/local/bin/virtctl
$ virtctl version
Client Version: version.Info{GitVersion:"v1.3.1", GitCommit:"ed1e7ae8548d319fa7aacf315ad198f7241287c5", GitTreeState:"clean", BuildDate:"2024-08-22T08:52:25Z", GoVersion:"go1.22.2 X:nocoverageredesign", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{GitVersion:"v1.3.1", GitCommit:"ed1e7ae8548d319fa7aacf315ad198f7241287c5", GitTreeState:"clean", BuildDate:"2024-08-22T10:09:02Z", GoVersion:"go1.22.2 X:nocoverageredesign", Compiler:"gc", Platform:"linux/amd64"}

创建虚拟机

# 下面是虚拟机编排文件案例
$ vim vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: vm-cirros
  name: vm-cirros
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/vm: vm-cirros
    spec:
      domain:
        devices:
          disks:
          - disk:
              bus: virtio
            name: containerdisk
          - disk:
              bus: virtio
            name: cloudinitdisk
        machine:
          type: ""
        resources:
          requests:
            memory: 64M
      terminationGracePeriodSeconds: 0
      volumes:
      - name: containerdisk
        containerDisk:
          image: quay.io/kubevirt/cirros-container-disk-demo:latest
      - cloudInitNoCloud:
          userDataBase64: IyEvYmluL3NoCgplY2hvICdwcmludGVkIGZyb20gY2xvdWQtaW5pdCB1c2VyZGF0YScK
        name: cloudinitdisk

# 创建虚拟机
$ kubectl apply -f vm.yaml

# 查看虚拟机状态
$ kubectl get vm,vmi,pod

# 使用kubectl启动虚拟机
$ kubectl patch virtualmachine vm-cirros --type merge -p '{"spec":{"running":true}}'

虚拟机管理

连接虚拟机

  • 使用virtctl console连接虚拟机
root@kube-node1:~# virtctl console vm-cirros
Successfully connected to vm-cirros console. The escape sequence is ^]

login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
vm-cirros login: cirros
Password:
$ uptime
 03:58:23 up 11:56,  1 users,  load average: 0.00, 0.00, 0.00
  • 使用virtctl ssh连接虚拟机

cirros镜像的用户名为:cirros 默认密码: gocubsgo

root@kube-node1:~# virtctl ssh cirros@vm-cirros
cirros@vmi/vm-cirros.default's password:
$ ifconfig
eth0      Link encap:Ethernet  HWaddr BE:83:10:2A:15:F9
          inet addr:10.2.1.5  Bcast:10.2.1.255  Mask:255.255.255.0
          inet6 addr: fe80::bc83:10ff:fe2a:15f9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1402  Metric:1
          RX packets:121 errors:0 dropped:0 overruns:0 frame:0
          TX packets:77 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16439 (16.0 KiB)  TX bytes:8842 (8.6 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  • 使用SSH连接虚拟机

每个虚拟机和Pod一样,会获取一个Pod CIDR的IP地址。

root@kube-node1:~# ssh cirros@10.2.1.5
cirros@10.2.1.5's password:
$ uptime
 04:04:42 up 12:02,  1 users,  load average: 0.00, 0.00, 0.00
  • 停止虚拟机

停止虚拟机会自动删除VMI,所以要删除虚拟机正确的流程是先停止虚拟机,然后再删除虚拟机。

$ virtctl stop vm-cirros
VM vm-cirros was scheduled to stop

虚拟机状态

  • Stopped(已停止):虚拟机当前已停止,并且预计不会启动。
  • Provisioning(正在配置):正在配置和准备与虚拟机相关的集群资源(例如,数据卷)。
  • Starting(正在启动):正在准备运行虚拟机。
  • Running(运行中):虚拟机正在运行。
  • Paused(已暂停):虚拟机已暂停。
  • Migrating(正在迁移):虚拟机正在被迁移到另一个主机。
  • Stopping(正在停止):虚拟机正在停止过程中。
  • Terminating(正在终止):虚拟机正在删除过程中,包括其相关资源(虚拟机实例、数据卷等)。
  • Unknown(未知):无法获取虚拟机的状态,通常是由于与运行它的主机通信出现错误。
Document