Harvester介绍
Harvester 是一款基于 Kubernetes 构建的现代、开放、可互操作的超融合基础架构(HCI)产品。它是一个开源替代方案,专为寻求云原生 HCI 解决方案的运维人员而设计。Harvester 运行在裸金属服务器上,提供集成的虚拟化和分布式存储功能。除了传统的虚拟机之外,Harvester 还通过与 Rancher 集成来支持容器化环境。它可以统一传统的虚拟化基础架构,同时支持在中心到边缘的位置采用容器。
架构
- Linux 操作系统。Elemental for SLE-Micro 5.3 是 Harvester 的核心,它是一个不可变的 Linux 发行版,旨在尽量减少 Kubernetes 集群中节点的操作系统维护工作。
- 建立在 Kubernetes 之上。Kubernetes 已成为主流的基础架构语言,而 Harvester 是包含 Kubernetes 的 HCI 解决方案。
- 使用 Kubevirt 进行虚拟化管理。Kubevirt 在 Kubernetes 之上使用 KVM 来提供虚拟化管理。
- 使用 Longhorn 进行存储管理。Longhorn 提供分布式块存储和分层。
- 通过 Grafana 和 Prometheus 进行观察。Grafana 和 Prometheus 提供强大的监控和记录功能。
其他具体可以参考官方文档,地址:https://docs.harvesterhci.io/zh/v1.1/
环境
我的Harvester版本是1.20-rc2
,linux系统版本是suse:sle-micro-rancher:5.3
,k8s版本是v1.25.9+rke2r1
namespace如下:
导入
文档地址:https://docs.harvesterhci.io/zh/v1.1/advanced/vmimport
要使用 VM 导入功能,用户需要启用 vm-import-controller 插件。
我这里的设置如下:
创建源
apiVersion: migration.harvesterhci.io/v1beta1
kind: VmwareSource
metadata:
name: vcsim
# namespace自选,default也必须写,不写会报错
namespace: default
spec:
# endpoint为vCenter地址
endpoint: "https://192.168.1.1/sdk"
# dc为vCenter的数据中心
dc: "Datacenter"
credentials:
name: vsphere-credentials
# namespace要一致
namespace: default
---
apiVersion: v1
kind: Secret
metadata:
name: vsphere-credentials
namespace: default
stringData:
# vCenter用户名密码
"username": "user"
"password": "password"
kubectl apply -f vm.yaml
kubectl get VmwareSource
创建迁移任务
apiVersion: migration.harvesterhci.io/v1beta1
kind: VirtualMachineImport
metadata:
name: wgh55
# namespace和上面保持一致
namespace: default
spec:
# 官方文档中没有写folder这个参数,explain获取到的...,表示虚拟机在vCenter中的目录
folder: "xxx"
# 虚拟机名称
virtualMachineName: "wgh5"
networkMapping:
# 源虚拟机网络,如果绑定了2个vSwitch,需要再写一个sourceNetwork,destinationNetwork。
- sourceNetwork: "vSwitch0"
# 目标虚拟机网络
destinationNetwork: "harvester-public/vlan16"
sourceCluster:
# VmwareSource源
name: vcsim
namespace: default
kind: VmwareSource
apiVersion: migration.harvesterhci.io/v1beta1
kubectl apply -f importvm.yaml
kubectl get VirtualMachineImport
我这里状态是virtualMachineRunning,因为虚拟机已经导入成功了,正常刚创建任务后状态是sourceReady。
查看vm-import-controller日志
kubectl logs -f -n harvester-system vm-import-controller-harvester-vm-import-controller-6654889k26k
这里报错secret找不到不影响。
vCenter状态
VirtualMachineImport状态变为sourceReady后,vCenter上会创建一个导出OVF模板的任务,等待任务完成。
Harvester状态
导出模板后,Harvester的镜像页面上可以看到镜像正在下载。等待下载完成。下载速度和源虚拟机硬盘大小和网速有关。
同时,longhorn-system中也会启动pod,用来下载镜像。
kubectl logs backing-image-ds-default-image-gdgww -n longhorn-system
镜像下载到99%时,会开始计算校验和,即图中的报错:failed to get the checksum from a valid config during processing wrap-up, will directly calculated it then
,同步文件到本地后,下载完成。
查看虚拟机
镜像下载完成后,会自动启动一个虚拟机。但这个虚拟机是无法进入系统的,会进入急救模式。报错信息如下:
原因是自动启动的虚拟机,系统盘类型是VirtIO,和原有的硬盘类型SATA不兼容,导致找不到硬盘,无法挂载,进入系统。
自动生成的虚拟机内存也不是整数。
创建虚拟机
在下载好的镜像右边点击创建虚拟机,填写CPU,内存。添加镜像卷,类型选择disk,SATA,大小和源虚拟机保持一致。
网络模式选择e1000或者e1000e。保存启动。
虚拟机可以正常启动。
坑
1.创建虚拟机导入任务失败
报错如下:time="2023-07-17T02:27:12Z" level=error msg="error syncing 'harvester-public/wgh5': handler virtualmachine-import-job-change: error in poweroff call: error finding vm in PowerOffVirtualMachine: vm '/Datacenter/vm/wgh5' not found, requeuing"
原因
vm-import-controller默认去/dc名称/vm/虚拟机名称
路径下找虚拟机,而虚拟机不在这个路径下。所以需要加folder
参数
实际路径在如下:Datacenter下面的文件夹。
2.镜像下载到99%重新下载
原因
计算镜像校验和同步文件失败。nginx默认的proxy_read/write时间太短了,镜像还没读取完就超时了。
解决
访问rancher。先点击支持。
再点击访问内嵌的 Rancher UI。
点击应用,已安装的应用,再点击ConfigMap rke2-ingress-nginx-controller
点击编辑配置,添加超时时间。根据硬盘大小来设置,一般120s就可以了,如果不行就加大超时时间。
proxy-read-timeout 600
proxy-write-timeout 600
保存,重启rke2-ingress-nginx-controller pod,再次下载即可。
3.虚拟机无法启动
原因
- 镜像卷类型需要选择SATA,选择VirtIO就会无法启动。
- 硬盘大小需要大于等于源虚拟机硬盘大小。重要!!!(CPU和内存不一致不影响启动)