In mid-February, I had the pleasure of attending with SUSE, the Swiss Cyber Security Days. This two-day event was taking place in Bern, and I gave a 20-minute session on Harvester. Even if I think this was well received, in 20 minutes, you can’t go through every single feature of a product. And I planned it more as a global overview than a deep dive.
This time, I decided to conduct a deeper exploration of Harvester.
HCI, Harvester, what is this all about?
Nowadays, most of our applications run virtualized. From development environments to huge production clusters, virtual machines are everywhere. And to provide better scalability and flexibility, IT infrastructures evolved from traditional legacy datacenters to hyper-converged infrastructures.
What is hyper-converged infrastructure, so? An HCI is a software-defined, fully integrated system that combines compute, storage, networking, and virtualization resources into a single platform. Those are big boxes that concentrate everything here in one place. You define your workload, you setup your storage, and you design your network all by yourself.
Harvester is an open-source HCI solution that provides cloud-native technologies for managing and orchestrating virtual machines, along with storage and networks. The best is yet to come. Harvester, under the hood, is based on famous and well-known cloud-native technologies. We will discover that while playing with this platform.
Nevertheless, let’s not waste time talking about the theory. Let’s get to work!
Installing Harvester
Let’s start with the installation of Harvester. It’s, in fact, a pretty straight forward process.
ISO is provided and available on GitHub, the version 1.3.0 is the latest stable version as of this writing. Paying attention to the GitHub release page, there are regularly new versions or updates, like RCs. You can try those, but, well, it is release candidates 😉
SUSE and the corresponding web page are pretty clear on the hardware requirements.
Remember, here we are dealing with a critical piece of software that is going to handle all of your workload. It is obvious, but there’s no point, except maybe for very basic testing, running Harvester as a VM on your personal computer. And also, don’t be shy about the specifications.
In summary:
- CPU: requires hardware virtualization. All servers have those CPU extensions activated. But in order to cross check, just try to execute and trigger this command on a Linux shell prompt. In terms of resources, 8 cores are marked as a minimum, with 16 cores recommended.
- Memory: 32GB is the minimum. But as always, the more, the better.
- Local storage of the node requires a minimum of 250GB. It can be either one single disk or spread across multiple disks
The network stack? I would treat that, in fact, as separate, as I think it would deserve, regarding the architecture, its own blog post. Only remember that the server would obviously require network connectivity. Please note the set of network ports that you would need to open for incoming traffic.
Installation for real
As mentioned previously, the installation stack is and ISO file, which is 5.79GB. Once you boot your machine straight from it, you’ll be welcomed by … a GRUB, a quite usual welcome page for Linux enthusiasts. Be aware: mouse not required, no graphical interface here (which is nice: the KISS principle).
Once validated, you need to follow the installation process. It will ask you for the node hostname, standard network settings (IP, DNS, Proxy, etc.), VIP, manual token (useful when you add additional Harvester nodes).
One word about the VIP. This IP is different from the one you have assigned to the node. The VIP is kind of assigned to the Harvester cluster you are going to create. This is the one you’ll enter when you want to target the cluster for the Web UI of Harvester.
Talking about cluster, based on my own testing, Harvester could potentially work in single-node mode, but more as a cluster. The first node you will install will always be a management node. Starting at the fourth node, the first three ones are management nodes, remaining ones will be worker nodes.
I hadn’t talked until now about the core architecture of Harvester, and it was on purpose: the best is to discover it now 🙂
Once installed, you end up with a welcome screen with a summary of the management cluster URL and status, the current node name, IP, and status as well.
Press F12, fill up the password you’ve entered during the installation process, and you’ll reach a prompt. Warning: except if I missed a setting, the shell prompt that is presented is using the QWERTY keyboard layout. Tips found in the FAQ, you can SSH using the admin user name (password authentication for a fresh installed node).
jpc@dbi-lt-jpc:~> ssh [email protected]
([email protected]) Password:
Last login: Thu Apr 18 11:57:11 2024 from 192.168.20.211
rancher@harv-01:~> sudo su -
harv-01:~ #
Enter a very common command for any DevOps & Kubernetes addict:
harv-01:~ $ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
harv-01 Ready control-plane,etcd,master 4h40m v1.27.10+rke2r1 192.168.20.121 <none> Harvester v1.3.0 5.14.21-150400.24.108-default containerd://1.7.11-k3s2
If you already got some interest into Harvester, you expected that. As said in the introduction, Harvester is based on cloud native components and Kubernetes is at its core.
“To Host and Serve”
But Kubernetes is not the only one. Remember: Harvester is a HCI, and it is intended to carry out corporate workloads. And in a cloud-native way 🙂
As always, on a Kubernetes cluster, looking at namespaces and pods gives a good overview of what is going on here.
Let’s do this!
harv-01:~ $ kubectl get ns
NAME STATUS AGE
cattle-dashboards Active 5h27m
cattle-fleet-clusters-system Active 5h27m
cattle-fleet-local-system Active 5h27m
cattle-fleet-system Active 5h28m
cattle-logging-system Active 5h27m
cattle-monitoring-system Active 5h27m
cattle-provisioning-capi-system Active 5h27m
cattle-system Active 5h28m
cluster-fleet-local-local-1a3d67d0a899 Active 5h27m
default Active 5h29m
fleet-local Active 5h28m
harvester-public Active 5h26m
harvester-system Active 5h26m
kube-node-lease Active 5h29m
kube-public Active 5h29m
kube-system Active 5h29m
local Active 5h28m
longhorn-system Active 5h26m
Let’s start with the harvester-system namespace.
harv-01:~ $ kubectl get pods -n harvester-system
NAME READY STATUS RESTARTS AGE
harvester-667fb9cbc8-jwmtx 1/1 Running 0 5h47m
harvester-load-balancer-6755cb4d67-7xjw8 1/1 Running 0 5h47m
harvester-load-balancer-webhook-6b5c6b546-bdf66 1/1 Running 0 5h47m
harvester-network-controller-manager-5ff644ffb6-66s69 1/1 Running 0 5h47m
harvester-network-controller-v9lhf 1/1 Running 0 5h47m
harvester-network-webhook-5c596bdd6c-grctr 1/1 Running 0 5h47m
harvester-node-disk-manager-gdfzx 1/1 Running 0 5h47m
harvester-node-manager-mrqbs 1/1 Running 0 5h47m
harvester-node-manager-webhook-9cfccc84c-hxnbm 1/1 Running 0 5h47m
harvester-webhook-79f5446494-65lvb 1/1 Running 0 5h47m
kube-vip-zk62c 1/1 Running 0 5h47m
virt-api-77cbf85485-spnf8 1/1 Running 0 5h46m
virt-controller-659ccbfbcd-6xzmb 1/1 Running 0 5h46m
virt-controller-659ccbfbcd-tkk2b 1/1 Running 0 5h46m
virt-handler-9bwd5 1/1 Running 0 5h46m
virt-operator-6b8b9b7578-66tps 1/1 Running 0 5h47m
Pods virt-api, virt-controller, virt-operator. For those who know me, they know my addiction to KubeVirt. This wonderful add-on brings the management of virtual machines to Kubernetes and relies on KVM (Kerned-based Virtual Machine, released in 2007).
Add-on to Kubernetes, that also means new objects.
harv-01:~ $ kubectl api-resources |grep "kubevirt.io/v1"
virtualmachineclones vmclone,vmclones clone.kubevirt.io/v1alpha1 true VirtualMachineClone
virtualmachineexports vmexport,vmexports export.kubevirt.io/v1alpha1 true VirtualMachineExport
virtualmachineclusterinstancetypes vmclusterinstancetype,vmclusterinstancetypes,vmcf,vmcfs instancetype.kubevirt.io/v1beta1 false VirtualMachineClusterInstancetype
virtualmachineclusterpreferences vmcp,vmcps instancetype.kubevirt.io/v1beta1 false VirtualMachineClusterPreference
virtualmachineinstancetypes vminstancetype,vminstancetypes,vmf,vmfs instancetype.kubevirt.io/v1beta1 true VirtualMachineInstancetype
virtualmachinepreferences vmpref,vmprefs,vmp,vmps instancetype.kubevirt.io/v1beta1 true VirtualMachinePreference
kubevirts kv,kvs kubevirt.io/v1 true KubeVirt
virtualmachineinstancemigrations vmim,vmims kubevirt.io/v1 true VirtualMachineInstanceMigration
virtualmachineinstancepresets vmipreset,vmipresets kubevirt.io/v1 true VirtualMachineInstancePreset
virtualmachineinstancereplicasets vmirs,vmirss kubevirt.io/v1 true VirtualMachineInstanceReplicaSet
virtualmachineinstances vmi,vmis kubevirt.io/v1 true VirtualMachineInstance
virtualmachines vm,vms kubevirt.io/v1 true VirtualMachine
migrationpolicies migrations.kubevirt.io/v1alpha1 false MigrationPolicy
virtualmachinepools vmpool,vmpools pool.kubevirt.io/v1alpha1 true VirtualMachinePool
virtualmachinerestores vmrestore,vmrestores snapshot.kubevirt.io/v1alpha1 true VirtualMachineRestore
virtualmachinesnapshotcontents vmsnapshotcontent,vmsnapshotcontents snapshot.kubevirt.io/v1alpha1 true VirtualMachineSnapshotContent
virtualmachinesnapshots vmsnapshot,vmsnapshots snapshot.kubevirt.io/v1alpha1 true VirtualMachineSnapshot
With KubeVirt, and so Harvester, a virtual machine will be defined as a Kubernetes object, VirtualMachine. VirtualMachineInstances will be a running instance of a VirtualMachine object. Just imagine, being able to apply VirtualMachine definitions and get your VM scheduled, by Kubernetes standard scheduler somewhere on your Harvester cluster 🥰 . The best of two worlds is brought together. Harvester simplifies all this using, like Rancher is doing by easing the management of standard Kubernetes workloads.
Quickly continue to get a taste of what is running also on Harvester. We can see some cattle- namespace. Rancher is running here!
harv-01:~ $ kubectl get pods -n cattle-system
NAME READY STATUS RESTARTS AGE
harvester-cluster-repo-5c75f7d9fd-88g4x 1/1 Running 0 5h31m
rancher-5dbd4cf7dc-995rr 1/1 Running 0 5h29m
rancher-webhook-5788f655d8-4p8bt 1/1 Running 0 5h31m
system-upgrade-controller-78cfb99bb7-hdslt 1/1 Running 2 (5h14m ago) 5h31m
What else do we have? Longhorn, for the storage.
harv-01:~ $ kubectl get pods -n longhorn-system
NAME READY STATUS RESTARTS AGE
csi-attacher-dc76666dd-jhs8l 1/1 Running 0 5h32m
csi-attacher-dc76666dd-t96tr 1/1 Running 0 5h32m
csi-attacher-dc76666dd-w9zwf 1/1 Running 0 5h32m
csi-provisioner-7fc9d85c66-48n7g 1/1 Running 0 5h32m
csi-provisioner-7fc9d85c66-89h4d 1/1 Running 0 5h32m
csi-provisioner-7fc9d85c66-c94hb 1/1 Running 0 5h32m
csi-resizer-67664c5755-jpl6r 1/1 Running 0 5h32m
csi-resizer-67664c5755-r4llm 1/1 Running 0 5h32m
csi-resizer-67664c5755-vcn94 1/1 Running 0 5h32m
csi-snapshotter-6c9d675d9c-flkf6 1/1 Running 0 5h32m
csi-snapshotter-6c9d675d9c-hw4mj 1/1 Running 0 5h32m
csi-snapshotter-6c9d675d9c-sppkx 1/1 Running 0 5h32m
engine-image-ei-acb7590c-cxtvm 1/1 Running 0 5h32m
instance-manager-3c8c76df5f2bfa171e62a198a9ade00e 1/1 Running 0 5h32m
longhorn-csi-plugin-t7x2h 3/3 Running 0 5h32m
longhorn-driver-deployer-67fd98774c-xd7x2 1/1 Running 0 5h32m
longhorn-loop-device-cleaner-vq2nr 1/1 Running 0 5h32m
longhorn-manager-mn75c 1/1 Running 0 5h32m
longhorn-ui-7f8cdfcc48-gqcs4 1/1 Running 0 5h32m
longhorn-ui-7f8cdfcc48-v9nhc 1/1 Running 0 5h32m
You remember the cattle-monitoring-system namespace? We didn’t talked also about the based OS, Elemental. We will go deeper into all those topics, as they are pretty dense, lots of subjects here. But by using Kubernetes for his HCI, SUSE simplifies the management of workloads for companies and reduces the time required for their delivery.
Stay connected for much more!