Skip to content

Deploy a Kubernetes Cluster

MFCloud's Managed Kubernetes Engine deploys and operates K3s or RKE2 clusters on top of your existing hosts and storage — either as new VMs it provisions for you, existing VMs you already deployed, or directly on bare-metal compute hosts (no VM at all).

Admin-only, licensed feature

The ☸ Kubernetes tab only appears for global_admin accounts, and cluster creation is gated behind the license edition's "Managed Kubernetes" feature flag. If the tab or the + Deploy Cluster button is missing, check Settings → License.

Auto-provisioned nodes need a K8s-ready template

If you're using Auto-provision for any node, the template it clones from must be dnf-based with cloud-init enabled, or the node will stall waiting for a guest IP or SSH. See Build a K8s-Ready Node Template before your first deploy.

Quick steps

  1. ☸ Kubernetes → + Deploy Cluster.
  2. Cluster:
  3. Name — used as the VM/hostname prefix (e.g. my-cluster-cp, my-cluster-w1).
  4. EngineK3s (lightweight, single binary) or RKE2 (Rancher's hardened, CIS-benchmark-aligned distribution).
  5. Control Plane:
  6. Topology1 (single control plane) or 3 (HA: embedded etcd + kube-vip VIP).
  7. If HA, pick an API VIP pool — an IPAM pool (Create an IPAM Pool) that leases the cluster's stable API endpoint address. Use a different pool than the MetalLB pool below.
  8. For each control-plane node, choose a source: Auto-provision (MFCloud creates a new VM from a template), Use existing VM (pick from live inventory — VMs tagged k8s show by default, or toggle "Show all VMs"), or Use bare-metal host (an already-enrolled hypervisor host runs the engine directly, no VM — the host can't also be used by another cluster).
  9. Workers+ Add Worker for each node, same three source choices as control planes.
  10. Storage (optional) — pick a CSI backend so pods can request persistent volumes:
  11. Ceph CSI — optional pool name (defaults to something like kube-<cluster-name>).
  12. LINSTOR CSI — placement count (replica count across existing compute-node DRBD satellites; K8s nodes attach diskless).
  13. ZFS-LocalPV — node-local, not replicated; a PVC is pinned to whichever node created it. Pick "Sparse file on each node's own disk" (each node's disk_gb must be at least the pool file size + 10 GB headroom) or "Existing block device" for existing/bare-metal nodes.
  14. None — no CSI installed; pods needing storage will stay Pending.
  15. Networking (optional)MetalLB for LoadBalancer-type Services, backed by an IPAM pool. OVN-Kubernetes as a CNI is not on the roadmap; MetalLB layers on top of the engine's built-in CNI (Flannel for K3s, Canal for RKE2).
  16. Deploy. Bootstrap runs as a background task (SSH join handshake takes a few minutes) — the cluster row shows Provisioning until it flips to Active. Click the row for a 📜 Deployment Log.

Growing or shrinking a cluster

Open the cluster's ☸ Nodes panel to add/remove workers or (for HA clusters) add/remove control-plane members after the fact — you don't need to redeploy.

YAML manifests

The 📄 YAML Manifests card runs kubectl apply against the cluster's control plane from an uploaded or pasted .yaml file. Rows track apply status and kubectl's own output as the log; 🗑 removes the row and (best-effort) kubectl deletes what it applied.

Kubeconfig access

Each cluster row has a kubeconfig download so you can point your own kubectl/Lens/etc. at it directly, in addition to managing it from MFCloud.

App Catalog

See Deploy an App from the Marketplace — one-click Helm/manifest app stacks (Ollama, Postgres, Grafana, and more) onto an already-Active cluster.

See also