{"id":8698,"date":"2026-07-25T07:04:32","date_gmt":"2026-07-25T07:04:32","guid":{"rendered":"https:\/\/www.prolimehost.com\/blogs\/?p=8698"},"modified":"2026-07-25T09:36:02","modified_gmt":"2026-07-25T09:36:02","slug":"how-to-build-a-kubernetes-cluster","status":"publish","type":"post","link":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/","title":{"rendered":"How to Build a Kubernetes Cluster: Step-by-Step Guide"},"content":{"rendered":"\n<p class=\"has-text-align-center wp-block-paragraph\"><img decoding=\"async\" width=\"1522\" height=\"1033\" class=\"wp-image-8724\" style=\"width: 700px\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg\" alt=\"How to Build a Kubernetes Cluster\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg 1522w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting-300x204.jpg 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting-1024x695.jpg 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting-512x348.jpg 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting-920x624.jpg 920w\" sizes=\"(max-width: 1522px) 100vw, 1522px\" \/><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes has become the default way to run containerized applications at scale, but building a cluster from scratch is still where a lot of engineers get stuck the first time around, not because the concepts are hard, but because the tooling assumes you already know which of the dozen configuration steps actually matter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide walks through building a production-style Kubernetes cluster using kubeadm, the official bootstrapping tool, covering infrastructure planning, control plane setup, worker node configuration, networking, and the operational details most tutorials skip.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ll be building a cluster with one control plane node and multiple worker nodes, using containerd as the container runtime and Calico for pod networking, running current <strong>Kubernetes 1.36<\/strong>.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Choosing_Your_Infrastructure_Before_You_Start\" >Choosing Your Infrastructure Before You Start<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#How_to_Build_a_Kubernetes_Cluster_Step-by-Step_Guide\" >How to Build a Kubernetes Cluster: Step-by-Step Guide<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Minimum_Requirements_Per_Node\" >Minimum Requirements Per Node<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_1_Prepare_Every_Node_Control_Plane_and_Workers\" >Step 1: Prepare Every Node (Control Plane and Workers)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Disable_Swap\" >Disable Swap<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Load_Required_Kernel_Modules\" >Load Required Kernel Modules<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Configure_Required_sysctl_Parameters\" >Configure Required sysctl Parameters.<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_2_Install_a_Container_Runtime\" >Step 2: Install a Container Runtime<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_3_Install_kubeadm_kubelet_and_kubectl\" >Step 3: Install kubeadm, kubelet, and kubectl<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_4_Initialize_the_Control_Plane\" >Step 4: Initialize the Control Plane<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Configure_kubectl_Access\" >Configure kubectl Access<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_5_Install_a_Pod_Network_Add-on_Calico\" >Step 5: Install a Pod Network Add-on (Calico)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_6_Join_Worker_Nodes_to_the_Cluster\" >Step 6: Join Worker Nodes to the Cluster<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Step_7_Deploy_a_Test_Workload\" >Step 7: Deploy a Test Workload<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Adding_GPU_Support_for_MLAI_Workloads\" >Adding GPU Support for ML\/AI Workloads<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Troubleshooting_Common_Cluster_Build_Issues\" >Troubleshooting Common Cluster Build Issues<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Choosing_Your_Infrastructure_Before_You_Start\"><\/span><strong>Choosing Your Infrastructure Before You Start<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before writing a single command, decide where your cluster will actually run. This decision affects performance, cost, and long-term flexibility more than almost anything else in this guide.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Managed Kubernetes services (EKS, GKE, AKS) handle the control plane for you, but they come with a real per-cluster cost and less control over the underlying hardware.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For teams that want full control, predictable pricing, and the ability to tune performance at the hardware level, building your cluster on <strong>dedicated server hosting<\/strong> is a common and cost-effective alternative. You get <a href=\"https:\/\/www.prolimehost.com\/blogs\/enterprise-server-acceptance-testing-process-before-production\/\" title=\"\">consistent CPU and network performance<\/a> without the noisy-neighbor issues that can come with shared cloud instances, and no per-cluster management fee eating into your budget.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your workloads involve machine learning, model training, or GPU-accelerated inference alongside your regular services, running at least some of your worker nodes on a <strong>GPU dedicated server<\/strong> is worth planning for from the start.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_to_Build_a_Kubernetes_Cluster_Step-by-Step_Guide\"><\/span><strong>How to Build a Kubernetes Cluster: Step-by-Step Guide<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To build a Kubernetes cluster on Ubuntu 24.04, start by disabling swap and loading required kernel modules (overlay, br_netfilter) on every node, then install containerd as the container runtime and configure it with SystemdCgroup = true.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, add the official Kubernetes APT repository and install kubeadm, kubelet, and kubectl on all nodes. On the control plane node, run <code>sudo kubeadm init --pod-network-cidr=192.168.0.0\/16<\/code> to bootstrap the cluster, configure kubectl access, and install a CNI plugin like Calico for pod networking.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, join each worker node to the cluster using the kubeadm join command generated during initialization, and verify all nodes show Ready with kubectl get nodes. The entire process typically takes 20\u201330 minutes across a small cluster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Minimum_Requirements_Per_Node\"><\/span><strong>Minimum Requirements Per Node<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Control plane node:<\/strong> 2 CPUs, 2 GB RAM minimum (4 GB+ recommended for production)<\/li>\n\n\n\n<li><strong>Worker nodes:<\/strong> 2 CPUs, 2 GB RAM minimum, scaled up based on workload<\/li>\n\n\n\n<li>A Linux distribution supported by kubeadm (Ubuntu 24.04\/26.04 LTS)<\/li>\n\n\n\n<li>Full network connectivity between all nodes, with unique hostnames, MAC addresses, and product_uuid for each<\/li>\n\n\n\n<li><strong>Swap disabled<\/strong> on every node; this is a hard requirement for kubelet to function correctly<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_1_Prepare_Every_Node_Control_Plane_and_Workers\"><\/span><strong>Step 1: Prepare Every Node (Control Plane and Workers)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run these steps identically on every machine that will join the cluster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Disable_Swap\"><\/span><strong>Disable Swap<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Kubelet can&#8217;t reliably enforce memory limits or evict pods under pressure if swap is active, so Kubernetes requires it to be off before the cluster will even initialize.<\/p>\n\n\n\n<pre>sudo swapoff -a<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><pre>sudo sed -i '\/ swap \/ s\/^\/#\/' \/etc\/fstab<\/pre><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"212\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19-1024x212.png\" alt=\"\" class=\"wp-image-8699\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19-1024x212.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19-300x62.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19-512x106.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19-920x190.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-19.png 1083w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Load_Required_Kernel_Modules\"><\/span><strong>Load Required Kernel Modules<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The overlay module enables containerd&#8217;s layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function.<\/p>\n\n\n\n<pre>cat &lt;&lt;EOF | sudo tee \/etc\/modules-load.d\/k8s.conf overlay br_netfilter EOF<\/pre>\n<pre>sudo modprobe overlay<\/pre>\n<pre>sudo modprobe br_netfilter<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"351\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20-1024x351.png\" alt=\"\" class=\"wp-image-8700\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20-1024x351.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20-300x103.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20-512x175.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20-920x315.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-20.png 1089w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configure_Required_sysctl_Parameters\"><\/span><strong>Configure Required sysctl Parameters.<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">These settings ensure that iptables processes traffic crossing network bridges and that the kernel forwards packets between pods, which Kubernetes networking depends on.<\/p>\n\n\n\n<pre>cat &lt;&lt;EOF | sudo tee \/etc\/sysctl.d\/k8s.confnet.bridge.bridge-nf-call-iptables&nbsp; = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 1EOF<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"295\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21-1024x295.png\" alt=\"\" class=\"wp-image-8701\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21-1024x295.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21-300x86.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21-512x147.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21-920x265.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-21.png 1084w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">These settings ensure traffic crossing network bridges is correctly processed by iptables, which Kubernetes networking depends on.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_2_Install_a_Container_Runtime\"><\/span><strong>Step 2: Install a Container Runtime<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes needs a container runtime that implements the Container Runtime Interface (CRI). <strong>containerd<\/strong> is the current standard choice.<\/p>\n\n\n\n<pre>sudo apt update<\/pre>\n<pre>sudo apt install -y containerd<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24-1024x572.png\" alt=\"\" class=\"wp-image-8704\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24-1024x572.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24-300x167.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24-512x286.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24-920x514.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-24.png 1089w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Generate and apply the default configuration:<\/p>\n\n\n\n<pre>sudo mkdir -p \/etc\/containerd<\/pre>\n<pre>containerd config default | sudo tee \/etc\/containerd\/config.toml<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22-1024x514.png\" alt=\"\" class=\"wp-image-8702\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22-1024x514.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22-300x151.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22-512x257.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22-920x462.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-22.png 1124w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then enable systemd cgroup management (required for kubelet compatibility):<\/p>\n\n\n\n<pre>sudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \/etc\/containerd\/config.toml<\/pre>\n<pre>sudo systemctl restart containerd<\/pre>\n<pre>sudo systemctl enable containerd<\/pre><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"242\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23-1024x242.png\" alt=\"\" class=\"wp-image-8703\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23-1024x242.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23-300x71.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23-512x121.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23-920x217.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-23.png 1132w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_3_Install_kubeadm_kubelet_and_kubectl\"><\/span><strong>Step 3: Install kubeadm, kubelet, and kubectl<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before adding the official Kubernetes APT repository, let\u2019s install some dependencies:<\/p>\n\n\n\n<pre>sudo apt install -y apt-transport-https ca-certificates curl gpg<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"507\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28-1024x507.png\" alt=\"\" class=\"wp-image-8708\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28-1024x507.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28-300x149.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28-512x253.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28-920x456.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-28.png 1125w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now, add the official Kubernetes APT repository and install the tooling:<\/p>\n\n\n\n<pre>curl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.36\/deb\/Release.key | \\&nbsp;&nbsp;sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/pre>\n<pre>echo 'deb [signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.36\/deb\/ \/' | \\&nbsp;&nbsp;sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"356\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25-1024x356.png\" alt=\"\" class=\"wp-image-8705\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25-1024x356.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25-300x104.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25-512x178.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25-920x320.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-25.png 1124w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, install kubeadm, kubelet, and kubectl as below:<\/p>\n\n\n\n<pre>sudo apt update<\/pre>\n<pre>sudo apt install -y kubelet kubeadm kubectl<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"570\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29-1024x570.png\" alt=\"\" class=\"wp-image-8709\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29-1024x570.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29-300x167.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29-512x285.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29-920x512.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-29.png 1125w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">apt-mark hold prevents these packages from being upgraded automatically during routine apt upgrade runs. Kubernetes upgrades should always be deliberate, one minor version at a time.<\/p>\n\n\n\n<pre>sudo apt-mark hold kubelet kubeadm kubectl<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"174\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26-1024x174.png\" alt=\"\" class=\"wp-image-8706\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26-1024x174.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26-300x51.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26-512x87.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26-920x156.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-26.png 1100w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_4_Initialize_the_Control_Plane\"><\/span><strong>Step 4: Initialize the Control Plane<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run this step only on your designated control plane node:<\/p>\n\n\n\n<pre>sudo kubeadm init --pod-network-cidr=192.168.0.0\/16<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"384\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27-1024x384.png\" alt=\"\" class=\"wp-image-8707\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27-1024x384.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27-300x112.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27-512x192.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27-920x345.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-27.png 1126w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>--pod-network-cidr<\/code> value must match what your chosen CNI plugin (Calico, in this guide) expects.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"375\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31-1024x375.png\" alt=\"\" class=\"wp-image-8711\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31-1024x375.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31-300x110.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31-512x188.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31-920x337.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-31.png 1121w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This step takes a few minutes and, on success, prints a kubeadm join command containing a token; save this immediately, since the token expires after 24 hours.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configure_kubectl_Access\"><\/span><strong>Configure kubectl Access<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">kubeadm init generates the cluster&#8217;s admin credentials in a root-owned file, so this copies them into your user&#8217;s home directory and fixes ownership, letting you run kubectl commands without sudo every time.<\/p>\n\n\n\n<pre>mkdir -p $HOME\/.kube<\/pre>\n<pre>sudo cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config<\/pre>\n<pre>sudo chown $(id -u):$(id -g) $HOME\/.kube\/config<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"201\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30-1024x201.png\" alt=\"\" class=\"wp-image-8710\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30-1024x201.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30-300x59.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30-512x101.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30-920x181.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-30.png 1115w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the control plane is responding:<\/p>\n\n\n\n<pre>kubectl get nodes<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"947\" height=\"272\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-33.png\" alt=\"\" class=\"wp-image-8713\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-33.png 947w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-33-300x86.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-33-512x147.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-33-920x264.png 920w\" sizes=\"(max-width: 947px) 100vw, 947px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The control plane node will show as Ready at this point.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_5_Install_a_Pod_Network_Add-on_Calico\"><\/span><strong>Step 5: Install a Pod Network Add-on (Calico)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes doesn&#8217;t ship with built-in pod networking; you need a CNI plugin. Calico is a solid, widely used default:<\/p>\n\n\n\n<pre>kubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/calico\/v3.29.0\/manifests\/calico.yaml<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"167\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32-1024x167.png\" alt=\"\" class=\"wp-image-8712\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32-1024x167.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32-300x49.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32-512x83.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32-920x150.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-32.png 1192w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Give it a minute, then verify:<\/p>\n\n\n\n<pre>kubectl get pods -n kube-system<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"370\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37-1024x370.png\" alt=\"\" class=\"wp-image-8717\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37-1024x370.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37-300x108.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37-512x185.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37-920x332.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-37.png 1337w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Your control plane node should now show Ready.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_6_Join_Worker_Nodes_to_the_Cluster\"><\/span><strong>Step 6: Join Worker Nodes to the Cluster<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On each worker node, run the join command you saved from Step 4:<\/p>\n\n\n\n<pre>sudo kubeadm join &lt;control-plane-ip&gt;:6443 --token &lt;token&gt; \\&nbsp;&nbsp;--discovery-token-ca-cert-hash sha256:&lt;hash&gt;<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"472\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38-1024x472.png\" alt=\"\" class=\"wp-image-8718\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38-1024x472.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38-300x138.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38-512x236.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38-920x424.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-38.png 1207w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If your token has expired, generate a new one from the control plane:<\/p>\n\n\n\n<pre>kubeadm token create --print-join-command<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Back on the control plane, confirm all workers have joined successfully:<\/p>\n\n\n\n<pre>kubectl get nodes<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"947\" height=\"272\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-34.png\" alt=\"\" class=\"wp-image-8714\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-34.png 947w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-34-300x86.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-34-512x147.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-34-920x264.png 920w\" sizes=\"(max-width: 947px) 100vw, 947px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">All nodes should eventually show Ready once the CNI has propagated to them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step_7_Deploy_a_Test_Workload\"><\/span><strong>Step 7: Deploy a Test Workload<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm the cluster is fully functional by deploying something real:<\/p>\n\n\n\n<pre>kubectl create deployment nginx --image=nginx --replicas=3<\/pre>\n<pre>kubectl get deployment<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"340\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35-1024x340.png\" alt=\"\" class=\"wp-image-8715\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35-1024x340.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35-300x100.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35-512x170.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35-920x306.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-35.png 1063w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If pods are distributed across your worker nodes and reachable through the exposed service, your cluster is working correctly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Adding_GPU_Support_for_MLAI_Workloads\"><\/span><strong>Adding GPU Support for ML\/AI Workloads<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re running machine learning inference or training workloads, GPU-enabled worker nodes need extra setup beyond a standard join. On any worker node built on a <strong>GPU-dedicated server<\/strong>, install the appropriate NVIDIA drivers first, then deploy the NVIDIA device plugin so Kubernetes can schedule GPU resources:<\/p>\n\n\n\n<pre>kubectl apply -f https:\/\/raw.githubusercontent.com\/NVIDIA\/k8s-device-plugin\/main\/nvidia-device-plugin.yml<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"262\" src=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-1024x262.png\" alt=\"\" class=\"wp-image-8716\" srcset=\"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-1024x262.png 1024w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-300x77.png 300w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-1536x393.png 1536w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-512x131.png 512w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36-920x235.png 920w, https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/image-36.png 1548w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Once deployed, GPU resources become schedulable in your pod specs via resources.limits.&#8221;nvidia.com\/gpu&#8221;, letting you target GPU-equipped nodes specifically for ML workloads while keeping general-purpose services on standard nodes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Troubleshooting_Common_Cluster_Build_Issues\"><\/span><strong>Troubleshooting Common Cluster Build Issues<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Node stuck in NotReady<\/strong>: Almost always means the CNI plugin isn&#8217;t fully deployed yet. Check with kubectl get pods -n kube-system and look for CrashLoopBackOff on Calico pods.<\/li>\n\n\n\n<li><strong>kubeadm join fails with a certificate error: <\/strong>Your join token or CA cert hash has likely expired. Generate a fresh one with kubeadm token <code>create --print-join-command<\/code> on the control plane.<\/li>\n\n\n\n<li><strong>Pods stuck in Pending<\/strong>: Usually a resource constraint or a taint on your control plane node prevents scheduling. Check with kubectl describe pod &lt;pod-name&gt; for the exact reason.<\/li>\n\n\n\n<li><strong>kubelet won&#8217;t start<\/strong>: Check that swap is actually disabled (free -h should show 0 under swap) and review logs with journalctl -u kubelet -f.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span><strong>Conclusion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Building a Kubernetes cluster with kubeadm comes down to a consistent sequence: prepare every node identically, install a container runtime, bootstrap the control plane, install pod networking, then join your workers one at a time. The tooling handles most of the complexity for you; the parts that actually require judgment are your infrastructure choices up front, whether that&#8217;s picking reliable <strong><a href=\"https:\/\/www.prolimehost.com\/\" title=\"\">dedicated server hosting<\/a><\/strong> for consistent performance or provisioning a <strong><a href=\"https:\/\/www.prolimehost.com\/gpu-dedicated-servers\/\" title=\"\">GPU dedicated server<\/a><\/strong> for ML workloads, and your operational discipline afterward around etcd backups, RBAC, and high availability. Get those right, and the cluster itself becomes the easy part.<\/p>\n","protected":false},"excerpt":{"rendered":"Kubernetes has become the default way to run containerized applications at scale, but building a cluster from scratch&hellip;","protected":false},"author":5,"featured_media":8724,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","footnotes":""},"categories":[10],"tags":[297,296,298,299],"class_list":["post-8698","post","type-post","status-publish","format-standard","has-post-thumbnail","category-tutorials-tips","tag-containers","tag-kubernetes","tag-kubernetes-cluster","tag-ubuntu-26-04","cs-entry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Load Required Kernel Modules The overlay module enables containerd&#039;s layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Karim Buzdar\"\/>\n\t<meta name=\"keywords\" content=\"containers,kubernetes,kubernetes cluster,ubuntu 26.04\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Blogs | Official ProlimeHost Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs\" \/>\n\t\t<meta property=\"og:description\" content=\"Load Required Kernel Modules The overlay module enables containerd&#039;s layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-25T07:04:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-25T09:36:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Prolimehost\/\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@prolimehost\" \/>\n\t\t<meta name=\"twitter:title\" content=\"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Load Required Kernel Modules The overlay module enables containerd&#039;s layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@prolimehost\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#article\",\"name\":\"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs\",\"headline\":\"How to Build a Kubernetes Cluster: Step-by-Step Guide\",\"author\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/author\\\/prolimekarim\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg\",\"width\":1522,\"height\":1033,\"caption\":\"How to Build a Kubernetes Cluster\"},\"datePublished\":\"2026-07-25T07:04:32+00:00\",\"dateModified\":\"2026-07-25T09:36:02+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#webpage\"},\"articleSection\":\"Tutorials &amp; Tips, Containers, Kubernetes, Kubernetes Cluster, Ubuntu 26.04\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/category\\\/tutorials-tips\\\/#listItem\",\"name\":\"Tutorials &amp; Tips\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/category\\\/tutorials-tips\\\/#listItem\",\"position\":2,\"name\":\"Tutorials &amp; Tips\",\"item\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/category\\\/tutorials-tips\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#listItem\",\"name\":\"How to Build a Kubernetes Cluster: Step-by-Step Guide\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#listItem\",\"position\":3,\"name\":\"How to Build a Kubernetes Cluster: Step-by-Step Guide\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/category\\\/tutorials-tips\\\/#listItem\",\"name\":\"Tutorials &amp; Tips\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/#organization\",\"name\":\"Blogs\",\"description\":\"Official ProlimeHost Blog\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/\",\"email\":\"admin@prolimehost.com\",\"telephone\":\"+18774779454\",\"foundingDate\":\"2004-04-15\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":15,\"maxValue\":25},\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/Prolimehost-logo1-scaled-e1755887631205.png\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#organizationLogo\"},\"image\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Prolimehost\\\/\",\"https:\\\/\\\/x.com\\\/prolimehost\",\"https:\\\/\\\/www.instagram.com\\\/prolimehost\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/prolimehost\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/author\\\/prolimekarim\\\/#author\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/author\\\/prolimekarim\\\/\",\"name\":\"Karim Buzdar\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91ee1fc71124c251eda2203e491ee5548a858916cef9f69d9b60786f9e8ce627?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Karim Buzdar\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#webpage\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/\",\"name\":\"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs\",\"description\":\"Load Required Kernel Modules The overlay module enables containerd's layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/author\\\/prolimekarim\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/author\\\/prolimekarim\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#mainImage\",\"width\":1522,\"height\":1033,\"caption\":\"How to Build a Kubernetes Cluster\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/how-to-build-a-kubernetes-cluster\\\/#mainImage\"},\"datePublished\":\"2026-07-25T07:04:32+00:00\",\"dateModified\":\"2026-07-25T09:36:02+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/#website\",\"url\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/\",\"name\":\"ProlimeHost Blog\",\"description\":\"Official ProlimeHost Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.prolimehost.com\\\/blogs\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs<\/title>\n\n","aioseo_head_json":{"title":"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs","description":"Load Required Kernel Modules The overlay module enables containerd's layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat","canonical_url":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/","robots":"max-image-preview:large","keywords":"containers,kubernetes,kubernetes cluster,ubuntu 26.04","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#article","name":"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs","headline":"How to Build a Kubernetes Cluster: Step-by-Step Guide","author":{"@id":"https:\/\/www.prolimehost.com\/blogs\/author\/prolimekarim\/#author"},"publisher":{"@id":"https:\/\/www.prolimehost.com\/blogs\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg","width":1522,"height":1033,"caption":"How to Build a Kubernetes Cluster"},"datePublished":"2026-07-25T07:04:32+00:00","dateModified":"2026-07-25T09:36:02+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#webpage"},"isPartOf":{"@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#webpage"},"articleSection":"Tutorials &amp; Tips, Containers, Kubernetes, Kubernetes Cluster, Ubuntu 26.04"},{"@type":"BreadcrumbList","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs#listItem","position":1,"name":"Home","item":"https:\/\/www.prolimehost.com\/blogs","nextItem":{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/#listItem","name":"Tutorials &amp; Tips"}},{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/#listItem","position":2,"name":"Tutorials &amp; Tips","item":"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#listItem","name":"How to Build a Kubernetes Cluster: Step-by-Step Guide"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#listItem","position":3,"name":"How to Build a Kubernetes Cluster: Step-by-Step Guide","previousItem":{"@type":"ListItem","@id":"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/#listItem","name":"Tutorials &amp; Tips"}}]},{"@type":"Organization","@id":"https:\/\/www.prolimehost.com\/blogs\/#organization","name":"Blogs","description":"Official ProlimeHost Blog","url":"https:\/\/www.prolimehost.com\/blogs\/","email":"admin@prolimehost.com","telephone":"+18774779454","foundingDate":"2004-04-15","numberOfEmployees":{"@type":"QuantitativeValue","minValue":15,"maxValue":25},"logo":{"@type":"ImageObject","url":"https:\/\/www.prolimehost.com\/wp-content\/uploads\/sites\/4\/Prolimehost-logo1-scaled-e1755887631205.png","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#organizationLogo"},"image":{"@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/Prolimehost\/","https:\/\/x.com\/prolimehost","https:\/\/www.instagram.com\/prolimehost\/","https:\/\/www.linkedin.com\/company\/prolimehost\/"]},{"@type":"Person","@id":"https:\/\/www.prolimehost.com\/blogs\/author\/prolimekarim\/#author","url":"https:\/\/www.prolimehost.com\/blogs\/author\/prolimekarim\/","name":"Karim Buzdar","image":{"@type":"ImageObject","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/91ee1fc71124c251eda2203e491ee5548a858916cef9f69d9b60786f9e8ce627?s=96&d=mm&r=g","width":96,"height":96,"caption":"Karim Buzdar"}},{"@type":"WebPage","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#webpage","url":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/","name":"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs","description":"Load Required Kernel Modules The overlay module enables containerd's layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.prolimehost.com\/blogs\/#website"},"breadcrumb":{"@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#breadcrumblist"},"author":{"@id":"https:\/\/www.prolimehost.com\/blogs\/author\/prolimekarim\/#author"},"creator":{"@id":"https:\/\/www.prolimehost.com\/blogs\/author\/prolimekarim\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.prolimehost.com\/blogs\/wp-content\/uploads\/sites\/4\/How-to-Build-a-Kubernetes-Cluster-prolimehost-dedicated-server-hosting.jpg","@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#mainImage","width":1522,"height":1033,"caption":"How to Build a Kubernetes Cluster"},"primaryImageOfPage":{"@id":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/#mainImage"},"datePublished":"2026-07-25T07:04:32+00:00","dateModified":"2026-07-25T09:36:02+00:00"},{"@type":"WebSite","@id":"https:\/\/www.prolimehost.com\/blogs\/#website","url":"https:\/\/www.prolimehost.com\/blogs\/","name":"ProlimeHost Blog","description":"Official ProlimeHost Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.prolimehost.com\/blogs\/#organization"}}]},"og:locale":"en_US","og:site_name":"Blogs | Official ProlimeHost Blog","og:type":"article","og:title":"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs","og:description":"Load Required Kernel Modules The overlay module enables containerd's layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat","og:url":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/","article:published_time":"2026-07-25T07:04:32+00:00","article:modified_time":"2026-07-25T09:36:02+00:00","article:publisher":"https:\/\/www.facebook.com\/Prolimehost\/","twitter:card":"summary","twitter:site":"@prolimehost","twitter:title":"How to Build a Kubernetes Cluster: Step-by-Step Guide | Blogs","twitter:description":"Load Required Kernel Modules The overlay module enables containerd's layered filesystem, and br_netfilter lets bridged network traffic be seen and filtered by iptables; both are required for pod networking to function. cat","twitter:creator":"@prolimehost"},"aioseo_meta_data":{"post_id":"8698","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"seo_analyzer_scan_date":"2026-07-25 09:36:35","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-24 21:52:25","updated":"2026-07-25 09:36:35"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.prolimehost.com\/blogs\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/\" title=\"Tutorials &amp; Tips\">Tutorials &amp; Tips<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tHow to Build a Kubernetes Cluster: Step-by-Step Guide\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.prolimehost.com\/blogs"},{"label":"Tutorials &amp; Tips","link":"https:\/\/www.prolimehost.com\/blogs\/category\/tutorials-tips\/"},{"label":"How to Build a Kubernetes Cluster: Step-by-Step Guide","link":"https:\/\/www.prolimehost.com\/blogs\/how-to-build-a-kubernetes-cluster\/"}],"_links":{"self":[{"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/posts\/8698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/comments?post=8698"}],"version-history":[{"count":17,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/posts\/8698\/revisions"}],"predecessor-version":[{"id":8743,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/posts\/8698\/revisions\/8743"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/media\/8724"}],"wp:attachment":[{"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/media?parent=8698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/categories?post=8698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.prolimehost.com\/blogs\/wp-json\/wp\/v2\/tags?post=8698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}