{"id":13332,"date":"2025-12-20T10:34:36","date_gmt":"2025-12-20T05:04:36","guid":{"rendered":"https:\/\/www.youstable.com\/blog\/?p=13332"},"modified":"2026-09-07T11:12:18","modified_gmt":"2026-09-07T05:42:18","slug":"how-to-setup-kubernetes-on-linux-server","status":"publish","type":"post","link":"https:\/\/www.youstable.com\/blog\/how-to-setup-kubernetes-on-linux-server\/","title":{"rendered":"How to Setup Kubernetes on Linux Server &#8211; Complete Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>To set up Kubernetes on a Linux server<\/strong>, prepare supported hosts, install a container runtime (containerd), disable swap, configure kernel networking, install kubelet\/kubeadm\/kubectl, initialize the control plane with kubeadm, deploy a CNI (e.g., Calico), and join worker nodes. Validate with kubectl get nodes and secure the cluster with sensible firewall and RBAC settings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, you\u2019ll learn How to Setup Kubernetes on Linux Server the right way\u2014using kubeadm, containerd, and a production-ready networking stack. We\u2019ll cover prerequisites, step-by-step installation on Ubuntu\/Debian and RHEL derivatives, common variations, best practices, troubleshooting, and FAQs based on real-world hosting experience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"why-this-guide-and-who-its-for\"><strong>Why This Guide and Who it\u2019s For<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial targets beginners and sysadmins who want a stable, repeatable Kubernetes cluster on bare-metal or VPS. It reflects current Kubernetes packaging, CRI containerd defaults, and networking settings that pass production smell tests at hosting scale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"prerequisites-and-system-requirements\"><strong>Prerequisites and System Requirements<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"supported-linux-distributions\"><strong>Supported Linux distributions<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use maintained, recent LTS versions. Common choices:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ubuntu 22.04\/24.04 LTS<\/li>\n\n\n\n<li>Debian 12 (Bookworm)<\/li>\n\n\n\n<li>Rocky Linux 9 \/ AlmaLinux 9 \/ RHEL 9<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"minimum-resources-per-node\"><strong>Minimum resources per node<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CPU: 2 vCPU (4+ recommended for control-plane)<\/li>\n\n\n\n<li>RAM: 4 GB minimum (8+ GB recommended for control-plane)<\/li>\n\n\n\n<li>Disk: 30+ GB free SSD<\/li>\n\n\n\n<li>Network: Stable, low-latency, outbound internet for images\/manifests<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"networking-and-ports\"><strong>Networking and ports<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Control-plane (TCP): 6443 (API server), 2379-2380 (etcd), 10250, 10257, 10259<\/li>\n\n\n\n<li>Worker nodes (TCP): 10250, NodePort range 30000\u201332767<\/li>\n\n\n\n<li>Allow intra-cluster traffic between nodes; disable conflicting firewalls or open the ports above.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"step-by-step-kubernetes-setup-on-linux-with-kubeadm\"><strong>Step-by-Step: Kubernetes Setup on Linux with kubeadm<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We\u2019ll use containerd (recommended CRI), kubeadm for bootstrapping, and Calico for CNI. Repeat the pre-steps on all nodes. Run init on the control-plane node only.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"1-set-hostname-update-packages-and-time-sync\"><strong>1) Set hostname, update packages, and time sync<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Set unique hostnames on each node\nsudo hostnamectl set-hostname cp-1   # control-plane example\n# sudo hostnamectl set-hostname worker-1  # worker example\n\n# Update system packages\nsudo apt update &amp;&amp; sudo apt -y upgrade    # Ubuntu\/Debian\n# sudo dnf -y update                      # RHEL\/Rocky\/Alma\n\n# Install NTP\/time sync (Ubuntu\/Debian)\nsudo apt -y install chrony\nsudo systemctl enable --now chronyd\n# RHEL\/Rocky\/Alma typically have chrony enabled by default<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"2-disable-swap-and-configure-kernel-networking\"><strong>2) Disable swap and configure kernel networking<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes requires swap off. Enable required kernel modules and sysctl for bridged traffic and forwarding.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Disable swap now and persist across reboots\nsudo swapoff -a\nsudo sed -i.bak '\/sswaps\/s\/^\/#\/' \/etc\/fstab\n\n# Load kernel modules\ncat &lt;&lt;EOF | sudo tee \/etc\/modules-load.d\/k8s.conf\noverlay\nbr_netfilter\nEOF\nsudo modprobe overlay\nsudo modprobe br_netfilter\n\n# Sysctl settings for Kubernetes networking\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<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"3-install-containerd-cri-and-set-systemd-cgroups\"><strong>3) Install containerd (CRI) and set systemd cgroups<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Containerd is the recommended runtime. Configure it to use systemd cgroups to match kubelet defaults.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ubuntu\/Debian\nsudo apt -y install curl gnupg2 software-properties-common ca-certificates apt-transport-https\nsudo mkdir -p \/etc\/apt\/keyrings\ncurl -fsSL https:\/\/download.docker.com\/linux\/$(. \/etc\/os-release; echo $ID)\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\necho \n  \"deb &#91;arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/$(. \/etc\/os-release; echo $ID) \n  $(. \/etc\/os-release; echo $VERSION_CODENAME) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null\n\nsudo apt update\nsudo apt -y install containerd.io\n\n# Generate default config and switch to 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<pre class=\"wp-block-code\"><code># RHEL\/Rocky\/Alma\nsudo dnf -y install yum-utils device-mapper-persistent-data lvm2\nsudo dnf config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo\nsudo dnf -y install containerd.io\n\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\n\n# Ensure <a href=\"https:\/\/www.youstable.com\/blog\/install-selinux-on-linux\/\">SELinux has container-selinux installed<\/a> (preferred) or set permissive if you must:\n# sudo dnf -y install container-selinux\n# sudo setenforce 0 &amp;&amp; sudo sed -i 's\/^SELINUX=enforcing\/SELINUX=permissive\/' \/etc\/selinux\/config<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"4-install-kubelet-kubeadm-and-kubectl\"><strong>4) Install kubelet, kubeadm, and kubectl<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install the Kubernetes packages from the official repositories (pkgs.k8s.io). Repeat on all nodes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ubuntu\/Debian (example uses v1.30 stable channel)\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 update\nsudo apt -y install kubelet kubeadm kubectl\nsudo apt-mark hold kubelet kubeadm kubectl\nsudo systemctl enable --now kubelet<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># RHEL\/Rocky\/Alma\ncat &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 -y install kubelet kubeadm kubectl\nsudo systemctl enable --now kubelet<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"5-initialize-the-control-plane\"><strong>5) Initialize the control-plane<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run this on your control-plane node only. Choose a Pod CIDR that your CNI supports. Calico defaults to 192.168.0.0\/16.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm init --pod-network-cidr=192.168.0.0\/16\n\n# Set kubeconfig for your non-root 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 class=\"wp-block-paragraph\">Note the kubeadm join command printed at the end. You\u2019ll use it on worker nodes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"6-install-a-cni-plugin-calico-example\"><strong>6) Install a CNI plugin (Calico example)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Apply a networking add-on so Pods can communicate. Calico is a popular choice for policy and performance.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># From the control-plane with kubectl configured\nkubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/calico\/v3.27.3\/manifests\/calico.yaml\n\n# Wait for core components to become Ready\nkubectl get pods -n kube-system -w<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"7-join-worker-nodes\"><strong>7) Join worker nodes<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On each worker node, paste the exact join command with token and discovery-hash from kubeadm init output.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo 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<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"8-validate-the-cluster\"><strong>8) Validate the cluster<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># On the control-plane\nkubectl get nodes\nkubectl get pods -A\n\n# Test deployment\nkubectl create deployment nginx --image=nginx:stable\nkubectl expose deployment nginx --port=80 --type=NodePort\nkubectl get svc nginx -o wide<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"common-variations-and-choices\"><strong>Common Variations and Choices<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ubuntu-debian-vs-rhel-like\"><strong>Ubuntu\/Debian vs RHEL-like<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Package managers differ (apt vs dnf), but kubeadm flow is identical.<\/li>\n\n\n\n<li>SELinux: Keep enforcing with container-selinux; permissive only if necessary.<\/li>\n\n\n\n<li>Firewalld\/UFW: Open Kubernetes ports or temporarily disable during testing.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"cni-plugins-calico-flannel-cilium\"><strong>CNI plugins (Calico, Flannel, Cilium)<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Calico: rich NetworkPolicy, BGP options, widely used.<\/li>\n\n\n\n<li>Flannel: simple overlay, easy for labs.<\/li>\n\n\n\n<li>Cilium: eBPF-based performance and security visibility.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"best-practices-and-security-hardening\"><strong>Best Practices and Security Hardening<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use distinct control-plane and worker nodes; taint control-plane to avoid app workloads.<\/li>\n\n\n\n<li>Pin minor Kubernetes version and plan quarterly upgrades; test in staging first.<\/li>\n\n\n\n<li>Restrict API access to trusted IPs; enforce RBAC and least privilege.<\/li>\n\n\n\n<li>Rotate join tokens and TLS certificates before expiry.<\/li>\n\n\n\n<li>Enable audit logs and monitor with a SIEM.<\/li>\n\n\n\n<li>Use encrypted etcd and secure backups; protect \/etc\/kubernetes and kubeconfig files.<\/li>\n\n\n\n<li>Scan container images, sign with SBOM\/attestations, and use admission policies.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"troubleshooting-checklist\"><strong>Troubleshooting Checklist<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kubelet not Ready: Check swap is off, containerd running, and SystemdCgroup=true.<\/li>\n\n\n\n<li>Pods stuck Pending: CNI not installed or wrong Pod CIDR. Verify calico or chosen plugin.<\/li>\n\n\n\n<li>Join failures: Ensure ports open (6443), correct token\/hash, time sync, DNS working.<\/li>\n\n\n\n<li>CoreDNS CrashLoop: Verify cluster DNS, node resolv.conf, and CNI status.<\/li>\n\n\n\n<li>Network policies block traffic: Temporarily remove policies to isolate the issue.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Quick diagnostics\nsudo systemctl status kubelet containerd\njournalctl -u kubelet -f\nkubectl get nodes -o wide\nkubectl get pods -A -o wide\nkubectl describe node &lt;name&gt;\nkubectl describe pod &lt;name&gt; -n &lt;ns&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"scaling-and-high-availability-optional\"><strong>Scaling and High Availability (Optional)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For HA, deploy 3 control-plane nodes behind a TCP <a href=\"https:\/\/www.youstable.com\/blog\/install-load-balancer-on-linux\/\">load balancer<\/a> on port 6443 and externalize etcd or use stacked etcd with odd quorum. Automate provisioning with configuration management (Ansible\/Terraform) and store cluster state backups securely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"when-to-choose-managed-or-provider-assisted-kubernetes\"><strong>When to Choose Managed or Provider-Assisted Kubernetes<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you prefer to focus on workloads instead of bootstrap and lifecycle tasks, consider managed control planes or provider-assisted clusters. At YouStable, our Kubernetes-ready VPS and Bare Metal give you fast NVMe, premium bandwidth, and 24\u00d77 support to help you initialize kubeadm, tune networking, and scale with confidence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"full-command-recap-ubuntu-debian\"><strong>Full Command Recap (Ubuntu\/Debian)<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># 1) Swap, modules, sysctl\nsudo swapoff -a &amp;&amp; sudo sed -i.bak '\/sswaps\/s\/^\/#\/' \/etc\/fstab\necho -e \"overlaynbr_netfilter\" | sudo tee \/etc\/modules-load.d\/k8s.conf\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\n\n# 2) containerd\nsudo apt update &amp;&amp; sudo apt -y install ca-certificates curl gnupg apt-transport-https\nsudo install -m 0755 -d \/etc\/apt\/keyrings\ncurl -fsSL https:\/\/download.docker.com\/linux\/$(. \/etc\/os-release; echo $ID)\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\necho \"deb &#91;arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/$(. \/etc\/os-release; echo $ID) $(. \/etc\/os-release; echo $VERSION_CODENAME) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null\nsudo apt update &amp;&amp; sudo apt -y install containerd.io\nsudo mkdir -p \/etc\/containerd &amp;&amp; containerd 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) kubeadm, kubelet, kubectl\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 update &amp;&amp; sudo apt -y install kubelet kubeadm kubectl\nsudo apt-mark hold kubelet kubeadm kubectl\nsudo systemctl enable --now kubelet\n\n# 4) Control-plane init\nsudo kubeadm init --pod-network-cidr=192.168.0.0\/16\nmkdir -p $HOME\/.kube &amp;&amp; sudo cp \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config &amp;&amp; sudo chown $(id -u):$(id -g) $HOME\/.kube\/config\nkubectl apply -f https:\/\/raw.githubusercontent.com\/projectcalico\/calico\/v3.27.3\/manifests\/calico.yaml\nkubectl get nodes<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"conclusion\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now you know How to Setup Kubernetes on Linux Server using kubeadm and containerd, from kernel prerequisites to a functioning CNI. Keep versions pinned, automate your steps, and harden security. If you need performance-tuned nodes and expert help, YouStable\u2019s Kubernetes-ready servers can accelerate your rollout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"faqs-how-to-setup-kubernetes-on-linux-server\"><strong>FAQs: How to Setup 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-1765794931392\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"u003cstrongu003eis-docker-required-for-kubernetes-or-should-i-use-containerdu003c-strongu003e\">u003cstrongu003eIs Docker required for Kubernetes, or should I use containerd?u003c\/strongu003e<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Docker is no longer required. Kubernetes uses the Container Runtime Interface (CRI). Containerd is the recommended, lightweight runtime and is fully supported. If you must use Docker, install cri-dockerd to bridge CRI, but containerd is simpler and more future-proof.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765794939848\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"u003cstrongu003ewhich-linux-is-best-for-a-kubernetes-clusteru003c-strongu003e\">u003cstrongu003eWhich Linux is best for a Kubernetes cluster?u003c\/strongu003e<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Ubuntu LTS (22.04\/24.04) and RHEL derivatives (Rocky\/Alma 9) are excellent choices due to long support cycles and strong ecosystem packages. The kubeadm workflow is nearly identical across these distributions.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765794946481\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"u003cstrongu003ewhat-pod-cidr-should-i-choose-for-my-clusteru003c-strongu003e\">u003cstrongu003eWhat Pod CIDR should I choose for my cluster?u003c\/strongu003e<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Pick a CIDR that doesn\u2019t overlap with your existing networks and matches your CNI defaults. Calico commonly uses 192.168.0.0\/16. If you select a different CNI, verify its recommended Pod CIDR before running kubeadm init.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765794954781\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"u003cstrongu003ehow-do-i-reset-or-clean-up-a-failed-kubeadm-installu003c-strongu003e\">u003cstrongu003eHow do I reset or clean up a failed kubeadm install?u003c\/strongu003e<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Run sudo kubeadm reset -f, remove $HOME\/.kube\/config, and remove CNI files under \/etc\/cni\/net.d and iptables rules if needed. Then repeat the prerequisites and install steps carefully before re-initializing.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1765794962548\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \" class=\"rank-math-question \" id=\"u003cstrongu003ecan-i-run-kubernetes-on-a-single-server-for-learningu003c-strongu003e\">u003cstrongu003eCan I run Kubernetes on a single server for learning?u003c\/strongu003e<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes. Use a single-node control-plane and optionally untaint it to schedule workloads there. For production, separate control-plane and worker nodes and design for high availability with 3 control-plane nodes.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>To set up Kubernetes on a Linux server, prepare supported hosts, install a container runtime (containerd), disable swap, configure kernel [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":15498,"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":69,"footnotes":""},"categories":[350,2267],"tags":[],"class_list":["post-13332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledgebase","category-kb-devops"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/13332","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=13332"}],"version-history":[{"count":1,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/13332\/revisions"}],"predecessor-version":[{"id":23273,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/posts\/13332\/revisions\/23273"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media\/15498"}],"wp:attachment":[{"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/media?parent=13332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/categories?post=13332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.youstable.com\/blog\/wp-json\/wp\/v2\/tags?post=13332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}