{"id":12512,"date":"2025-12-20T11:21:34","date_gmt":"2025-12-20T05:51:34","guid":{"rendered":"https:\/\/www.youstable.com\/blog\/?p=12512"},"modified":"2025-12-20T11:21:35","modified_gmt":"2025-12-20T05:51:35","slug":"install-kubernetes-on-linux","status":"publish","type":"post","link":"https:\/\/www.youstable.com\/blog\/install-kubernetes-on-linux","title":{"rendered":"How to Install Kubernetes on Linux Server 2026 &#8211; Step-by-Step Cluster Guide"},"content":{"rendered":"\n<p><strong>To install Kubernetes on a Linux server<\/strong>, prepare the OS (disable swap, load kernel modules, configure sysctl), install a container runtime (containerd recommended), add the Kubernetes repository, and install kubeadm, kubelet, and kubectl. Initialize the control plane with kubeadm, apply a CNI plugin, then join worker nodes and verify with kubectl.<\/p>\n\n\n\n<p>In this guide, you\u2019ll learn how to install Kubernetes on a Linux server the right way\u2014using kubeadm, containerd, and a production-friendly configuration. We\u2019ll cover Ubuntu\/Debian and RHEL-based distros, pod networking (CNI), firewall ports, validation, upgrades, troubleshooting, and practical tips drawn from real-world hosting environments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"what-youll-build\"><strong>What You\u2019ll Build<\/strong><\/h2>\n\n\n\n<p>You will set up a Kubernetes cluster using kubeadm with one control plane node and one or more worker nodes. We will use containerd as the container runtime, install a CNI plugin for networking (Calico or Flannel), and validate with a sample workload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"prerequisites\"><strong>Prerequisites<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Supported OS: Ubuntu 22.04\/24.04, Debian 12, Rocky\/AlmaLinux 9, RHEL 9 (or equivalents)<\/li>\n\n\n\n<li>Hardware (minimum): 2 vCPU and 4 GB RAM per node (8 GB+ recommended for control plane)<\/li>\n\n\n\n<li>Network: Stable connectivity between nodes, unique hostnames, and open required ports<\/li>\n\n\n\n<li>Root or sudo access, and basic Linux familiarity<\/li>\n\n\n\n<li>Time sync enabled (chrony or systemd-timesyncd)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-1-prepare-your-linux-servers\"><strong>Step 1: Prepare Your Linux Servers<\/strong><\/h2>\n\n\n\n<p>Run the following on all nodes (control plane and workers). This ensures kernel modules, sysctl, and swap settings meet Kubernetes requirements.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"set-hostnames-and-etc-hosts\"><strong>Set Hostnames and \/etc\/hosts<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Example: set a hostname per node\nsudo hostnamectl set-hostname cp-1   # control plane\n# sudo hostnamectl set-hostname worker-1   # on worker, adjust accordingly\n\n# Optional: map hostnames (use your IPs and names)\necho \"10.0.0.10 cp-1\" | sudo tee -a \/etc\/hosts\necho \"10.0.0.11 worker-1\" | sudo tee -a \/etc\/hosts<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"load-kernel-modules-and-configure-sysctl\"><strong>Load Kernel Modules and Configure Sysctl<\/strong><\/h3>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"disable-swap\"><strong>Disable Swap<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo swapoff -a\n# Permanently disable swap\nsudo sed -i.bak '\/ swap \/ s\/^\\(.*\\)$\/#\\1\/' \/etc\/fstab<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-2-install-the-container-runtime-containerd\"><strong>Step 2: Install the Container Runtime (containerd)<\/strong><\/h2>\n\n\n\n<p>Containerd is the recommended runtime for Kubernetes. Install and configure it on every node.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ubuntu-debian-install-containerd\"><strong>Ubuntu\/Debian: Install containerd<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install -y containerd\n\n# Generate default config and enable systemd cgroups\nsudo mkdir -p \/etc\/containerd\ncontainerd config default | sudo tee \/etc\/containerd\/config.toml &gt; \/dev\/null\nsudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \/etc\/containerd\/config.toml\n\nsudo systemctl enable --now containerd<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"rhel-rocky-almalinux-install-containerd\"><strong>RHEL\/Rocky\/AlmaLinux: Install containerd<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install -y containerd\nsudo mkdir -p \/etc\/containerd\ncontainerd config default | sudo tee \/etc\/containerd\/config.toml &gt; \/dev\/null\nsudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \/etc\/containerd\/config.toml\n\n# Optional for simplicity: set SELinux to permissive (or configure properly)\n# sudo setenforce 0\n# sudo sed -i 's\/^SELINUX=enforcing\/SELINUX=permissive\/' \/etc\/selinux\/config\n\nsudo systemctl enable --now containerd<\/code><\/pre>\n\n\n\n<p>Systemd cgroups align Kubernetes with the host\u2019s init system and prevent resource accounting issues. Always restart containerd after changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-3-install-kubeadm-kubelet-and-kubectl\"><strong>Step 3: Install kubeadm, kubelet, and kubectl<\/strong><\/h2>\n\n\n\n<p>Use the official Kubernetes repositories from pkgs.k8s.io. Repeat on all nodes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ubuntu-debian-add-repo-and-install\"><strong>Ubuntu\/Debian: Add repo and install<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install -y apt-transport-https ca-certificates curl gpg\n\n# Add Kubernetes signing key and apt repo (adjust v1.30 to your target minor version)\nsudo mkdir -p \/etc\/apt\/keyrings\ncurl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/Release.key | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg\necho \"deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/ \/\" | sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list\n\nsudo apt-get update\nsudo apt-get install -y kubelet kubeadm kubectl\nsudo apt-mark hold kubelet kubeadm kubectl\n\nsudo systemctl enable --now kubelet<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"rhel-rocky-almalinux-add-repo-and-install\"><strong>RHEL\/Rocky\/AlmaLinux: Add repo and install<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &lt;&lt;EOF | sudo tee \/etc\/yum.repos.d\/kubernetes.repo\n&#91;kubernetes]\nname=Kubernetes\nbaseurl=https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/rpm\/\nenabled=1\ngpgcheck=1\ngpgkey=https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/rpm\/repodata\/repomd.xml.key\nEOF\n\nsudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes\nsudo systemctl enable --now kubelet<\/code><\/pre>\n\n\n\n<p>The kubelet will start but remain not-ready until the control plane and CNI are configured.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-4-initialize-the-control-plane\"><strong>Step 4: Initialize the Control Plane<\/strong><\/h2>\n\n\n\n<p>Run the below only on the control plane node. Choose a pod CIDR that matches your CNI plugin\u2019s defaults.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Example pod network CIDR compatible with Calico (192.168.0.0\/16)\nsudo kubeadm init --pod-network-cidr=192.168.0.0\/16\n\n# After successful init, set up kubectl for your user\nmkdir -p $HOME\/.kube\nsudo cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config\nsudo chown \"$(id -u):$(id -g)\" $HOME\/.kube\/config<\/code><\/pre>\n\n\n\n<p>kubeadm outputs a kubeadm join command. Save it for the worker nodes. If you lose it, you can regenerate a token later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"install-a-cni-plugin-networking\"><strong>Install a CNI Plugin (Networking)<\/strong><\/h3>\n\n\n\n<p>Choose one CNI. Calico offers NetworkPolicy and BGP capabilities; Flannel is simpler for small labs.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Calico (feature-rich):<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/calico\/v3.26.1\/manifests\/calico.yaml<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flannel (lightweight):<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/github.com\/flannel-io\/flannel\/releases\/latest\/download\/kube-flannel.yml<\/code><\/pre>\n\n\n\n<p>Wait until all control plane pods become Ready. Check with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes\nkubectl get pods -A<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-5-join-worker-nodes\"><strong>Step 5: Join Worker Nodes<\/strong><\/h2>\n\n\n\n<p>On each worker node, run the join command that kubeadm printed (example below). If expired, create a fresh one on the control plane with kubeadm token create &#8211;print-join-command.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># On control plane (if you need a new token)\nkubeadm token create --print-join-command\n\n# On each worker node (example)\nsudo kubeadm join &lt;CONTROL_PLANE_IP&gt;:6443 --token &lt;TOKEN&gt; \\\n    --discovery-token-ca-cert-hash sha256:&lt;HASH&gt;<\/code><\/pre>\n\n\n\n<p>Back on the control plane, verify nodes show Ready.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes -o wide<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-6-validate-with-a-test-workload\"><strong>Step 6: Validate with a Test Workload<\/strong><\/h2>\n\n\n\n<p>Deploy NGINX and expose it via a NodePort, then test in your browser or with curl.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create deployment nginx --image=nginx --replicas=2\nkubectl expose deployment nginx --type=NodePort --port=80\nkubectl get svc nginx\n\n# Test from outside: use any node\u2019s IP and the allocated NodePort\n# curl http:\/\/&lt;NODE_IP&gt;:&lt;NODEPORT&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"required-firewall-ports\"><strong>Required Firewall Ports<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Control plane: 6443 (API server), 2379\u20132380 (etcd), 10250 (kubelet), 10257 (controller-manager), 10259 (scheduler)<\/li>\n\n\n\n<li>Workers: 10250 (kubelet), 30000\u201332767 (NodePort Services)<\/li>\n\n\n\n<li>CNI-dependent: Calico (179 TCP for BGP, 4789 UDP for VXLAN if enabled), Flannel (8285\/8472 UDP)<\/li>\n<\/ul>\n\n\n\n<p>Allow these in your cloud security group and OS firewall (ufw\/firewalld) for proper communication.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"upgrades-and-maintenance\"><strong>Upgrades and Maintenance<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"plan-cluster-upgrades\"><strong>Plan Cluster Upgrades<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># On control plane\nsudo kubeadm upgrade plan\n# Apply the target version (example)\nsudo kubeadm upgrade apply v1.30.x\n\n# Upgrade kubelet\/kubectl on the control plane\nsudo apt-get install -y kubelet=1.30.* kubectl=1.30.* &amp;&amp; sudo systemctl restart kubelet\n# Or on RPM-based:\n# sudo dnf install -y kubelet-1.30.\\* kubectl-1.30.\\* --disableexcludes=kubernetes &amp;&amp; sudo systemctl restart kubelet\n\n# Drain workers one by one, upgrade, then uncordon\nkubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data\n# Upgrade worker\u2019s kubeadm\/kubelet\/kubectl to the same minor\n# Then:\nkubectl uncordon worker-1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"back-up-etcd-stacked-topology\"><strong>Back Up etcd (stacked topology)<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># On control plane\nsudo ETCDCTL_API=3 etcdctl \\\n  --endpoints=https:\/\/127.0.0.1:2379 \\\n  --cacert=\/etc\/kubernetes\/pki\/etcd\/ca.crt \\\n  --cert=\/etc\/kubernetes\/pki\/etcd\/server.crt \\\n  --key=\/etc\/kubernetes\/pki\/etcd\/server.key \\\n  snapshot save \/root\/etcd-snapshot.db<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"reset-uninstall-when-needed\"><strong>Reset\/Uninstall (When Needed)<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Reset node (control plane or worker)\nsudo kubeadm reset -f\nsudo systemctl stop kubelet\nsudo systemctl stop containerd\nsudo rm -rf \/var\/lib\/cni \/var\/lib\/kubelet \/etc\/cni\/net.d $HOME\/.kube\n\n# Optional: purge packages\n# Ubuntu\/Debian:\n# sudo apt-get purge -y kubeadm kubelet kubectl containerd\n# sudo apt-get autoremove -y\n\n# RHEL\/Rocky\/Alma:\n# sudo dnf remove -y kubeadm kubelet kubectl containerd<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"common-errors-and-quick-fixes\"><strong>Common Errors and Quick Fixes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kubelet NotReady: Ensure swap is off, cgroups set to systemd, and CNI applied.<\/li>\n\n\n\n<li>Pods stuck in ContainerCreating: CNI plugin not installed or incorrect pod CIDR. Reapply the correct CNI manifest.<\/li>\n\n\n\n<li>Cannot pull images: Check containerd status, DNS resolution, and registry connectivity.<\/li>\n\n\n\n<li>Join command fails: Token expired. Regenerate with kubeadm token create &#8211;print-join-command.<\/li>\n\n\n\n<li>Firewall blocks: Open required ports between control plane and workers.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"alternatives-single-node-cri-and-managed-kubernetes\"><strong>Alternatives: Single-Node, CRI, and Managed Kubernetes<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Single-node cluster: For labs, you can taint-tolerate the control plane or remove the taint to schedule workloads on it.<\/li>\n\n\n\n<li>CRI-O vs containerd: Both are CNCF-compliant. Containerd is widely adopted and documented, making it a safe default.<\/li>\n\n\n\n<li>Managed services: If you prefer less ops burden, consider managed Kubernetes. You still need to understand nodes, networking, and workload design.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"why-run-kubernetes-on-youstable\"><strong>Why Run Kubernetes on YouStable<\/strong><\/h2>\n\n\n\n<p>As a <a href=\"https:\/\/www.youstable.com\/blog\/best-web-hosting-provider-in-india\/\">hosting provider<\/a> focused on performance and reliability, YouStable\u2019s cloud and dedicated servers are ideal for Kubernetes. You get fast NVMe storage, DDoS protection, private networking, and clean OS images that follow best practices. Our engineers can recommend right-sized instances and architectures for production clusters without overpaying.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"full-command-summary-copy-paste\"><strong>Full Command Summary (Copy\/Paste)<\/strong><\/h2>\n\n\n\n<p>Below is a concise sequence for Ubuntu\/Debian. Adjust versions and network CIDR as needed.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1) System prep (all nodes)\nsudo hostnamectl set-hostname &lt;your-hostname&gt;\ncat &lt;&lt;EOF | sudo tee \/etc\/modules-load.d\/k8s.conf\noverlay\nbr_netfilter\nEOF\nsudo modprobe overlay &amp;&amp; sudo modprobe br_netfilter\ncat &lt;&lt;EOF | sudo tee \/etc\/sysctl.d\/99-kubernetes-cri.conf\nnet.bridge.bridge-nf-call-iptables  = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.ipv4.ip_forward                 = 1\nEOF\nsudo sysctl --system\nsudo swapoff -a &amp;&amp; sudo sed -i.bak '\/ swap \/ s\/^\/#\/' \/etc\/fstab\n\n# 2) containerd (all nodes)\nsudo apt-get update &amp;&amp; sudo apt-get install -y containerd\nsudo mkdir -p \/etc\/containerd\ncontainerd config default | sudo tee \/etc\/containerd\/config.toml &gt; \/dev\/null\nsudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \/etc\/containerd\/config.toml\nsudo systemctl enable --now containerd\n\n# 3) Kubernetes packages (all nodes)\nsudo apt-get install -y apt-transport-https ca-certificates curl gpg\nsudo mkdir -p \/etc\/apt\/keyrings\ncurl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/Release.key | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg\necho \"deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/ \/\" | sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list\nsudo apt-get update\nsudo apt-get install -y kubelet kubeadm kubectl\nsudo apt-mark hold kubelet kubeadm kubectl\nsudo systemctl enable --now kubelet\n\n# 4) Control plane init (control plane only)\nsudo kubeadm init --pod-network-cidr=192.168.0.0\/16\nmkdir -p $HOME\/.kube\nsudo cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config\nsudo chown $(id -u):$(id -g) $HOME\/.kube\/config\n\n# 5) CNI (choose one; run on control plane)\nkubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/calico\/v3.26.1\/manifests\/calico.yaml\n# OR\n# kubectl apply -f https:\/\/github.com\/flannel-io\/flannel\/releases\/latest\/download\/kube-flannel.yml\n\n# 6) Join workers (on each worker, use the printed command)\n# sudo kubeadm join &lt;CONTROL_PLANE_IP&gt;:6443 --token &lt;TOKEN&gt; --discovery-token-ca-cert-hash sha256:&lt;HASH&gt;\n\n# 7) Validate (on control plane)\nkubectl get nodes -o wide\nkubectl create deployment nginx --image=nginx --replicas=2\nkubectl expose deployment nginx --type=NodePort --port=80\nkubectl get svc nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"best-practices-from-real-world-deployments\"><strong>Best Practices from Real-World Deployments<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use static IPs or DHCP reservations for nodes; DNS stability matters.<\/li>\n\n\n\n<li>Enable time sync (chrony) across nodes to avoid TLS and scheduling issues.<\/li>\n\n\n\n<li>Pin Kubernetes minor versions across nodes to avoid skew. Upgrade deliberately.<\/li>\n\n\n\n<li>Isolate etcd data to fast disks and back it up regularly.<\/li>\n\n\n\n<li>Keep OS lean: only required packages, automatic security updates where possible.<\/li>\n\n\n\n<li>For production, plan HA: multiple control planes, external etcd, and multiple nodes per AZ.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"faqs-install-kubernetes-on-linux-server\"><strong>FAQs: Install Kubernetes on Linux Server<\/strong><\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1765549608089\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"can-i-install-kubernetes-on-a-single-linux-server\"><strong>Can I install Kubernetes on a single Linux server?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes. Initialize the control plane with kubeadm and remove the default control-plane taint so it can run workloads: kubectl taint nodes &lt;node-name&gt; node-role.kubernetes.io\/control-plane- This setup is fine for development but not recommended for production.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765549618115\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"what-are-the-minimum-server-requirements\"><strong>What are the minimum server requirements?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>For a small cluster, start with 2 vCPU and 4 GB RAM per node. The <a href=\"https:\/\/www.youstable.com\/blog\/benefits-of-web-hosting-control-panel-for-managed-hosting\/\">control plane benefits<\/a> from 4 vCPU and 8\u201316 GB RAM in real workloads. Use fast SSD\/NVMe and reliable networking for stable performance.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765549625813\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"is-docker-required-or-should-i-use-containerd\"><strong>Is Docker required, or should I use containerd?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Use containerd. Kubernetes removed dockershim, and containerd is a first-class, CNCF-compliant runtime. It\u2019s lightweight, well-supported, and aligns with modern Kubernetes guidance.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765549634464\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-expose-apps-to-the-internet\"><strong>How do I expose apps to the internet?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>For quick tests, use a NodePort service. For production, deploy a LoadBalancer (via your <a href=\"https:\/\/www.youstable.com\/blog\/tally-on-cloud-pricing-comparison\/\">cloud provider<\/a>) or install an Ingress controller (like NGINX Ingress or Traefik) and create Ingress resources with TLS.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765549648630\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"how-do-i-uninstall-kubernetes-installed-with-kubeadm\"><strong>How do I uninstall Kubernetes installed with kubeadm?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Drain and delete nodes from the cluster, then run kubeadm reset -f on each node. Remove CNI configs and kubelet data, and optionally purge kubeadm, kubelet, kubectl, and containerd packages as shown in the reset section above.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765549656659\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"which-cni-plugin-should-i-choose\"><strong>Which CNI plugin should I choose?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>For most beginners and SMB production, Calico is a solid default thanks to NetworkPolicy and mature docs. Flannel is simple for labs. If you need advanced observability and eBPF features, consider Cilium<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"final-word\">Final Word<\/h2>\n\n\n\n<p>With these steps, you can confidently install Kubernetes on a Linux server and scale to a resilient cluster. If you\u2019d like help selecting the right instances, storage, and network for your workloads, YouStable\u2019s team can guide you from pilot to production.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>To install Kubernetes on a Linux server, prepare the OS (disable swap, load kernel modules, configure sysctl), install a container [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":15549,"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":""}},"footnotes":""},"categories":[350],"tags":[],"class_list":["post-12512","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledgebase"],"acf":[],"featured_image_src":"https:\/\/www.youstable.com\/blog\/wp-content\/uploads\/2025\/12\/How-to-Install-Kubernetes-on-Linux-Server.jpg","author_info":{"display_name":"Prahlad Prajapati","author_link":"https:\/\/www.youstable.com\/blog\/author\/prahladblog"},"_links":{"self":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/12512","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\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/comments?post=12512"}],"version-history":[{"count":5,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/12512\/revisions"}],"predecessor-version":[{"id":15550,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/12512\/revisions\/15550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media\/15549"}],"wp:attachment":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media?parent=12512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/categories?post=12512"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/tags?post=12512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}