On-Premises Kubernetes: From Rack to Cluster
Build the machine, network, storage, and control-plane chain that keeps Ziba running when your team owns the data centre.
The enterprise problem and today’s slice
Enterprise problem: Moving Ziba on premises can satisfy locality or hardware-control requirements, but the organization becomes responsible for every failed disk, switch path, certificate, control-plane member, and spare worker that a cloud provider previously hid. Whole-course context: The incoming incident evidence shows that a pod limit and node capacity are different boundaries; today follows capacity downward into racks and upward into a resilient cluster. Today’s slice: We design a kubeadm-based high-availability cluster, its supporting load balancer, network, storage, power, and replacement workflow. End-of-day evidence: A rack-to-request topology, machine inventory, declarative bootstrap inputs, failure drill, and Ziba traffic replay prove the owned platform boundary. Still unsolved: Managed-cloud responsibility, provider-specific services, and automated just-in-time capacity remain later decisions.
The thesis is that on-premises Kubernetes is not merely Kubernetes installed on local servers; it is a product assembled from facilities, machines, networks, storage, control-plane quorum, and operating procedures. The team must own every interface between those three boxes.
Customer use cases
A cluster can report healthy while one shared power feed or API endpoint remains a single point of failure. These use cases prove both service availability and recoverability under a named physical failure.
| Use case ID | Actor | Customer job | Success outcome | Denial or recovery evidence |
|---|---|---|---|---|
| D59-UC-01 | Platform engineer | Provision a production on-premises cluster and deploy Ziba | Multiple control-plane and worker nodes become Ready; readers reach Ziba through a stable endpoint | Bootstrap stops when network, time, version, or capacity prerequisites fail; no partial cluster is promoted |
| D59-UC-02 | Data-centre operator | Replace a failed worker without losing service or auditability | Workloads drain or reschedule, replacement hardware joins, and Ziba remains within its availability objective | Failed-node identity, alerts, rescheduling gap, and unaffected control-plane quorum remain observable |
Actor-centred user stories
Owning hardware is useful only when responsibilities can be executed by named operators under pressure. The stories bind provisioning and replacement to observable customer and infrastructure outcomes.
| Story ID | Use case IDs | User story | Observable acceptance conditions |
|---|---|---|---|
| D59-US-01 | D59-UC-01 | As a platform engineer, I want reproducible rack-to-cluster inputs, so that Ziba can be rebuilt without undocumented console state | Inventory, firmware/OS baseline, API virtual address, kubeadm configuration, network plugin, storage class, and deployment revision are versioned; route and node checks pass |
| D59-US-02 | D59-UC-02 | As a data-centre operator, I want a rehearsed failed-node replacement path, so that hardware faults do not become an improvised application outage | Failure is detected, workloads leave the node, serial/asset identity is retained, a compatible spare joins, and customer probes remain within objective |
End-to-end product flows
A server in a rack is not yet schedulable capacity, so the flow must expose every transformation from powered metal to a serving pod. The recovery path begins with a reader-visible degradation and ends only when physical inventory and Kubernetes state agree again.
| Flow ID | Use case IDs | Path | Trigger | Numbered steps | Terminal evidence |
|---|---|---|---|---|---|
| D59-FLOW-01 | D59-UC-01 | Happy | Platform engineer approves the on-premises cluster build | 1. Allocate redundant power, switch paths, addresses, DNS, and machines. 2. Apply firmware and Linux baseline. 3. Configure container runtime, kubelet, and kubeadm. 4. Initialize the API endpoint and control-plane quorum. 5. Join workers and install network/storage integrations. 6. deploy Ziba and run probes. | Build commit, asset IDs, node UIDs, control-plane endpoint, etcd health, deployment revision, environment, timestamp, and probe run ID |
| D59-FLOW-02 | D59-UC-02 | Recovery | Reader probe degrades after worker power loss | 1. Correlate probe with node and facility alerts. 2. Confirm control-plane quorum and rescheduling. 3. Fence the failed machine from storage/network access. 4. Replace or repair it from the approved baseline. 5. Join and validate the new node. 6. Rebalance and replay traffic. | Failed and replacement asset IDs, pod movements, quorum observation, fencing proof, node Ready time, and customer SLO result |
System design derived from the flows
Kubernetes redundancy cannot compensate for two logical nodes sharing one physical failure domain. The design therefore makes facility, network, control-plane, worker, and storage boundaries visible before mapping pods onto them.
| Use case ID | Entry point | Responsible services | Authoritative store | Failure evidence |
|---|---|---|---|---|
| D59-UC-01 | Approved infrastructure inventory and cluster build pipeline | DCIM/IPAM, DHCP or static networking, DNS, API load balancer, Linux provisioning, kubeadm, etcd, CNI, CSI, Kubernetes controllers | Versioned inventory/configuration plus etcd for Kubernetes state | Unreachable API endpoint, lost etcd quorum, node NotReady, CNI failure, storage attach failure, or Ziba probe failure |
| D59-UC-02 | Facility/node alert and replacement runbook | Monitoring, out-of-band management, switch/storage controllers, Kubernetes drain/cordon, bare-metal provisioner, kubelet | Incident record, hardware asset system, Kubernetes node/pod state | Unfenced failed host, duplicate machine identity, unavailable volume, rescheduling beyond objective, or replacement not Ready |
The official kubeadm high-availability guide requires three or more control-plane machines, full connectivity, a container runtime, and a load balancer in front of the API endpoint; it presents stacked and external-etcd topologies with different infrastructure costs (Kubernetes HA kubeadm). Kubernetes also warns that production readiness includes availability, scale, certificates, API load balancing, etcd backup, and ongoing upgrades—not only initial installation (Kubernetes production environment).
Data model and ownership
Replacement becomes dangerous when a Kubernetes node name is mistaken for a physical asset, because disks, network addresses, credentials, and old membership can survive the machine. The ownership model links them while keeping facility, platform, and application state separate.
Generated-application database: Not created in this slice — Ziba's application data remains in its existing store; infrastructure inventory, cluster desired state, etcd backups, and incident evidence are sufficient for the platform build and replacement flows.
| Record or entity | Store and owner | Primary key | Foreign key or opaque reference | Tenant key | Material constraint | Lifecycle and deletion | Use case IDs |
|---|---|---|---|---|---|---|---|
| PhysicalMachine | Asset/DCIM system, owned by data-centre operations | Asset ID or chassis serial | Rack, power-circuit, switch-port, and baseboard references | None — physical inventory is organization-scoped | One active role and management identity per asset; failure domain must be recorded | Procured, racked, reassigned, wiped, retired, and retained for audit | D59-UC-01, D59-UC-02 |
| ClusterNode | Kubernetes API store, owned by kubelet/platform | Node UID | Opaque physical asset and provisioning-run references | Cluster ID | Node identity is unique; approved labels/taints reflect actual hardware and failure domain | Registered, cordoned, drained, deleted; evidence retained beyond object deletion | D59-UC-01, D59-UC-02 |
| ClusterBuildRevision | Git and pipeline store, owned by platform engineering | Repository commit plus run ID | Opaque inventory snapshot and secret-version references | Cluster ID | Inputs are reviewed; secrets are referenced, not committed; one promoted revision per environment | Proposed, validated, promoted, superseded, retained by audit policy | D59-UC-01 |
| ReplacementEvidence | Incident store, owned by operations | Incident ID plus action ordinal | Failed asset, old node UID, new asset, and new node UID | Cluster ID | Fencing precedes reuse; positive and unaffected controls share an evidence interval | Opened on alert, sealed after review, retained then expired by policy | D59-UC-02 |
From hardware bill of materials to schedulable bytes
Buying aggregate memory does not ensure that one pod fits or survives a machine failure. Capacity must be planned per node and per failure domain after subtracting operating-system, Kubernetes, and eviction reservations.
| Layer | Ziba-relevant choice | Failure if omitted | Decision rule |
|---|---|---|---|
| Facility | Independent power and cooling paths | One utility event removes every replica | Place required replicas across genuinely independent domains |
| Network | Redundant switches, routable node/pod/service plan, stable API endpoint | Nodes partition or clients lose API access | Validate loss of each path and preserve address ownership in IPAM |
| Control plane | Three members for quorum and API load balancing | One control-plane host becomes cluster-wide outage | Use odd quorum membership and tested backups/restores |
| Workers | Per-node CPU/RAM shape plus spare failure capacity | Ziba replacement cannot fit after one node fails | Plan N-1 schedulable requests, not average live usage |
| Storage | Replication, attach semantics, backup and restore | Rescheduled pod cannot reach durable content | Prove recovery point and recovery time with restore drills |
Bootstrap code versus rack and software effects
Declarative files do not rack servers or create network paths; they instruct already prepared software to establish cluster state. Every code review should name the prerequisite physical action and resulting durable state.
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.36.0
controlPlaneEndpoint: k8s-api.example.internal:6443
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
cpu: 500m
memory: 1Gi
kubeReserved:
cpu: 500m
memory: 1Gi
sudo kubeadm init --config cluster.yaml --upload-certs
kubectl get --raw='/readyz?verbose'
kubectl get nodes -o wide
kubectl -n kube-system get pods
| Code or action | Software/control-plane effect | Physical/network/storage effect | Deployment proof |
|---|---|---|---|
| Rack and cable approved machines | No Kubernetes object exists yet | Servers receive redundant power, switch links, and management reachability | Asset, port, power-path, and burn-in records |
kubeadm init | Creates certificates, static control-plane pods, initial etcd and join material on the first host | Uses that host's CPU, RAM, disks, clock, and network; creates no redundancy alone | API readiness, etcd membership, bootstrap log, immutable config revision |
| Join two more control planes | Adds API/controller/scheduler and etcd members according to topology | Consumes three distinct machines and network paths | Quorum and API endpoint survive one member loss |
| Install CNI | Deploys the Container Network Interface implementation and node agents | Programs host networking and possibly switch/router integrations | Pods communicate across nodes under policy |
| Create StorageClass/CSI integration | Defines dynamic volume behavior and deploys storage controllers/drivers | Allocates or attaches real array/local storage through provider APIs | Ziba volume survives pod replacement and restore drill |
| Apply Ziba Deployment | Controllers schedule processes onto workers | Consumes node CPU/RAM and pulls image bytes across the network | Revision, Ready replicas, endpoints, and reader probe |
kubeadm is a cluster bootstrap building block and can be integrated with provisioning systems, but its single-control-plane path has a single etcd failure point unless you deliberately build high availability and backups (Creating a cluster with kubeadm).
Operate what the cloud used to hide
Initial installation is a small fraction of ownership, so an on-premises decision must budget recurring work. The operating model should assign detection, authority, action, and proof for each layer.
| Responsibility | Recurring work | Decisive evidence |
|---|---|---|
| Facilities and hardware | Power/cooling tests, firmware, failed-part replacement, spares | Environmental telemetry, asset lifecycle, failure drill |
| Network and load balancing | Switch/router maintenance, IPAM/DNS, API and ingress load balancers | Path tests, configuration revision, failover duration |
| Linux and runtime | OS/kernel/runtime patching, image distribution, time sync | Compliance scan, rollout wave, rollback proof |
| Kubernetes control plane | Certificates, etcd backup/restore, version upgrades, admission and API availability | Restore drill, skew check, API SLO |
| Worker fleet | Capacity, drain/rebuild, labels/taints, kubelet configuration | N-1 scheduling test and replacement lead time |
| Workloads | Requests/limits, replicas, disruption budgets, application profiling | Ziba replay, restart/latency/error evidence |
Use on premises when legal locality, disconnected operation, specialized hardware, predictable utilization, or existing data-centre capability outweigh the operational burden. Avoid it when the organization cannot staff 24/7 ownership across facilities, network, storage, Linux, security, and Kubernetes; local hardware does not remove those responsibilities.
Key takeaways
An on-premises cluster turns organization-owned metal into schedulable machines through a long chain of independently failing systems. Kubernetes reconciles workloads only after power, network, storage, operating system, runtime, and control-plane quorum are already working.
- Design failure domains physically before spreading replicas logically.
- Treat kubeadm as bootstrap automation, not a managed platform.
- Join asset, node, build, and incident identities so replacement is safe and auditable.
Checklist
A cluster is not production-ready merely because every node is currently Ready. Verify that the owned system can lose, replace, restore, and upgrade components while preserving customer evidence.
- [ ] Mapped racks, power, switches, storage, control-plane members, and workers.
- [ ] Proved API endpoint and etcd behavior during one-member loss.
- [ ] Planned N-1 worker capacity from requests and per-node allocatable memory.
- [ ] Versioned bootstrap inputs without committing secrets.
- [ ] Replaced or fenced a failed node and replayed Ziba traffic.