引言
统信有雀是一个PaaS层容器云平台,在容器平台使用虚拟化目前最优选择是 kubevirt,有雀基于KubeVirt进行适配、优化,是kubevirt可以通过有雀的console界面进行虚拟机创建、管理、克隆、快照等操作。
背景
什么是KubeVirt
KubeVirt 是一个 Kubernetes 的扩展(主要是CRD),它允许在 Kubernetes 集群中运行和管理虚拟机(VM)。这个项目的目标是将容器和虚拟机无缝集成,为应用提供更广泛的运行环境选择,从而实现更大范围的云原生工作负载。
KubeVirt 主要组件
virt-api-server:
HTTP API服务器充当所有与虚拟化相关的流程的入口点。
作为KubeVirt的主要入口点,它负责对提供的VMI CRD(自定义资源定义)进行默认值处理和验证。
VMI (CRD)
VMI(虚拟机实例)的定义作为自定义资源存储在Kubernetes API服务器内。
VMI定义定义了虚拟机本身的所有属性,例如
机器类型
CPU类型
内存和虚拟CPU数量
网络接口卡的数量和类型
...
virt-controller
virt-controller 具备全集群范围的虚拟化功能。
该控制器负责监视 VMI(自定义资源)并管理相关的 Pods。目前,该控制器确保创建和管理与 VMI 对象相关的 Pods 的生命周期。
在其生命周期内,VMI 对象将始终与一个 Pod 相关联,然而,由于例如 VMI 的迁移,与之相关的 Pod 实例可能会随时间而变化。
virt-launcher
对于每个 VMI 对象,都会创建一个 Pod。该 Pod 的主要容器运行 virt-launcher KubeVirt 组件。
Kubernetes 或 kubelet 本身不运行 VMI。相反,集群中每个主机上的守护进程会负责在每个调度到主机上的与 VMI 对象相关的 Pod 上启动 VMI 进程。
virt-launcher Pod 的主要目的是提供用于托管 VMI 进程的 cgroups 和命名空间。
virt-handler 通过将 VMI 的 CRD 对象传递给 virt-launcher 向 virt-launcher 发送信号以启动 VMI。然后,virt-launcher 在其容器内使用本地的 libvirtd 实例启动 VMI。接着,virt-launcher 监视 VMI 进程,并在 VMI 退出后终止。
如果 Kubernetes 运行时在 VMI 退出之前尝试关闭 virt-launcher Pod,virt-launcher 会将信号从 Kubernetes 转发到 VMI 进程,并尝试阻止 Pod 在 VMI 成功关闭之前终止。
virt-handler
每个主机都需要一个 virt-handler 实例,它可以作为 DaemonSet 提供。
与 virt-controller 类似,virt-handler 也是一种被动反应的组件,它会监视 VMI 对象的更改,一旦检测到变化,将执行所有必要的操作以使 VMI 达到所需的状态。
这种行为类似于 Kubernetes API 服务器和 kubelet 之间的协同工作。
virt-handler 主要需要处理的领域包括:
保持与相应的 libvirt 域同步的集群级别的 VMI 规范。
向集群报告域状态和规范更改。
调用节点中心的插件,这些插件可以满足在 VMI 规范中定义的网络和存储要求。
libvirtd
每个 VMI(虚拟机实例)的 Pod 中都存在一个 libvirtd 实例。virt-launcher 使用 libvirtd 来管理 VMI 进程的生命周期。
实战
安装
- 在统信有雀安装虚拟化组件
- 通过web界面安装
在web控制台打开operatorHub,找到 UCCPS Virtualization
可以选择全部默认安装。
- 通过CLI命令创建
略....
- 创建 HyperConverged 实例
- 创建HostPath实例 (若有别的存储也可以选择不创建)
- 创建StorageClass
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
annotations:
# 设置默认存储类
storageclass.kubernetes.io/is-default-class: 'true'
provisioner: kubevirt.io.hostpath-provisioner
# 删除策略
reclaimPolicy: Delete
# 支持卷扩展
allowVolumeExpansion: true
# 设置立即绑定
volumeBindingMode: Immediate
- 等待所有组件就绪
可在页面查看pod状态是否正常
创建虚拟机
- 创建一个虚拟机
- 可以选择通过现有模板进行创建
- 如现有模板不满足需求,可以自建模板
- 如需高度定制,可用yaml创建虚拟机
- 以下是一个简单的fedora虚拟机实例yaml文件
# kubevirt 版本
apiVersion: kubevirt.io/v1
# 资源类型
kind: VirtualMachine
# 一些注解元素
metadata:
# 虚拟机名称
name: vm-example
# 标签
labels:
# 虚拟机组
app: vm-example
# 虚拟机模板,这里用的是fedora
os.template.kubevirt.io/fedora35: 'true'
# 虚拟机资源类型,这里是小型1C1G
flavor.template.kubevirt.io/small: 'true'
# 虚拟机类型模板
vm.kubevirt.io/template: fedora-server-small
# 虚拟机负载类型,分为server和desktop
workload.template.kubevirt.io/server: 'true'
# 注解
annotations:
# 虚拟机系统类型
name.os.template.kubevirt.io/fedora35: Fedora 35
# 描述
description: VM example
# 使用的命名空间
namespace: openshift-cnv
spec:
# 是否创建时启动
running: false
# 模板
template:
metadata:
annotations:
# 再次定义虚拟机大小
vm.kubevirt.io/flavor: small
# 虚拟机系统
vm.kubevirt.io/os: fedora
# 虚拟机负载类型
vm.kubevirt.io/workload: server
labels:
flavor.template.kubevirt.io/small: 'true'
# 虚拟机域,域libvirt对应
kubevirt.io/domain: vm-example
kubevirt.io/size: small
vm.kubevirt.io/name: vm-example
os.template.kubevirt.io/fedora35: 'true'
workload.template.kubevirt.io/server: 'true'
spec:
# 定义虚拟机资源,可以覆盖上面定义的资源
domain:
machine:
type: virt
# CPU资源定义
cpu:
# CPU内核数
cores: 1
# 虚拟机CPU插座数
sockets: 1
#虚拟机CPU线程数
threads: 1
# 其余设备
devices:
# 磁盘(卷)
disks:
# 引导盘
# 引导顺序为1
- bootOrder: 1
disk:
# 接口类型,arm仅支持virtio,但Windows需要驱动
bus: virtio
name: containerdisk
# cloudinit盘,用于初始化linux系统
- disk:
bus: virtio
name: cloudinitdisk
# 网络接口
interfaces:
# 使用masquerade类型
- masquerade: {}
name: default
# 接口类型依然为virtio
model: virtio
# 启用多队列(multiqueue)功能
networkInterfaceMultiqueue: true
rng: {}
# 内存资源
resources:
# 请求内存大小,亦是虚拟机能使用最大内存
requests:
memory: 1G
# 虚拟机的hostname
hostname: vm-example
# 绑定上面定义的网卡
networks:
- name: default
pod: {}
# Pod 终止(删除)的优雅期间
terminationGracePeriodSeconds: 0
# 绑定上面定义的存储
volumes:
# 定义为containerDisk,从docker registry拉取镜像
- containerDisk:
# 简单实例为fedora35
image: 'quay.io/containerdisks/fedora:35'
name: containerdisk
# 定义cloudinit的一些资源
- cloudInitNoCloud:
userData: |-
#cloud-config
# root用户密码
password: fedora
# 其余cloudinit资源可以在这里添加,也可以使用configmap调用
chpasswd: { expire: False }
name: cloudinitdisk
虚拟机管理
- 按需求增删网卡
- 按需求增删磁盘
- 按需求进行快照
总结
(因篇幅有限,后续文章将补充介绍 虚拟机网络桥接、虚拟机快照、卷快照、windows虚拟机安装等功能)
统信有雀虚拟化组件 相较于K8s+KubeVirt,优势在于:
- 拥有完整的dashboard支持,虚拟机及相关资源的创建、管理均可在页面操作。
- 支持虚拟机及卷意见克隆、备份。
- 支持虚拟机PXE启动。