{"id":22615,"date":"2026-07-31T21:51:00","date_gmt":"2026-07-31T16:21:00","guid":{"rendered":"https:\/\/www.youstable.com\/blog\/?p=22615"},"modified":"2026-07-29T11:00:27","modified_gmt":"2026-07-29T05:30:27","slug":"setup-kubernetes-cluster-on-a-vps","status":"publish","type":"post","link":"https:\/\/www.youstable.com\/blog\/setup-kubernetes-cluster-on-a-vps\/","title":{"rendered":"How to Setup Kubernetes Cluster on a VPS (Complete Guide)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">You have a VPS and now you want to run Kubernetes cluster on it? I get it. Let me tell you, it&#8217;s really easy! Just gonna take 5 mins in the entire setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The official docs that are available online, show fifty commands and they think that you already know the rest of the process.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the gap that is exactly what I am going to address today.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team and I have set up Kubernetes cluster on VPS servers for more than 30 months back to back. We do it for our own clients who need it done right.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This Kubernetes installation and setup guide will tell you every step in plain simple words. Copy the commands, follow the order and you will have a running cluster by the end you complete reading the setup guide.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Please Note:<\/strong> Every command here was tested by my senior research team on live <strong><a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">VPS servers<\/a><\/strong>. These are the exact steps we run in production, trimmed down for a first-time setup.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Before we touch a single command, let me clear up what you are actually building. A quick picture now will save you from a lot of confusion later.<\/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-does-running-kubernetes-cluster-on-a-vps-actually-mean\">What Does Running Kubernetes Cluster on a VPS Actually Mean?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes is a system that runs and manages your containers (Dockers, where you run your apps). It starts them, restarts them when they crash and spreads them across machines. People shorten the name to K8s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A VPS is a virtual private server: a slice of a big physical server that acts like a big computer, with its own RAM, CPU, and root access. You rent it and you control it fully. (Later in the article I\u2019ll tell you from where you can rent VPS server)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Put the two together (Kubernetes + VPS) and you get your own private cloud.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You run Kubernetes on a VPS to host apps, APIs, and services that scale up and heal themselves, all on hardware you rent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A cluster has two kinds of machines.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The control plane is the brain that makes decisions.\u00a0<\/li>\n\n\n\n<li>The worker nodes are the muscle that runs your actual apps.\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One VPS can play both roles for learning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So why run it yourself instead of a managed service? See! There are two reasons for this particular thing: cost and control.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A managed cluster charges a monthly fee just for the brain, before you run a single app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a VPS you pay only for the server &gt;&gt; You also own every certificate &gt;&gt; every node &gt;&gt; and all your data. That kind of control matters once real workloads live in your cluster.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Key Takeaway: Kubernetes clusters on a VPS gives you a self-healing, scalable app platform on cheap rented hardware. You own the whole stack, from the control plane down to the data.<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now, the question is what your server needs before any install begins. Get the base right and the rest goes smoothly.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Get it wrong and the cluster refuses to start.<\/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\">Kubernetes has real hardware needs.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team tested the floor many times, and going below it leaves your apps gasping for memory. Here is the honest minimum for a VPS Kubernetes cluster.<\/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>Resource<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>Bare Minimum<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>What I Recommend<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">CPU<\/td><td class=\"has-text-align-center\" data-align=\"center\">2 vCPU<\/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<\/td><td class=\"has-text-align-center\" data-align=\"center\">4 GB or more 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<\/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 also need a few basics in place. A clean check now means fewer surprises during the install. Run through this short list first.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Root access: you must run commands as root or with sudo rights.<\/li>\n\n\n\n<li>A public IP: your VPS needs one so nodes and you can reach it.<\/li>\n\n\n\n<li>Open ports: the control plane uses port 6443, so keep it reachable.<\/li>\n\n\n\n<li>A fresh OS: start from a clean Ubuntu image, not a used one.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One more word on ports. The control plane listens on port 6443, and the nodes talk over a range of internal ports. Keep 6443 reachable and let your firewall handle the rest.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Pro Tip: Give the control plane more muscle than the workers. My research team runs 4 vCPU and 8 GB RAM on the brain of any serious cluster, since it does the heavy scheduling.<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the part most guides skip. There are two clean routes to get Kubernetes on your server, and the right one saves you hours.<\/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=\"two-ways-to-install-kubernetes-cluster-on-a-vps\">Two Ways to Install Kubernetes cluster on a VPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first route is kubeadm, the official tool.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You install each piece by hand, so you learn how the cluster fits together. It is the real deal, and it is what production teams use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second route is k3s, a lightweight version by Rancher. It bundles everything into one small binary and installs in under a minute.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Perfect when you want a cluster fast on a single VPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both give you genuine Kubernetes. The apps you deploy, the commands you type, and the way pods behave stay the same. The gap is only in how much you set up by hand.<\/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>Point<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>kubeadm<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>k3s<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Setup time<\/td><td class=\"has-text-align-center\" data-align=\"center\">20 to 40 minutes<\/td><td class=\"has-text-align-center\" data-align=\"center\">Under 1 minute<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">RAM at idle<\/td><td class=\"has-text-align-center\" data-align=\"center\">Higher<\/td><td class=\"has-text-align-center\" data-align=\"center\">Around 400 MB<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Best for<\/td><td class=\"has-text-align-center\" data-align=\"center\">Learning, production<\/td><td class=\"has-text-align-center\" data-align=\"center\">Small apps, single VPS<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Control<\/td><td class=\"has-text-align-center\" data-align=\"center\">Full, manual<\/td><td class=\"has-text-align-center\" data-align=\"center\">Simple, bundled<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Skill level<\/td><td class=\"has-text-align-center\" data-align=\"center\">Intermediate<\/td><td class=\"has-text-align-center\" data-align=\"center\">Beginner friendly<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I will teach you both. First the full kubeadm method, step by step, so you understand every piece. Then the fast k3s shortcut for when speed matters more than depth.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Please Note:<\/strong> New to all this? Start with the kubeadm walkthrough to learn the parts, then keep k3s in your pocket for quick projects. My team uses both depending on the job.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Let me start with the full method. This is the path my research team walks every time we build a proper cluster.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Follow each step in order and skip nothing.<\/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=\"method-1-install-kubernetes-cluster-with-kubeadm\">Method 1: Install Kubernetes cluster&nbsp; With kubeadm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We will use containerd as the container runtime and a network plugin for pod traffic. Run every command as root. Let&#8217;s get started.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set aside about 5 minutes and take it slow. Each step builds on the one before it, so a skipped line early on shows up as a broken cluster later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-1-prepare-your-server\"><strong>Step 1: Prepare Your Server<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First, give your node a clear name. A named node is easy to spot later. Then update the system so every package sits at its latest version.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo hostnamectl set-hostname k8s-mastersudo apt-get update &amp;&amp; sudo apt-get upgrade -y<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1048\" height=\"688\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-84.png\" alt=\"\" class=\"wp-image-22626\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Next comes the setting that confuses almost everyone. Kubernetes refuses to run with swap memory turned on. So we switch it off, both now and on every 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<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1088\" height=\"479\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-78.png\" alt=\"\" class=\"wp-image-22620\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tip<\/strong>: The swap line is the number one reason a first install fails. The kubelet will not even start while swap is active, so run swapoff before anything else.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-2-load-kernel-modules-and-network-settings\"><strong>Step 2: Load Kernel Modules and Network Settings<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes needs two kernel modules to move traffic between containers. We load them now and set them to load on every boot. This part is quick.<\/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<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1064\" height=\"299\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-75.png\" alt=\"\" class=\"wp-image-22617\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now we let the system pass network traffic the way a cluster expects. These three lines tell Linux to forward packets and bridge them correctly across your pods.<\/p>\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<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-3-install-containerd\"><strong>Step 3: Install containerd<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A container runtime is the engine that actually runs your containers.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes dropped Docker support a while back, so containerd is the runtime we use today. Let me help you install it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of the runtime as the layer between Kubernetes and your containers. Kubernetes gives the orders, and containerd carries them out on the actual server. Every worker node needs it too.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install -y containerdsudo mkdir -p \/etc\/containerdcontainerd config default | sudo tee \/etc\/containerd\/config.toml<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1083\" height=\"719\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-85.png\" alt=\"\" class=\"wp-image-22629\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the tiny change that saves you a broken cluster. We tell containerd to use the same cgroup driver as Kubernetes. One word, huge payoff.<\/p>\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\"><strong>Please Note<\/strong>: Set SystemdCgroup to true or your cluster will fail during init with a cgroup driver mismatch. My team has debugged this exact error a number of times.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-4-install-kubeadm-kubelet-and-kubectl\"><strong>Step 4: Install kubeadm, kubelet, and kubectl<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now we add the three core tools.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kubeadm builds the cluster<\/li>\n\n\n\n<li>kubelet runs on every node, and\u00a0<\/li>\n\n\n\n<li>kubectl is the command you type to control it all.\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">First, add the official repository.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install -y apt-transport-https ca-certificates curl gpgcurl -fsSL \\\u00a0\u00a0https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.33\/deb\/Release.key \\\u00a0\u00a0| sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"697\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-87.png\" alt=\"\" class=\"wp-image-22628\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">With the key in place, point your system at the repository and install the tools. We hold their versions so an accidental upgrade does not break the cluster later.<\/p>\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.33\/deb\/ \/' \\\u00a0\u00a0| sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list\u00a0sudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectl<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Key Takeaway: Version v1.33 is the stable pick my research team trusts for production in 2026. It stays supported for a long window, which keeps your cluster steady.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-5-start-the-control-plane\"><strong>Step 5: Start the Control Plane<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the big moment.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One command turns your VPS into a working control plane. The pod CIDR value below matches the network plugin we install in a moment.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm init --pod-network-cidr=10.244.0.0\/16<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1018\" height=\"718\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-86.png\" alt=\"\" class=\"wp-image-22627\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The command runs a set of checks, pulls the cluster images and boots the brain. Give it a minute or two. At the end you get a join command, so copy it somewhere safe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-6-set-up-kubectl-access\"><strong>Step 6: Set Up kubectl Access<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Right now your cluster is running, but kubectl does not know how to reach it. These three lines hand your user the config file it needs to talk to the control plane.<\/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\"><img loading=\"lazy\" decoding=\"async\" width=\"1026\" height=\"715\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-82.png\" alt=\"\" class=\"wp-image-22624\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Test it right away. Run the command below and you should see your node listed. It will read NotReady for now, and that is expected until the next step.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-7-install-a-network-plugin\"><strong>Step 7: Install a Network Plugin<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your node shows NotReady because pods have no way to talk to each other yet. A network plugin, called a CNI, fixes that.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will use Flannel, a light and simple choice.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f \\\u00a0\u00a0https:\/\/github.com\/flannel-io\/flannel\/releases\/latest\/download\/kube-flannel.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wait about a minute, then check the nodes again. This time your node flips to Ready. That single word means the cluster is alive and can now run your apps.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1009\" height=\"698\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-83.png\" alt=\"\" class=\"wp-image-22625\"><\/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\">A CNI plugin hands each pod its own IP and lets pods reach each other across nodes. Flannel keeps this simple, which is why my team leans on it for a first cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Please Note<\/strong>: Flannel pairs with the 10.244.0.0\/16 CIDR we set in Step 5. Want Calico instead? Use 192.168.0.0\/16 during init so the two match up correctly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-8-run-apps-on-a-single-node-cluster\"><strong>Step 8: Run Apps on a Single-Node Cluster<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, the control plane blocks normal apps from running on it. On a one-VPS setup, you want them to run anyway. We lift that block with a single command.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl taint nodes --all node-role.kubernetes.io\/control-plane-<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1073\" height=\"346\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-77.png\" alt=\"\" class=\"wp-image-22619\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That trailing dash removes the restriction, called a taint. Now your one server acts as both brain and muscle. Perfect for learning or a small live app on a single box.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-9-add-worker-nodes-optional\"><strong>Step 9: Add Worker Nodes (Optional)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Want more power?&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add worker VPS boxes to share the load. Set up each new server through Steps 1 to 4, then run the join command you saved from Step 5.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm join 84.32.214.62:6443 --token &lt;your-token> \\\u00a0\u00a0--discovery-token-ca-cert-hash sha256:&lt;your-hash><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1009\" height=\"690\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-80.png\" alt=\"\" class=\"wp-image-22622\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Back on the master, list your nodes and watch the new worker appear. In a minute it turns Ready and starts pulling its weight. Repeat for as many workers as you need.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pro Tip: Run each worker through the same prep, containerd, and tools steps before joining. A worker missing containerd will fail the join with a runtime error every time.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-10-deploy-a-test-app\"><strong>Step 10: Deploy a Test App<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s prove it works.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will run a simple Nginx web server and open it to the outside. This is the moment your cluster does real work for the first time.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"833\" height=\"553\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-79.png\" alt=\"\" class=\"wp-image-22621\"><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePortkubectl get svc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The last command shows a port number in the 30000 range. Open your VPS IP with that port in a browser, and the Nginx welcome page loads. Your cluster is live and serving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key Takeaway: A NodePort service is the quickest way to test. For a real site, move up to an Ingress controller like NGINX or Traefik with a proper domain later.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before we cover the fast route, a fair question: which VPS should you run all this on? The host matters more than people think, so let me share what my team uses.<\/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-host-your-kubernetes-cluster-on-youstable-vps\">Why Host Your Kubernetes Cluster on YouStable VPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A cluster is only as steady as the server under it.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team has run Kubernetes on many hosts, and the ones that give you full control always win. That is where <a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">YouStable VPS<\/a> fits.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You get full admin access with root rights, so nothing blocks you from installing containerd, kubeadm, or any plugin your cluster needs. The server is truly yours, top to bottom.<\/li>\n\n\n\n<li>Login stays safe through SSH key access, so you skip weak passwords and lock the door on brute-force attempts. My research team treats this as a must for any live cluster.<\/li>\n\n\n\n<li>Setup is simple too. Easy VPN and firewall setup lets you wall off your control plane, keep port 6443 private, and route node traffic the safe way. That keeps your cluster hidden from prying eyes.<\/li>\n\n\n\n<li>On top of that, you get fast NVMe SSD storage, generous RAM, and stable uptime that keeps your pods running through the night. These are the exact traits a healthy cluster leans on.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">My team has run clusters on cheap hosts that limit disk and RAM. The pods choke under load. A host built for control skips those limits, so your cluster breathes easy.<\/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>What Your Cluster Needs<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>What YouStable VPS Gives<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Root to install everything<\/td><td class=\"has-text-align-center\" data-align=\"center\">Full admin access<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Safe, key-based login<\/td><td class=\"has-text-align-center\" data-align=\"center\">SSH key access<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Private control plane<\/td><td class=\"has-text-align-center\" data-align=\"center\">Easy VPN and firewall setup<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Fast pod storage<\/td><td class=\"has-text-align-center\" data-align=\"center\">NVMe SSD disks<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Steady runtime<\/td><td class=\"has-text-align-center\" data-align=\"center\">Stable uptime<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So when you are ready to build a real cluster, spin it up on a plan made for it. You can grab a server on the <a href=\"https:\/\/www.youstable.com\/vps-hosting\/\">YouStable VPS hosting<\/a> page and follow this guide start to finish.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Please Check this out:<\/strong> YouStable is my own company, so treat this as an honest recommendation from someone who runs clusters daily, not a hollow pitch. The control it hands you genuinely makes setup easier.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now for the shortcut I promised.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you want a cluster in one minute flat, this is the route. My team reaches for it on small projects all the time.<\/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=\"method-2-the-fast-k3s-shortcut\">Method 2: The Fast k3s Shortcut<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">k3s is real Kubernetes shrunk into a single 100 MB binary.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It runs the same apps, the same Helm charts and the same commands. It just skips the long manual setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run the base prep from Step 1 first, then fire off one line. That single command installs k3s, starts the control plane, and wires up kubectl for you. Watch how short this is.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -sfL https:\/\/get.k3s.io | sh -<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Give it under a minute.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"961\" height=\"697\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-81.png\" alt=\"\" class=\"wp-image-22623\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">k3s bundles the runtime, the network, and even a built-in load balancer, so there is nothing else to configure. Check your node with the command below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo k3s kubectl get nodes<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"740\" height=\"327\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-74.png\" alt=\"\" class=\"wp-image-22616\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To drop the sudo and use plain kubectl, copy the config to your home folder. Then every command works the same way it does on a full kubeadm cluster.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/.kubesudo cp \/etc\/rancher\/k3s\/k3s.yaml ~\/.kube\/configsudo chown $USER:$USER ~\/.kube\/config<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"706\" height=\"456\" src=\"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2026\/07\/image-76.png\" alt=\"\" class=\"wp-image-22618\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">One thing to know: k3s swaps the heavy etcd database for a light one called SQLite on a single node. You get the same Kubernetes feel with a fraction of the overhead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key Takeaway: k3s uses roughly 400 MB of RAM at idle and installs in under a minute. It is my go-to for a single VPS, small apps, or a quick test cluster.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even a clean install can hiccup. My research team has hit every one of these snags, so let me hand you the fixes before they cost you an evening.<\/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-problems-and-how-i-fix-them\">Common Problems and How I Fix Them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most cluster errors trace back to a handful of causes. Learn to spot them and you will solve issues in seconds instead of hours.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here are the ones we see most.<\/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>Problem<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>Likely Cause<\/strong><\/th><th class=\"has-text-align-center\" data-align=\"center\"><strong>The Fix<\/strong><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Init fails at preflight<\/td><td class=\"has-text-align-center\" data-align=\"center\">Swap still on<\/td><td class=\"has-text-align-center\" data-align=\"center\">Run sudo swapoff -a<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Node stuck NotReady<\/td><td class=\"has-text-align-center\" data-align=\"center\">No CNI installed<\/td><td class=\"has-text-align-center\" data-align=\"center\">Apply Flannel or Calico<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Cgroup driver error<\/td><td class=\"has-text-align-center\" data-align=\"center\">SystemdCgroup false<\/td><td class=\"has-text-align-center\" data-align=\"center\">Set it true, restart<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Join command fails<\/td><td class=\"has-text-align-center\" data-align=\"center\">Token expired<\/td><td class=\"has-text-align-center\" data-align=\"center\">Create a fresh token<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Port 6443 in use<\/td><td class=\"has-text-align-center\" data-align=\"center\">Old cluster running<\/td><td class=\"has-text-align-center\" data-align=\"center\">Run kubeadm reset -f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When something looks stuck, two commands tell you almost everything.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>shows the kubelet log,\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">And the second&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>shows what a troubled pod is complaining about.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -xeu kubeletkubectl describe pod &lt;pod-name> -n kube-system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A fresh pair of eyes helps too. Copy the exact error text into a search, and you will often find the fix in seconds. The community has hit every snag before you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pro Tip<\/strong>: Read the preflight errors slowly. kubeadm tells you the exact problem in plain text, and my team fixes 9 out of 10 issues just by reading that output carefully.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A cluster is not a set-and-forget thing. A little care keeps it fast and safe. These small habits have saved my team from big headaches over the years.<\/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=\"keeping-your-cluster-healthy\">Keeping Your Cluster Healthy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check on your nodes and pods often. A quick glance each week catches trouble early, long before it takes an app down. Two commands cover the basics.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodeskubectl get pods --all-namespaces<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep your tools patched, but do it with care.\u00a0<\/li>\n\n\n\n<li>Upgrade one minor version at a time, and always upgrade the control plane before the workers. Rushing this step is how clusters break.<\/li>\n\n\n\n<li>Guard your control plane too. Keep port 6443 behind a firewall, use SSH keys, and let only trusted IPs reach it. A locked-down brain keeps the whole cluster safe.<\/li>\n\n\n\n<li>Back up your cluster state as well. The control plane stores everything in a database called etcd, and a saved snapshot means you can rebuild fast after any crash.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-ast-global-color-1-background-color has-background has-fixed-layout\"><tbody><tr><td><strong>Disclaimer:<\/strong> Command paths and version numbers shift as Kubernetes updates.\u00a0<br>My team checks these against the official docs each cycle, and you should confirm the current stable version before a fresh install.<\/td><\/tr><\/tbody><\/table><\/figure>\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=\"faqs\">FAQs<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1785299497957\" 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>Yes. A single VPS runs a full one-node cluster. You install the control plane, then remove the taint so it also runs your apps. Use 2 vCPU and 4 GB RAM for a smooth ride. It is a great way to learn and to host small apps at low cost.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300010251\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-much-ram-do-i-need-for-kubernetes-on-a-vps\">How much RAM do I need for Kubernetes on a VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The minimum is 2 GB of RAM per node, but that leaves little room for your apps. My team recommends 4 GB or more. For the control plane on a busy cluster, 8 GB keeps things stable and responsive under real load.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300014655\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-kubeadm-or-k3s-better-for-a-vps\">Is kubeadm or k3s better for a VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Both work well. Pick kubeadm to learn how the parts fit and to run production clusters. Pick k3s for speed and low memory use on a single VPS or a small app.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300031263\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"why-must-i-turn-off-swap-for-kubernetes\">Why must I turn off swap for Kubernetes?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The kubelet will not start while swap is on. Kubernetes wants full control over how memory is used across your pods, and swap works against that. So you disable it first, both live and on every reboot, before any install step.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300037824\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"which-os-is-best-for-kubernetes-on-a-vps\">Which OS is best for Kubernetes on a VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Ubuntu 24.04 LTS is my team&#8217;s top pick. It has long support, wide docs, and clean package handling for Kubernetes. Debian 12 and Rocky Linux 9 also work well. Any of them gives you a steady base for a VPS Kubernetes cluster.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300043904\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-add-a-worker-node-later\">How do I add a worker node later?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Set up the new VPS through the prep, containerd, and tools steps. Then run the join command from your master. Lost the command? Generate a new one with kubeadm token create &#8211;print-join-command. The worker turns Ready within a minute of joining.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300059697\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"what-is-the-difference-between-kubernetes-and-docker\">What is the difference between Kubernetes and Docker?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Docker builds and runs a single container. Kubernetes manages many containers across many machines. It starts them, restarts crashed ones, and scales them on demand. In short, Docker packs the app and Kubernetes runs it at scale across your whole cluster.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300066941\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-much-does-it-cost-to-run-kubernetes-on-a-vps\">How much does it cost to run Kubernetes on a VPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Only $3.67 per month is required to run Kubernetes on a VPS.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1785300097077\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-kubernetes-on-a-vps-good-for-production\">Is Kubernetes on a VPS good for production?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes, with care. Use enough RAM, lock down the control plane, add worker nodes for redundancy, and keep backups of your data. My team runs production clusters on VPS servers daily. It is cheaper than managed Kubernetes and gives you full control.<\/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-k8-setup-on-a-vps\">Conclusion: K8 Setup on a VPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">That is the whole journey, from a bare server to a live K8 cluster. Let me pull the things together so you leave with a clear picture.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You now know both routes.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The kubeadm method teaches you every piece: swap off, kernel modules, containerd, the core tools, the init, the network plugin, and the join.\u00a0<\/li>\n\n\n\n<li>The k3s method gets you there in one command.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You also know the issues that come in the first install, the fixes that clear them fast, and the small habits that keep a cluster healthy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;That is more than most guides ever tell you about.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My team built this from 30-plus months of real setups, so the steps are the exact ones we trust. Follow them in order and your Kubernetes cluster on the VPS cluster will run properly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep this guide open in a tab as you work. Run each command in order and double check the output with the screenshots.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Key Takeaway:<\/strong> Kubernetes cluster on a VPS is within your reach today. Pick kubeadm to learn deep or k3s to move fast, follow the steps in order, and you will have a live cluster this evening.<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>You have a VPS and now you want to run Kubernetes cluster on it? I get it. Let me tell [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":22641,"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":76,"footnotes":""},"categories":[1136,2267,350],"tags":[],"class_list":["post-22615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-kb-devops","category-knowledgebase"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22615","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=22615"}],"version-history":[{"count":5,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22615\/revisions"}],"predecessor-version":[{"id":22640,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/22615\/revisions\/22640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media\/22641"}],"wp:attachment":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media?parent=22615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/categories?post=22615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/tags?post=22615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}