Kubespray is a Kubernetes SIG project that provisions production-grade Kubernetes clusters using Ansible. It is not a new orchestrator and not an abstraction over kubeadm — it wraps kubeadm in a large, opinionated set of Ansible roles that handle everything around it: operating-system preparation, container runtime installation, certificate distribution, etcd, load balancing for the API server, the CNI plugin, CoreDNS, and the cluster add-ons most teams end up installing by hand anyway.
The interface is an Ansible inventory. You declare which hosts belong to the kube_control_plane, etcd and kube_node groups, override defaults in group_vars/k8s_cluster, and run cluster.yml. The same repository ships the playbooks for the rest of the cluster's life — scale.yml to add nodes, remove-node.yml to drain and evict one, upgrade-cluster.yml to move between minor versions serially, and reset.yml to tear the whole thing down. That lifecycle coverage is the reason teams choose Kubespray over a one-shot installer.
It targets the environments managed control planes do not reach: bare metal, vSphere, OpenStack, air-gapped data centres, regulated estates that require a specific CNI or a hardened kubelet configuration. Kubespray gives you containerd or CRI-O, Calico or Cilium or Flannel, stacked or external etcd, and a documented path to change any of those decisions later — at the cost of owning the cluster yourself.
Why this skill matters now
Managed Kubernetes solved the easy case. What it did not solve is the estate that has to run on-premises for latency, data residency or regulatory reasons, and that population is not shrinking — it is growing as edge sites, sovereign cloud requirements and repatriated workloads pile up.
Kubespray is the tool most of those teams land on, because the alternatives are worse. Hand-rolled kubeadm scripts work until the first upgrade. Vendor distributions solve provisioning but bring a licence and a support boundary. Kubespray is a well-maintained SIG project, tracks upstream Kubernetes closely, and expresses the whole cluster as inventory and variables that live in your own Git repository.
The skills gap is specific and predictable. Teams can usually get cluster.yml to complete once. What they struggle with is the second year: upgrading across three minor versions without an outage, replacing a failed etcd member, rebuilding a control-plane node, running the whole thing air-gapped behind a local registry, and keeping the inventory reviewable when four clusters share one repository.