一、什么是Kubevirt

Kubevirt是Kubernetes的一个插件,为Kubernetes提供了在与容器相同的基础结构上提供、管理和控制 Kvm 虚拟机 的能力。解决k8s不能调度虚拟机的问题,在之前k8s只能调度底层container。

使用Kubevirt可以

创建虚拟机
启动虚拟机
停止虚拟机
删除虚拟机
在Kubernetes集群上调度虚拟机
虚拟机运行在Kubernetes Pod中,利用标准的K8s网络和存储。

整体架构
关键组件:

  1. virt-api:
    • 为 Kubevirt 提供 API 服务能力,比如许多自定义的 API 请求,如开机、关机、重启等操作,通过 APIService 作为 Kubernetes Apiserver 的插件,业务可以通过 Kubernetes Apiserver 直接请求到 virt-api;
  2. virt-controller:
    • Kubevirt 的控制器,功能类似于 Kubernetes 的 controller-manager,管理和监控 VMI 对象及其关联的 Pod,对其状态进行更新;
  3. virt-handler:
    • 以 Daemonset 形式部署,功能类似于 Kubelet,通过 Watch 本机 VMI 和实例资源,管理 本宿主机上所有虚机实例;
      主要执行动作如下:

    • 使 VMI 中定义的 Spec 与相应的 libvirt (本地 socket 通信)保持同步;

    • 汇报及控制更新虚拟机状态;

    • 调用相关插件初始化节点上网络和存储资源;

    • 热迁移相关操作;

  4. virt-launcher:
    • Kubevirt 会为每一个 VMI 对象创建一个 Pod,该 Pod 的主进程为 virt-launcher,virt-launcher 的 Pod 提供了 cgroups 和 namespaces 的隔离,virt-launcher 为虚拟机实例的主进程。
    • virt-handler 通过将 VMI 的 CRD 对象传递给 virt-launcher 来通知 virt-launcher 启动 VMI。然后,virt-launcher 在其容器中使用本地 libvirtd 实例来启动 VMI。virt-launcher 托管 VMI 进程,并在 VMI 退出后终止。
    • 如果 Kubernetes 运行时在 VMI 退出之前尝试关闭 virt-launcher 容器,virt-launcher 会将信号从Kubernetes 转发到 VMI 进程,并尝试推迟容器的终止,直到 VMI 成功关闭
  5. libvirtd:
    • 每个VMI对应的Pod都有一个libvirtd实例。
    • virt-launcher借助于libvirtd管理VMI实例生命周期

二 、KubeVirt部署

项目参考https://github.com/kubevirt/kubevirt
节点安装libvirt、qemu

# Ubuntu
$ apt install -y qemu-kvm libvirt-bin bridge-utils virt-manager

# CentOS
$ yum install -y qemu-kvm libvirt virt-install bridge-utils

检查节点是否支持虚拟化

virt-host-validate qemu

如果硬件不支持虚拟化,可以通过以下方法开启软件仿真:
编辑kubevirt配置
$ kubectl edit -n kubevirt kubevirt kubevirt

#添加以下内容:
spec:
  ...
  configuration:
    developerConfiguration:
      useEmulation: true

安装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)
$ 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

安装CDI

$ export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
$ 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

安装HostPath

# hostpath provisioner operator 依赖于 cert manager 提供鉴权能力
$ kubectl create -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml

 #创建 hostpah-provisioner namespace
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/namespace.yaml

 #部署 operator
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/operator.yaml -n hostpath-provisioner
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/webhook.yaml

查看部署情况

kubectl get ns
kubectl get pods -n XXX

三、 创建虚拟机

制作镜像
centos qcow2下载地址:https://cloud.centos.org/centos/7/images
修改镜像默认密码教程

vi Dockerfile

Dockerfile

FROM kubevirt/registry-disk-v1alpha
COPY CentOS-7-x86_64-GenericCloud-1805.qcow2 /disk/centos.img
docker build -t centos:1805 .

创建VM

apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
  name: myvmi
spec:
  domain:
    cpu:
      cores: 2  
    resources:
      requests:
        memory: 2G
    devices:
      disks:
      - name: containerdisk
        disk:
          bus: virtio
  volumes:
    - name: containerdisk
      containerDisk:
        image: centos:1805

kubectl apply -f vm-container.yml

安装virtctl客户端工具

export VERSION=v0.41.0
wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
cp virtctl-v0.41.0-linux-amd64 /usr/local/bin/virtctl
chmod +x /usr/local/bin/virtctl ; ll /usr/local/bin/
virtctl version #有报错不着急,试试能不能console

启动虚拟机

[root@vm]# kubectl get vmi
NAME               AGE     PHASE     IP            NODENAME         READY
centos-container   3h21m   Running   10.20.0.114   192.168.10.153   True

[root@vm]# kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
virt-launcher-centos-container-wdzd8   2/2     Running   0          3h22m

virtctl console centos-container # 进入虚拟机

按 ctrl+] 可退出虚拟机
virtctl start vm 启动
virtctl stop vm 暂停

vm作为服务公开
···
[root@master kubevirt]# virtctl expose virtualmachine vm-cirros --name vmiservice-node --target-port 22 --port 24 --type NodePort
[root@master kubevirt]# kubectl get svc

···

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐