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¶
- ☸ Kubernetes → + Deploy Cluster.
- Cluster:
- Name — used as the VM/hostname prefix (e.g.
my-cluster-cp,my-cluster-w1). - Engine — K3s (lightweight, single binary) or RKE2 (Rancher's hardened, CIS-benchmark-aligned distribution).
- Control Plane:
- Topology — 1 (single control plane) or 3 (HA: embedded etcd + kube-vip VIP).
- 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.
- 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
k8sshow 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). - Workers — + Add Worker for each node, same three source choices as control planes.
- Storage (optional) — pick a CSI backend so pods can request persistent volumes:
- Ceph CSI — optional pool name (defaults to something like
kube-<cluster-name>). - LINSTOR CSI — placement count (replica count across existing compute-node DRBD satellites; K8s nodes attach diskless).
- 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_gbmust be at least the pool file size + 10 GB headroom) or "Existing block device" for existing/bare-metal nodes. - None — no CSI installed; pods needing storage will stay Pending.
- 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).
- 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¶
- Deploy an App from the Marketplace
- Create an IPAM Pool — needed for HA API VIP and/or MetalLB.
- Add LINSTOR / DRBD Storage, Add a Ceph Cluster — set these up first if you want Ceph/LINSTOR CSI.