System Requirements
Purpose: For platform engineers and field operators, documents the hardware, OS, network, and software requirements for each role: the build host (Zone A), the bastion (Zone C), and the cluster nodes (Zone C). Pinned to the source of truth wherever possible.
Build host (Zone A — connected)
The build host downloads dependencies and produces the Zarf artifact.
OS
| OS | Status |
|---|---|
| Ubuntu 24.04 LTS | Tested, recommended. Matches UBUNTU_VERSION in config/versions.env. |
| Ubuntu 22.04 LTS | Works; not what the build is regression-tested on. |
| Other Linux | Best-effort. Requires Python 3.12 and Bash 5+. |
Hardware
| Resource | Minimum | Recommended | |---|---|---| | CPU | 4 cores | 8+ cores | | RAM | 8 GB | 16 GB | | Disk | 100 GB free | 200 GB free, SSD | | Network | 10 Mbps | 100+ Mbps |
Peak disk usage during a build is ~120 GB across build/, assets/, and dist/. After cleanup the artifacts in dist/ total 15–25 GB.
Required software
| Tool | Required version | Source |
|---|---|---|
| Python | 3.12 or newer | pyproject.toml: requires-python = ">=3.12" |
| Git | 2.30 or newer | system package |
| pip | matching the Python version | system package |
Runtime Python dependencies are pinned in pyproject.toml and installed by pip install -e .:
jsonschema==4.26.0
pyyaml==6.0.3
typer==0.25.1
rich==15.0.0
python-dotenv==1.2.2
Optional software
| Tool | Why | When |
|---|---|---|
| Zarf CLI 0.40+ | Build the .tar.zst package and SBOM | If you want a deployable artifact and not just zarf.yaml |
| Cosign 2.0+ | Sign packages | For production builds |
| Docker or Podman | Image operations and serve | Always, on the bastion |
| Terraform 1.14+ | OpenStack provisioning | Only when versions.env was generated with --template openstack |
Network
Outbound HTTPS access (TCP 443) is required to:
| Host | Purpose |
|---|---|
| github.com, raw.githubusercontent.com | Source repositories |
| registry.k8s.io, quay.io, ghcr.io, docker.io | Container images |
| dl.k8s.io, storage.googleapis.com | Kubernetes binaries |
| archive.ubuntu.com, security.ubuntu.com | OS packages |
| pypi.org, files.pythonhosted.org | Python wheels |
| charts.jetstack.io, kubernetes.github.io | Helm charts |
| registry.terraform.io | Terraform providers (OpenStack only) |
Standard HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars are honored.
Bastion host (Zone C — disconnected)
The bastion serves the local container registry and apt/pip mirrors.
OS
| OS | Status | |---|---| | Ubuntu 24.04 LTS | Tested, recommended. | | Ubuntu 22.04 LTS | Works. |
Hardware
| Resource | Minimum | Recommended | |---|---|---| | CPU | 4 cores | 8+ cores | | RAM | 8 GB | 16 GB | | Disk | 100 GB free | 200 GB free, SSD | | Network to nodes | 1 Gbps | 10 Gbps |
Disk needs to fit the extracted package (~40 GB) plus the in-place image layer cache (~15 GB).
Required software
| Tool | Why |
|---|---|
| Zarf CLI 0.40+ | zarf package deploy |
| Docker or Podman | Container runtime for registry and nginx |
| OpenSSH client | Ansible connectivity to cluster nodes |
| opencenter-airgap (optional) | If you prefer serve over zarf package deploy |
Network
| Direction | Port / proto | Source / destination | |---|---|---| | Inbound | 5000/TCP | Container registry, from cluster nodes | | Inbound | 80/TCP | Nginx file server, from cluster nodes | | Inbound | 3000/TCP | Gitea (optional), from cluster nodes | | Inbound | 22/TCP | SSH from operator workstation | | Outbound | 22/TCP, 6443/TCP | Cluster nodes |
Cluster nodes (Zone C — disconnected)
Each control-plane and worker node.
Hardware
| Role | CPU min | RAM min | Disk min | |---|---|---|---| | Control plane | 4 cores | 8 GB | 50 GB | | Worker (light) | 4 cores | 8 GB | 50 GB | | Worker (production) | 16+ cores | 32+ GB | 200+ GB SSD |
Pre-installed
-
Python 3.12+ (for Ansible).
-
OpenSSH server, with the bastion’s key authorized for the deploy user.
Installed by Kubespray
Versions pinned in config/versions.env:
| Component | Variable |
|---|---|
| containerd | CONTAINERD_VERSION (default 2.1.5) |
| runc | RUNC_VERSION (default 1.3.4) |
| kubelet, kubectl, kubeadm | KUBERNETES_VERSION (default v1.34.3) |
| Calico | CALICO_VERSION (default v3.31.3) |
Network
Required between cluster nodes:
| Port / proto | Purpose | |---|---| | 6443/TCP | Kubernetes API | | 2379–2380/TCP | etcd (control plane) | | 10250/TCP | kubelet API | | 10256/TCP | kube-proxy health | | 179/TCP | Calico BGP | | 4789/UDP | Calico VXLAN (if used) |
Required outbound to bastion: 5000/TCP (registry), 80/TCP (mirrors).
Topology
| Topology | Use | |---|---| | 1 node, combined control plane + worker | Smoke testing only | | 1 control plane, ≥ 1 worker, 1 bastion | Lab | | 3 control plane, ≥ 3 worker, 1 bastion | Recommended for production |
Tested upper bounds: 5 control plane nodes (etcd performance ceiling), 100 workers (Kubernetes default).
Version compatibility
| Subsystem | Pinned in | Default |
|---|---|---|
| Kubernetes | KUBERNETES_VERSION | v1.34.3 |
| Kubespray | KUBESPRAY_VERSION | master |
| Python (build host) | pyproject.toml | >=3.12 |
| Terraform (OpenStack template) | TERRAFORM_VERSION | 1.14.0 |
| Zarf | runtime detected | 0.40+ |
Sanity-checking the host
# Build host
python3 --version # >= 3.12
git --version # >= 2.30
df -h $(pwd) # at least 100 GB free
which zarf || true # optional but expected for full builds
# Bastion
zarf version # 0.40+
docker --version || podman --version
ss -tlnp | grep -E ':(80|3000|5000)\b' # ports must be free before deploy