{"id":22849,"date":"2026-08-25T14:16:08","date_gmt":"2026-08-25T08:46:08","guid":{"rendered":"https:\/\/www.youstable.com\/blog\/?p=22849"},"modified":"2026-08-25T14:16:10","modified_gmt":"2026-08-25T08:46:10","slug":"kubernetes-on-vps","status":"publish","type":"post","link":"https:\/\/www.youstable.com\/blog\/kubernetes-on-vps\/","title":{"rendered":"Kubernetes on VPS: Installation &#038; Setup Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">My client called me at midnight last winter. His app had crashed and every user of his app was locked out. It was only one server that crashed and nothing sent the traffic of the app anywhere else.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That night pushed me toward Kubernetes. I rebuilt the entire setup on a VPS and the same crash never took the app offline back again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since then, my team and I have built Kubernetes on VPS servers a lot of times. We have done it for tiny startups and even for our own tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here, in this guide, I&#8217;ll tell you every step that I take.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have explained to you how you can go use your bare VPS server and set up Kubernetes with real commands you can copy and paste.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s get started.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before we put even a single command in the powershell , let me explain the tool in words a newbie can also understand.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"what-is-kubernetes\">What Is Kubernetes?&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes is a system that runs your apps inside small boxes called containers. Kubernetes keeps the containers (means the place where the code that makes up your app is kept) alive across many servers at once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of it as a smart manager. You tell it what you want running and it makes sure many healthy copies stay up 24\/7.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One thing I&#8217;ve also seen is that developers often write kubernetes as K8s. The 8 means the eight letters between the K and the s. Same tool, shorter name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When one server falls, Kubernetes moves your app to a server that still works. Setting up Kubernetes on the VPS saved my client that night.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1035\" height=\"702\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-71.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 1\" class=\"wp-image-22850\" style=\"aspect-ratio:1.475177304964539;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-71.png 1035w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-71-767x520.png 767w\" sizes=\"auto, (max-width: 1035px) 100vw, 1035px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That safety (the app runs securely without interruptions 24\/7) is the whole reason I usually pair Kubernetes with a VPS.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let me show you why the combo makes so much sense.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"why-run-kubernetes-on-a-vps\">Why Run Kubernetes on a VPS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A lot of my clients have asked me this question that why do I run Kubernetes on a VPS. So, to understand that, you need to know what a VPS actually is.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A VPS or virtual private server, is a slice of a real physical server. Using virtualization technology, a big physical server is divided into various VPS servers where each virtual machine has its own dedicated RAM, CPU cores and NVMe storage.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You also get full root access (via SSH key) where you can connect to the VPS securely. You also get a fixed amount of power and full control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One more thing! Why VPS? Why not big <strong><a href=\"https:\/\/www.youstable.com\/dedicated-servers\/\">dedicated servers<\/a><\/strong>? See! Kubernetes on big cloud servers is really costly. Physical servers have a great deal of resources that lie idle when you run Kubernetes on it for startup apps.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This way you end up wasting money.\u00a0<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A VPS keeps the cost flat and clear, which my team loves for small and mid-size projects.<\/li>\n\n\n\n<li>You also learn far more this way. When you build Kubernetes on VPS by hand, you see every step instead of clicking a magic button.<\/li>\n\n\n\n<li>And you own the whole stack (the entire VPS server where Kubernetes runs to manage your containers where your app codes stay).\u00a0<\/li>\n\n\n\n<li>VPS gives you dedicated resources, plus it has no sharing members (you are the boss of your VPS) and there are no restrictions when your traffic goes up on a busy day.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Before setting up Kubernetes, let me name the parts you should be knowing about, so the things never seem difficult to you.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"why-youstable-vps-is-a-smart-home-for-kubernetes\">Why YouStable VPS Is a Smart Home for Kubernetes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every command stays on your server. A weak VPS makes each step slow, so the VPS server you run truly matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team runs Kubernetes on <strong><a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">YouStable VPS<\/a><\/strong> and I want to share why we do it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First of all, YouStable VPS gives you full root access on every plan. Kubernetes needs 100% control over the system and therefore full root gives you exactly that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second of all, the login stays safe with SSH key access. You get an SSH key using which you can securely enter into a VPS server. You skip weak passwords and sign in with a key, which keeps your working environment hard to break into.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The servers run on NVMe SSD storage and KVM virtualization. Fast disks mean quick pod starts and snappy commands, even when the cluster gets busy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can place nodes in India, the USA, or the Netherlands. Servers close to your users cut lag, and my team leans on this a lot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Support answers day and night. When a node acts up at 2 AM, a real person helps you out instead of a canned script.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Pro Tip<\/strong>: For a first cluster, my team runs three small YouStable VPS nodes over one big box. You get real failover practice for a low monthly cost.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can spin up a Kubernetes-ready node in minutes. Grab a plan that has room to grow at the link below.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Start here:<\/strong> <a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">https:\/\/www.youstable.com\/vps-hosting\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With a strong server under you, let me get back to the build. Time to switch on the cluster brain.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"what-each-part-of-a-cluster-does\">What Each Part of a Cluster Does?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Kubernetes cluster has a few key parts. Once you know them, every command in this guide clicks into place.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The control plane is the boss. It decides what runs where, tracks health, and hands orders to the rest of the cluster.<\/li>\n\n\n\n<li>A worker node is the workhorse. It runs your actual apps and reports back to the control plane all day long.<\/li>\n\n\n\n<li>A pod is the smallest unit. It wraps one or more containers, and Kubernetes starts, moves, and heals pods for you.<\/li>\n\n\n\n<li>A deployment is your wish list. You tell it how many copies to keep, and Kubernetes makes that number true and holds it.<\/li>\n\n\n\n<li>kubectl is your voice. Every request you type flows through it to the control plane, which then acts on your words.<\/li>\n\n\n\n<li>When a pod dies, Kubernetes notices in seconds. It starts a fresh copy at once, so your users rarely feel the hiccup.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Note<\/strong>: You do not need to memorise these. My team still keeps a cheat sheet nearby, and the names sink in after your first real build.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Alright, enough background. Let me walk you through exactly what you need before the first command runs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"what-you-need-before-you-start\">What You Need Before You Start?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have run this setup on fresh servers hundreds of times. The list below is the exact starting point my team uses on every single build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need at least two servers for a real cluster. One acts as the boss, called the control plane, and the rest run your apps as worker nodes.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\"><strong>Requirement<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>Minimum<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>What My Team Recommends<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Servers<\/td><td class=\"has-text-align-center\" data-align=\"center\">2 nodes<\/td><td class=\"has-text-align-center\" data-align=\"center\">3 nodes (1 boss, 2 workers)<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">CPU<\/td><td class=\"has-text-align-center\" data-align=\"center\">2 vCPU per node<\/td><td class=\"has-text-align-center\" data-align=\"center\">2 to 4 vCPU per node<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">RAM<\/td><td class=\"has-text-align-center\" data-align=\"center\">2 GB per node<\/td><td class=\"has-text-align-center\" data-align=\"center\">4 GB per node<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Storage<\/td><td class=\"has-text-align-center\" data-align=\"center\">20 GB SSD<\/td><td class=\"has-text-align-center\" data-align=\"center\">40 GB NVMe SSD<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">OS<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ubuntu 22.04+<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ubuntu 24.04 LTS<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Access<\/td><td class=\"has-text-align-center\" data-align=\"center\">Root or sudo SSH<\/td><td class=\"has-text-align-center\" data-align=\"center\">SSH key login<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can run a single-node cluster for practice. Still, I always suggest two nodes so the whole setup feels like the real thing.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Note<\/strong>: Every command here was tested by my team on Ubuntu 24.04 with Kubernetes v1.36 in July 2026. They run the same on Debian with tiny tweaks.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the full road map before we dig in. Keep this table open in another tab and treat it as your checklist.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"the-setup-plan-at-a-glance\">The Setup Plan at a Glance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">My team broke the whole job into ten clean steps. Each one builds on the last, so follow them in order for a smooth, calm run.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\"><strong>Step<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>What It Does<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1. Prepare servers<\/td><td class=\"has-text-align-center\" data-align=\"center\">Set names and update packages<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2. Turn off swap<\/td><td class=\"has-text-align-center\" data-align=\"center\">Kubernetes needs swap disabled<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3. Kernel modules<\/td><td class=\"has-text-align-center\" data-align=\"center\">Let servers pass pod traffic<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4. Install containerd<\/td><td class=\"has-text-align-center\" data-align=\"center\">The engine that runs containers<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5. Install the tools<\/td><td class=\"has-text-align-center\" data-align=\"center\">Add kubeadm, kubelet, kubectl<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6. Start control plane<\/td><td class=\"has-text-align-center\" data-align=\"center\">Build the cluster boss<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7. Set up kubectl<\/td><td class=\"has-text-align-center\" data-align=\"center\">Let you send commands<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">8. Pod network<\/td><td class=\"has-text-align-center\" data-align=\"center\">Let pods talk to each other<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">9. Join workers<\/td><td class=\"has-text-align-center\" data-align=\"center\">Add your app servers<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10. Test it<\/td><td class=\"has-text-align-center\" data-align=\"center\">Deploy a real, live app<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ten steps sound like a lot. Trust me, most take under a minute once you find the rhythm. Let&#8217;s dive in.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"how-to-setup-kubernetes-on-vps\">How to Setup Kubernetes on VPS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Below, I\u2019ve done the exact steps that you need to do to set up kubernetes on VPS. First, you have to buy VPS from a reliable VPS provider and they will give you your VPS login credentials via SSH. After logging in to the VPS, you need to carry on with these steps exactly how I\u2019ve done it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-1-prepare-every-server\">Step 1: Prepare Every Server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run this first part on every server, both the control plane and the workers. It sets the stage so nothing breaks on you later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Give each server a clear name. This helps you know which machine you sit on, since every terminal window looks the same.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo hostnamectl set-hostname control-plane \u00a0 # on the bosssudo hostnamectl set-hostname worker-1\u00a0 \u00a0 \u00a0 \u00a0 # on a worker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now add each server&#8217;s name and private IP to the hosts file. This lets your servers find each other by name, not just by numbers.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1150\" height=\"731\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-67.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 2\" class=\"wp-image-22853\" style=\"aspect-ratio:1.5757575757575757;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-67.png 1150w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-67-768x488.png 768w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/hosts# add lines like these, with your own real IPs10.0.0.10 control-plane10.0.0.11 worker-1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then update the packages on every box. Fresh packages mean fewer bugs and fewer surprises during the install.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt upgrade -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With names set and packages fresh, we hit the one setting that trips up almost every single beginner.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-2-turn-off-swap\">Step 2: Turn Off Swap<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Swap is spare disk space that acts like extra memory. Kubernetes wants it off so it can read real memory the right way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Switch it off with two short commands. The first stops swap now, and the second keeps it off after a reboot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo swapoff -asudo sed -i '\/ swap \/ s\/^\\(.*\\)$\/#\\1\/g' \/etc\/fstab<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run these on every server. Skip this, and your cluster may refuse to start with a confusing, hard-to-read error.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1150\" height=\"755\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-70.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 3\" class=\"wp-image-22852\" style=\"aspect-ratio:1.5256723716381417;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-70.png 1150w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-70-768x504.png 768w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Pro Tip<\/strong>: Run every step on all servers unless I clearly say control plane only. My team keeps three terminals open side by side for this.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Next we tell the Linux kernel to allow the network traffic that your pods will lean on.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-3-load-kernel-modules-and-network-settings\">Step 3: Load Kernel Modules and Network Settings<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pods need to send traffic across your servers. Two small kernel modules make that possible, so let me switch them on for you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The overlay and br_netfilter modules handle how containers share the network. Load them with the short block below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &lt;&lt;EOF | sudo tee \/etc\/modules-load.d\/k8s.confoverlaybr_netfilterEOF\u00a0sudo modprobe overlaysudo modprobe br_netfilter<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now set a few network rules so traffic flows the right way between pods. Kubernetes checks for these during the setup.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1141\" height=\"731\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-68.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 4\" class=\"wp-image-22851\" style=\"aspect-ratio:1.56;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-68.png 1141w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-68-768x492.png 768w\" sizes=\"auto, (max-width: 1141px) 100vw, 1141px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &lt;&lt;EOF | sudo tee \/etc\/sysctl.d\/k8s.confnet.bridge.bridge-nf-call-iptables\u00a0 = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = 1EOF\u00a0sudo sysctl --system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These lines look scary. They simply let one server pass pod traffic to another and never drop it. Run them on every node.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now we install the real engine that runs your containers under the hood.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-4-install-containerd-the-container-runtime\">Step 4: Install containerd, the Container Runtime<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A container runtime is the program that actually starts and stops your containers. Kubernetes needs one, and containerd is the runtime my team trusts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Docker used to fill this role. Kubernetes dropped that path a while back, so we now use containerd on its own.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install -y containerd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create its default settings file. This gives containerd a clean base to work from.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/etc\/containerdcontainerd config default | sudo tee \/etc\/containerd\/config.toml > \/dev\/null<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">One setting matters a lot. Flip SystemdCgroup to true so containerd and Kubernetes agree on how to track resources.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1147\" height=\"765\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-69.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 5\" class=\"wp-image-22854\" style=\"aspect-ratio:1.5;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-69.png 1147w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-69-768x512.png 768w\" sizes=\"auto, (max-width: 1147px) 100vw, 1147px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \\\u00a0\u00a0\/etc\/containerd\/config.tomlsudo systemctl restart containerdsudo systemctl enable containerd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Miss that one flag, and your pods crash in a loop later. My team has debugged that exact issue more times than we admit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With the engine ready, we bring in the three tools that run the whole show.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-5-install-kubeadm-kubelet-and-kubectl\">Step 5: Install kubeadm, kubelet, and kubectl<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">These three tools do the heavy lifting. Let me tell you what each one does before you install them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">kubeadm builds the cluster. kubelet runs on every node and keeps pods alive. kubectl is the command you type to control it all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, add the official Kubernetes package source. This block grabs the signing key for the current v1.36 release.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install -y apt-transport-https ca-certificates curl gpgsudo mkdir -p -m 755 \/etc\/apt\/keyringscurl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.36\/deb\/Release.key \\\u00a0\u00a0| sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now point apt at that source and install the three tools in one go.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1142\" height=\"748\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-73.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 6\" class=\"wp-image-22857\" style=\"aspect-ratio:1.5256723716381417;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-73.png 1142w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-73-768x503.png 768w\" sizes=\"auto, (max-width: 1142px) 100vw, 1142px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>echo 'deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] \\\u00a0\u00a0https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.36\/deb\/ \/' \\\u00a0\u00a0| sudo tee \/etc\/apt\/sources.list.d\/kubernetes.listsudo apt updatesudo apt install -y kubelet kubeadm kubectl<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then lock the versions. This stops a random update from breaking your cluster during normal patching.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-mark hold kubelet kubeadm kubectl<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Note:<\/strong> The old apt.kubernetes.io source is dead and gone. My research team only uses the pkgs.k8s.io source shown above, and so should you.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Run every step so far on all your servers. Before we start the cluster brain, let me pause on the thing that decides how smooth all of this feels.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-6-start-the-control-plane\">Step 6: Start the Control Plane<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This step runs on the control plane only. It turns your boss server into the brain of the whole cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The command below starts the cluster and sets the pod network range. My team pairs this range with Calico, the network tool we add next.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># run on the control plane onlysudo kubeadm init --pod-network-cidr=192.168.0.0\/16<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1143\" height=\"764\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-74.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 7\" class=\"wp-image-22856\" style=\"aspect-ratio:1.4964028776978417;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-74.png 1143w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-74-767x513.png 767w\" sizes=\"auto, (max-width: 1143px) 100vw, 1143px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This takes a few minutes. When it finishes, it prints a kubeadm join command. Copy that whole line and save it somewhere safe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That join line is your ticket to add workers later. It holds a token that expires in 24 hours, so please do not lose it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Disclaimer<\/strong>: Your exact output, IPs, and tokens will differ from mine. Never share your join token in public, since anyone who holds it can add nodes to your cluster.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The cluster brain is alive. Now let me hand you the keys to talk to it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-7-set-up-kubectl-access\">Step 7: Set Up kubectl Access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Right now only root can reach the cluster. These three lines let your normal user run kubectl and skip typing sudo every time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run them on the control plane as your regular user, not as root.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p $HOME\/.kubesudo cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/configsudo chown $(id -u):$(id -g) $HOME\/.kube\/config<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"891\" height=\"454\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-72.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 8\" class=\"wp-image-22855\" style=\"aspect-ratio:1.9684542586750788;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-72.png 891w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-72-767x391.png 767w\" sizes=\"auto, (max-width: 891px) 100vw, 891px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Test it right away. This command asks the cluster to list its nodes for you.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You see your control plane listed as NotReady. That is fine for now. It stays that way until we add the pod network next.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That NotReady status is our cue. The cluster needs a way for pods to talk, so let me install one.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-8-install-a-pod-network\">Step 8: Install a Pod Network<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pods cannot reach each other until you add a network layer, called a CNI. My team uses Calico because it is stable and simple.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Install it with one command on the control plane. It reads a ready-made file straight from the Calico project.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># run on the control plane onlykubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/\\calico\/v3.28.0\/manifests\/calico.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Give it a minute or two to settle. Then check your nodes one more time.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1145\" height=\"583\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-75.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 9\" class=\"wp-image-22858\" style=\"aspect-ratio:1.9684542586750788;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-75.png 1145w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-75-768x391.png 768w\" sizes=\"auto, (max-width: 1145px) 100vw, 1145px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your control plane should now read Ready. That single word means the network is live and the cluster is healthy.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Note<\/strong>: Calico ships new versions often. My team checks the Calico site for the current file link before each fresh install, and I suggest you do the same.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Your cluster runs, but it has no workers yet. Let me bring your app servers into the family.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-9-join-your-worker-nodes\">Step 9: Join Your Worker Nodes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now grab that kubeadm join command you saved back in Step 6. You run it on each worker, not on the control plane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The line looks like the one below, with your own IP and token filled in. Add sudo at the front.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># run on each worker nodesudo kubeadm join 10.0.0.10:6443 --token abcdef.0123456789abcdef \\\u00a0\u00a0--discovery-token-ca-cert-hash sha256:1234...yourhash<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lost the token? That is fine. Run this on the control plane to print a fresh join command for you.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubeadm token create --print-join-command<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1152\" height=\"735\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-76.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 10\" class=\"wp-image-22859\" style=\"aspect-ratio:1.5639097744360901;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-76.png 1152w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-76-768x490.png 768w\" sizes=\"auto, (max-width: 1152px) 100vw, 1152px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After each worker joins, hop back to the control plane and list your nodes. Watch them turn Ready one by one.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It feels great to see every node marked Ready. My team still smiles at that screen after all these years.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A cluster with nothing running is just a shell. Let me prove it works by deploying a real app.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-10-test-the-cluster-with-a-real-app\">Step 10: Test the Cluster With a Real App<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let me put a small web app on the cluster. This shows that pods start, spread out, and answer traffic like they should.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run this on the control plane. It creates a tiny Nginx web server with two copies for safety.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create deployment web --image=nginx --replicas=2kubectl expose deployment web --port=80 --type=NodePort<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check that both copies are running. This command lists your pods and the node each one landed on.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1143\" height=\"764\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-77.png\" alt=\"Kubernetes on VPS: Installation &amp; Setup Guide - screenshot 11\" class=\"wp-image-22860\" style=\"aspect-ratio:1.4964028776978417;width:624px;height:auto\" srcset=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-77.png 1143w, https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/08\/image-77-767x513.png 767w\" sizes=\"auto, (max-width: 1143px) 100vw, 1143px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -o wide<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see two web pods spread across your workers. That spread is Kubernetes at work, keeping your app alive when a node dies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the NodePort in your browser to see the Nginx welcome page. That live page is proof your cluster now serves real traffic.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Note<\/strong>: This test app is safe to remove. Run kubectl delete deployment web and kubectl delete service web once you finish poking around.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You now hold a working cluster. Before you celebrate, let me save you from the traps my team hit early on.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"common-mistakes-i-see-beginners-make\">Common Mistakes I See Beginners Make<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have cleaned up a lot of broken clusters over the years. These few slips cause most of the pain, so watch for them.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Swap left on is the top offender. Double-check you turned it off on every node, not just the control plane.<\/li>\n\n\n\n<li>A skipped SystemdCgroup flag is next. Pods crash in a loop when containerd and Kubernetes disagree on resource tracking.<\/li>\n\n\n\n<li>An expired token blocks many joins. Tokens die after 24 hours, so create a fresh one when a worker refuses to connect.<\/li>\n\n\n\n<li>A closed firewall port causes silent failures. Open the ports your nodes need so the boss and workers can chat freely.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Speaking of ports, here are the exact ones my team opens between nodes. Set these first when a fresh cluster acts odd.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\"><strong>Port<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>Node<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>Purpose<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">6443<\/td><td class=\"has-text-align-center\" data-align=\"center\">Control plane<\/td><td class=\"has-text-align-center\" data-align=\"center\">API server, all nodes talk here<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10250<\/td><td class=\"has-text-align-center\" data-align=\"center\">All nodes<\/td><td class=\"has-text-align-center\" data-align=\"center\">kubelet health and stats<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">30000-32767<\/td><td class=\"has-text-align-center\" data-align=\"center\">Workers<\/td><td class=\"has-text-align-center\" data-align=\"center\">NodePort apps reach the outside<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Open these ports between your nodes and you dodge the most common network headache. My team checks this list first every time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You have the full build and the common fixes. Let me answer the questions my team hears most about Kubernetes on VPS.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"frequently-asked-questions\">Frequently Asked Questions<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1787645853234\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"do-i-need-more-than-one-server-to-run-kubernetes-on-a-vps\">Do I need more than one server to run Kubernetes on a VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes, a real cluster needs at least two VPS nodes. One runs the control plane, and the other runs your apps as a worker.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645920537\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"can-i-run-kubernetes-on-a-single-vps\">Can I run Kubernetes on a single VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>You can, for practice only. Remove the control plane taint so one node also runs apps. My team never uses a single node for real traffic.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645928267\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-much-ram-does-a-kubernetes-vps-node-need\">How much RAM does a Kubernetes VPS node need?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Each node needs 2 GB of RAM at the very least. My team runs 4 GB per node so pods and the system never fight for memory.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645935137\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-containerd-better-than-docker-for-kubernetes\">Is containerd better than Docker for Kubernetes?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes, containerd is the right pick today. Kubernetes dropped direct Docker support years ago, and containerd runs your containers with less overhead.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645940967\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"why-does-my-kubernetes-node-show-notready\">Why does my Kubernetes node show NotReady?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>A NotReady node almost always means the pod network is missing. Install a CNI like Calico, wait a minute, and the node turns Ready.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645947291\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-add-a-new-worker-node-later\">How do I add a new worker node later?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Run kubeadm token create &#8211;print-join-command on the control plane. Copy the fresh join line, then run it with sudo on your new worker.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1787645955806\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-a-vps-cheaper-than-managed-kubernetes\">Is a VPS cheaper than managed Kubernetes?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Usually yes. A VPS gives you a flat monthly cost with no per-hour cluster fees. My team finds it far cheaper for small and mid-size work.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You started with a bare server and a bit of doubt. Now you hold a real Kubernetes on a VPS cluster that heals itself when a node fails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We walked through it together. You prepped your servers, turned off swap, set the network, and installed containerd with the core tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then you built the control plane, added a pod network, joined your workers, and pushed a live app across the cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team runs this exact flow for real projects, and now it is yours. Keep this guide close and run it again for every new cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your next step is simple. Grab a solid VPS with room to grow, open three terminals, and build your first cluster today. You have got this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Launch a Kubernetes-ready node with full root access, SSH key login, and NVMe speed: <a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">https:\/\/www.youstable.com\/vps-hosting\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>My client called me at midnight last winter. His app had crashed and every user of his app was locked [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":22864,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"iawp_total_views":97,"footnotes":""},"categories":[1136],"tags":[],"class_list":["post-22849","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/comments?post=22849"}],"version-history":[{"count":3,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22849\/revisions"}],"predecessor-version":[{"id":22863,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22849\/revisions\/22863"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media\/22864"}],"wp:attachment":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media?parent=22849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/categories?post=22849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/tags?post=22849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}