Skip to content

Commit

Permalink
feat: kubevirt
Browse files Browse the repository at this point in the history
  • Loading branch information
ryan4yin committed Mar 2, 2024
1 parent a47198e commit e9b7f12
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions kubernetes/kubevirt/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Kubevirt 虚拟化管理平台

> https://kubevirt.io/user-guide/architecture/
KubeVirt 顾名思义,就是用 Kubernetes 来管理虚拟机,它跟 Proxmox VE 以及 Openstack 一样,都是构建在 QEMU-KVM 与 libvirt 之上的虚拟化平台。

据晋涛老师的文章 [耗时 7 年终将虚拟机带入 Kubernetes 世界](https://moelove.info/2023/09/01/%E8%80%97%E6%97%B6-7-%E5%B9%B4%E7%BB%88%E5%B0%86%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%B8%A6%E5%85%A5-Kubernetes-%E4%B8%96%E7%95%8C/) 所言,
KubeVirt 已经于 2023 年 7 月发布了 v1.0.0 版本,另一方面我最近又在折腾 Proxmox VE + LUKS 时遇到许多烦人的问题,于是干脆就决定把 Homelab 从 Proxmox VE 全部迁移到 KubeVirt 上来试试。


## KubeVirt 与传统虚拟化方案的主要区别

优势:

1. 声明式 API,通过 yaml 文件来定义虚拟机的配置,而不是通过图形界面或者命令行工具。

不兼容变更:

1. 虚拟机镜像的用法不一样,它提供这几种方式引入虚拟机的基础镜像([Filesystems, Disks and Volumes](https://kubevirt.io/user-guide/virtual_machines/disks_and_volumes/)):
1. 通过 `hostDisk` 指定物理机上的 `.img` 磁盘映像。(这可能会导致无法热迁移?)
1. 通过 [cdi](https://github.com/kubevirt/containerized-data-importer) 组件从如下几种方式导入镜像:
1. 通过 `dataVolumeTemplates` 导入 qcow2/iso 文件,文件地址为一个 HTTP URL
1. 在安装好 cdi 并将其 uploadProxy 暴露出来后,可以通过如下命令将 qcow2 镜像上传到一个 pvc 中:
- `virtctl image-upload --uploadproxy-url=https://cdi-uploadproxy.exam.com --pvc-name=upload-pvc --pvc-size=10Gi --image-path=./xxx.qcow2`
1. 从容器镜像仓库拉取镜像,这要求将 qcow2 镜像文件放在容器镜像的 `/disk` 目录下,
1. 存储
1. 与 K8s Pod 一样,默认不保留状态,重启虚拟机将使数据丢失。需要使用 PVC 来保留数据。
1. 虚拟机热迁移的前提是,虚拟机的 PVC 必须是 ReadWriteMany 的,也就是说不能使用本地存储了。
1. 网络
1. KubeVirt 默认使用 k8s 的 Pod 网络(一般都是 overlay 网络),跟物理网络不互通,必须借助 NodePort/LoadBalancer/Ingress 等方式才能使虚拟机对外可访问。
1. Pod 网络是动态的,这会导致虚拟机重启和热迁移后 IP 发生改变。


解决方法:

1. 存储:
1. 使用 Longhorn 等分布式存储系统,或者使用 NFS 等网络存储来提供 ReadWriteMany 的 PVC.
1. 网络:
1. 使用 flannel/calico/cilium 等网络插件将 pod 网络直接改为 underlay 网络。此方案的缺点是:
1. 这会导致所有 pod 都直接加入到物理网络中,我的局域网网段需要重新规划才能满足需求。
1. 它无法解决 IP 变动的问题。
1. 使用额外的 OVS 网络插件来为虚拟机额外添加一个 underlay 网络接口,并分配一个固定的 IP 地址,这样 Pod IP 变动也不会影响虚拟机的访问。


## KubeVirt 的 CRDs

首先是虚拟机:

1. `VirtualMachineInstance`:类似 `Pod` 的资源,它是一个在运行的虚拟机实例,不可关闭。
1. `VirtualMachine`:类似 `spec.replicas = 1` 的 DaemonSet,它保证始终有一个 VirtualMachineInstance 在运行,并控制它的生命周期(stop/running)。

然后 KubeVirt 也提供了一些类似虚拟机模板的资源:

1. `VirtualMachineInstancetype`: 类似云主机的规格(c7i.2xlarge 这种),定义了虚拟机的 CPU/RAM/磁盘等资源大小,`VirtualMachine` 可通过 `spec.instancetype` 引用这个资源来继承这个规格,并且不可修改规格中定义的参数。
1. `VirtualMachinePreference`: 定义了一些虚拟机的默认参数,比如默认的硬盘总线、网络模式等,`VirtualMachine` 可通过 `spec.preference` 引用这个资源来继承这些默认参数,也可以修改覆盖这些默认值。


## 虚拟机镜像上传

> https://kubevirt.io/user-guide/operations/containerized_data_importer/#certificate-signed-by-unknown-authority
TODO


## 访问 VM

```bash
# 查看有哪些 VM
kubectl get vmi -n xxx

# 连接到 VM
virtctl console xxx
```


## 热迁移

> https://kubevirt.io/user-guide/operations/live_migration/
TODO



## 快照备份与恢复

> https://kubevirt.io/user-guide/operations/snapshot_restore_api/
TODO



0 comments on commit e9b7f12

Please sign in to comment.