59

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 IDActorCustomer jobSuccess outcomeDenial or recovery evidence
D59-UC-01Platform engineerProvision a production on-premises cluster and deploy ZibaMultiple control-plane and worker nodes become Ready; readers reach Ziba through a stable endpointBootstrap stops when network, time, version, or capacity prerequisites fail; no partial cluster is promoted
D59-UC-02Data-centre operatorReplace a failed worker without losing service or auditabilityWorkloads drain or reschedule, replacement hardware joins, and Ziba remains within its availability objectiveFailed-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 IDUse case IDsUser storyObservable acceptance conditions
D59-US-01D59-UC-01As a platform engineer, I want reproducible rack-to-cluster inputs, so that Ziba can be rebuilt without undocumented console stateInventory, firmware/OS baseline, API virtual address, kubeadm configuration, network plugin, storage class, and deployment revision are versioned; route and node checks pass
D59-US-02D59-UC-02As a data-centre operator, I want a rehearsed failed-node replacement path, so that hardware faults do not become an improvised application outageFailure 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 IDUse case IDsPathTriggerNumbered stepsTerminal evidence
D59-FLOW-01D59-UC-01HappyPlatform engineer approves the on-premises cluster build1. 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-02D59-UC-02RecoveryReader probe degrades after worker power loss1. 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 IDEntry pointResponsible servicesAuthoritative storeFailure evidence
D59-UC-01Approved infrastructure inventory and cluster build pipelineDCIM/IPAM, DHCP or static networking, DNS, API load balancer, Linux provisioning, kubeadm, etcd, CNI, CSI, Kubernetes controllersVersioned inventory/configuration plus etcd for Kubernetes stateUnreachable API endpoint, lost etcd quorum, node NotReady, CNI failure, storage attach failure, or Ziba probe failure
D59-UC-02Facility/node alert and replacement runbookMonitoring, out-of-band management, switch/storage controllers, Kubernetes drain/cordon, bare-metal provisioner, kubeletIncident record, hardware asset system, Kubernetes node/pod stateUnfenced 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 entityStore and ownerPrimary keyForeign key or opaque referenceTenant keyMaterial constraintLifecycle and deletionUse case IDs
PhysicalMachineAsset/DCIM system, owned by data-centre operationsAsset ID or chassis serialRack, power-circuit, switch-port, and baseboard referencesNone — physical inventory is organization-scopedOne active role and management identity per asset; failure domain must be recordedProcured, racked, reassigned, wiped, retired, and retained for auditD59-UC-01, D59-UC-02
ClusterNodeKubernetes API store, owned by kubelet/platformNode UIDOpaque physical asset and provisioning-run referencesCluster IDNode identity is unique; approved labels/taints reflect actual hardware and failure domainRegistered, cordoned, drained, deleted; evidence retained beyond object deletionD59-UC-01, D59-UC-02
ClusterBuildRevisionGit and pipeline store, owned by platform engineeringRepository commit plus run IDOpaque inventory snapshot and secret-version referencesCluster IDInputs are reviewed; secrets are referenced, not committed; one promoted revision per environmentProposed, validated, promoted, superseded, retained by audit policyD59-UC-01
ReplacementEvidenceIncident store, owned by operationsIncident ID plus action ordinalFailed asset, old node UID, new asset, and new node UIDCluster IDFencing precedes reuse; positive and unaffected controls share an evidence intervalOpened on alert, sealed after review, retained then expired by policyD59-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.

LayerZiba-relevant choiceFailure if omittedDecision rule
FacilityIndependent power and cooling pathsOne utility event removes every replicaPlace required replicas across genuinely independent domains
NetworkRedundant switches, routable node/pod/service plan, stable API endpointNodes partition or clients lose API accessValidate loss of each path and preserve address ownership in IPAM
Control planeThree members for quorum and API load balancingOne control-plane host becomes cluster-wide outageUse odd quorum membership and tested backups/restores
WorkersPer-node CPU/RAM shape plus spare failure capacityZiba replacement cannot fit after one node failsPlan N-1 schedulable requests, not average live usage
StorageReplication, attach semantics, backup and restoreRescheduled pod cannot reach durable contentProve 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 actionSoftware/control-plane effectPhysical/network/storage effectDeployment proof
Rack and cable approved machinesNo Kubernetes object exists yetServers receive redundant power, switch links, and management reachabilityAsset, port, power-path, and burn-in records
kubeadm initCreates certificates, static control-plane pods, initial etcd and join material on the first hostUses that host's CPU, RAM, disks, clock, and network; creates no redundancy aloneAPI readiness, etcd membership, bootstrap log, immutable config revision
Join two more control planesAdds API/controller/scheduler and etcd members according to topologyConsumes three distinct machines and network pathsQuorum and API endpoint survive one member loss
Install CNIDeploys the Container Network Interface implementation and node agentsPrograms host networking and possibly switch/router integrationsPods communicate across nodes under policy
Create StorageClass/CSI integrationDefines dynamic volume behavior and deploys storage controllers/driversAllocates or attaches real array/local storage through provider APIsZiba volume survives pod replacement and restore drill
Apply Ziba DeploymentControllers schedule processes onto workersConsumes node CPU/RAM and pulls image bytes across the networkRevision, 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.

ResponsibilityRecurring workDecisive evidence
Facilities and hardwarePower/cooling tests, firmware, failed-part replacement, sparesEnvironmental telemetry, asset lifecycle, failure drill
Network and load balancingSwitch/router maintenance, IPAM/DNS, API and ingress load balancersPath tests, configuration revision, failover duration
Linux and runtimeOS/kernel/runtime patching, image distribution, time syncCompliance scan, rollout wave, rollback proof
Kubernetes control planeCertificates, etcd backup/restore, version upgrades, admission and API availabilityRestore drill, skew check, API SLO
Worker fleetCapacity, drain/rebuild, labels/taints, kubelet configurationN-1 scheduling test and replacement lead time
WorkloadsRequests/limits, replicas, disruption budgets, application profilingZiba 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.