0
点赞
收藏
分享

微信扫一扫

统信有雀之 虚拟化组件


引言

统信有雀是一个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 进程的生命周期。

实战

安装

  1. 在统信有雀安装虚拟化组件
  • 通过web界面安装

在web控制台打开operatorHub,找到 UCCPS Virtualization 可以选择全部默认安装。

统信有雀之 虚拟化组件_有雀

  • 通过CLI命令创建

略....

  1. 创建 HyperConverged 实例
  2. 创建HostPath实例 (若有别的存储也可以选择不创建)
  3. 创建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

  1. 等待所有组件就绪

可在页面查看pod状态是否正常

创建虚拟机

  1. 创建一个虚拟机
  1. 可以选择通过现有模板进行创建
  2. 如现有模板不满足需求,可以自建模板
  3. 如需高度定制,可用yaml创建虚拟机
  1. 以下是一个简单的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



虚拟机管理

  1. 按需求增删网卡

统信有雀之 虚拟化组件_KubeVirt_02

  1. 按需求增删磁盘

统信有雀之 虚拟化组件_云原生_03

  1. 按需求进行快照

总结

(因篇幅有限,后续文章将补充介绍 虚拟机网络桥接、虚拟机快照、卷快照、windows虚拟机安装等功能)

统信有雀虚拟化组件 相较于K8s+KubeVirt,优势在于:

  • 拥有完整的dashboard支持,虚拟机及相关资源的创建、管理均可在页面操作。
  • 支持虚拟机及卷意见克隆、备份。
  • 支持虚拟机PXE启动。








举报

相关推荐

0 条评论