kubevirt 功能
架构
1.kubernetes api 新增了 CRD 自定义资源类型用于 VMI 专用
2.kubernetes api 会把 CRD 的类型转交额外的控制器进行管理 (virt-controller)
3 node 节点会有由额外的守护进行关联 CRD (virt-handler)
4.virt-controller 负责对 NODE 节点中调度 VMI
5 virt-handler 结合 kubelet 负责启动, 配置 VMI,
6. 支持 stateful VMI, 支持 replicaset VMI
7. kubevirt 部署在 kubenetes 集群中,创建 VMI 是类似以往创建 POD 模式 并由 kubevirt 管理 VMI
8. 安装,使用 kubevirt 不需要额外为用户添加任何权限,只需要默认授权即可
9 假如需要对 VMI 添加内部,外部网络,建议使用 multus cni 对其进行支持
multus
描述
1 上图只有一个 POD,但具备三个网卡, eth0, net0, 及 eth1, net0 都是用于连接到 kubernetes 服务
2 net0, net1 是一个额外的网络,可以支持 (vlan/vxlan/ptp) 网络
3. 理解是对于 kubetnetes 看来,依旧每个 POD 只有一个网卡
4. 但对于 pod 内部来说,使用的是 net0, net1 两个网卡进行工作就是具备了两个网卡
VMI
一个 vmi 运行在一个 pod 里面
通俗说,这个运行了 vmi 的 POD 跟其他 k8s 常见的 pod 没有区别,就是里面跑了 qmeu 进程
一个执行 vmi 的 pod 里面,会跑了下面三个常见进程
/usr/bin/virt-launcher-monitor
/usr/bin/virt-launcher --> 管理了下面的子进程(libvirtd | virtlogd|virt-launcher)
/usr/libexec/qemu-kvm
pod
pod 中执行了 上面 virt + qemu 命令,启动了 vm 进程
pod 与 vmi 是一对一关系,通常一个 pod 只有一个 vmi
pod 具有 API特性
可以控制 VMI 启动,关闭,重启
可以离线修改 vmi 配置 (libvirt.xml)
保证了 vmi 运行状态
相关总结描述
在 kubernetes 集群下运行
kuebevirt 只是 kubernetes 中的一个插件, 用于支持 VM 运行
可以在 kubernetes 下使用传统 pod, pvc 等各种资源无法使用 windows pod
pod 一般以无状态方式运行, pod 销毁, 所有数据无法保存
需要使用 PV, PVC 方式保存永久性数据可以在 kubernetes 下运行 vm, 以虚拟机方法运行 (以下简称 VMI)
可以运行 WINDOWS VM, Linux 也可以
同样支持 pv, pvc 作为额外的磁盘设备使用
可以保存 Linux, windows 下所有修改的数据 (即启动盘, 数据盘都可以永久性保存数据)
建议使用 selector, 在固定的 NODE 下启动固定的 VMI 虚拟机
VMI 状态
stopped
provistioning
starting
running
paused
migrationg
terminationg
unknown
已知缺点或需要注意地方
VMI 启动盘 (C:) 独享限制
VMI 启动盘, 数据盘, 只支持 RAW 格式, 不支持 QCOW2
即, 每个 VMI 使用中的磁盘都需要独享模式, 不支持共享模式, 不支持镜像模式
EX: 启动一个 WINDOWS VMI, 启动盘(C:) 设定为 60GB, 启动前需要预先准备( copy ) 该 60GB 数据文件
上述问题会导致部署时严重应该改 NODE 的 IO 抢夺无法实现 io QOS 限制
假如在某个 NODE 中同时部署了多个 VMI
由于当前 DOCKER 还没有比较好的 IO QOS 限制功能
导致其中一个 VMI 在抢夺 IO 时候, 会导致该 NODE 中的所有 VMI IO 资源造成锁无法实现磁盘扩容
在创建了磁盘后, 无法实现对该磁盘设备进行扩容(测试失败)
windows VMI 重启(进程) 后无法获取 IP 地址
官方指导, 物理重启 VMI 方法为 delete pod, create pod
由于 kurbernetes 默认使用了 dhcp 方法分配 IP
默认下, dhcp release 时间太长了
导致重启该 VMI 下,默认情况下 windows 会根据之前 IP 地址请求沿用 IP 地址
假设该 IP 地址没在使用中, 那么 windows 会继续使用之前的 IP 地址
那么 windows 使用的 IP 地址与 kubernetes 记录的 IP 地址不一致
除非 windows 在关机时候执行 ipconfig /release 操作VMI 启动磁盘残余问题
关闭对应 VMI 方法为 kubernetes delete -f xxxx.yaml
pod 进程已关闭, 但之前 VMI 使用中的启动盘数据 (C: 60GB FILE) 依旧存在在对应 node 中
需要额外方法维护改文件删除问题
参考文档
kubevirt github 地址
kubevirt 官方网页
kubevirt 工作原理
一个正常运行的 kubernetes 集群
启动了 kuebevirt pod (linux 系统)该 pod 调用了 /usr/bin/virt-launcher 进程, 用于启动 VMI
VMI 是运行在 kubernetes pod 下的一个进程