How to Deploy Kubernetes Cluster

How to Deploy Kubernetes Cluster Kubernetes has become the de facto standard for container orchestration in modern cloud-native environments. Whether you're managing microservices, scaling applications dynamically, or automating deployments across hybrid and multi-cloud infrastructures, deploying a Kubernetes cluster is the foundational step toward building resilient, scalable, and observable syst

Nov 6, 2025 - 10:24
Nov 6, 2025 - 10:24
 0

How to Deploy Kubernetes Cluster

Kubernetes has become the de facto standard for container orchestration in modern cloud-native environments. Whether you're managing microservices, scaling applications dynamically, or automating deployments across hybrid and multi-cloud infrastructures, deploying a Kubernetes cluster is the foundational step toward building resilient, scalable, and observable systems. This guide provides a comprehensive, step-by-step walkthrough on how to deploy a Kubernetes clusterfrom bare-metal servers to cloud-based environmentswhile emphasizing security, performance, and operational best practices. By the end of this tutorial, you will understand not only the mechanics of cluster deployment but also the strategic considerations that ensure long-term stability and efficiency.

Step-by-Step Guide

Understanding Kubernetes Architecture

Before deploying a Kubernetes cluster, its essential to understand its core components. A Kubernetes cluster consists of two primary types of nodes: the Control Plane and the Worker Nodes.

The Control Plane is responsible for managing the clusters state. It includes:

  • API Server: The front-end for the Kubernetes control plane, exposing the REST API used by all components.
  • etcd: A consistent and highly-available key-value store that holds all cluster data.
  • Controller Manager: Runs controllers that handle routine tasks such as node monitoring, replication, and endpoint management.
  • Scheduler: Assigns newly created pods to worker nodes based on resource availability and constraints.

Worker Nodes run the actual workloads (containers). Each worker node includes:

  • Kubelet: An agent that ensures containers are running in a pod as expected.
  • Kube-proxy: Maintains network rules to enable communication between services and pods.
  • Container Runtime: Software responsible for running containers (e.g., containerd, CRI-O, Docker).

Understanding this architecture ensures you make informed decisions during deploymentsuch as how many control plane nodes to allocate, which container runtime to use, and how to configure networking.

Choosing Your Deployment Environment

Kubernetes can be deployed in multiple environments, each with distinct advantages:

  • On-Premises: Ideal for organizations with strict data residency, compliance, or legacy infrastructure requirements. Requires physical or virtual servers with sufficient CPU, RAM, and storage.
  • Cloud Providers: AWS EKS, Google GKE, and Azure AKS offer managed Kubernetes services that abstract away much of the operational complexity. Best for teams seeking rapid deployment and reduced maintenance overhead.
  • Hybrid/Multi-Cloud: Combines on-premises and cloud resources. Requires advanced networking and identity management (e.g., via Anthos or Rancher).
  • Local Development: Tools like Minikube or Kind allow developers to run single-node clusters on laptops for testing and learning.

For this guide, well focus on deploying a production-grade cluster on Ubuntu 22.04 LTS serverssuitable for on-premises or virtual private server (VPS) environments. The same principles apply to cloud deployments, with minor adjustments for cloud-specific services.

Prerequisites

Before beginning deployment, ensure the following prerequisites are met:

  • Hardware Requirements:
    • Control Plane Nodes: Minimum 2 vCPUs, 4 GB RAM, 40 GB disk space per node (recommended: 4 vCPUs, 8 GB RAM for production).
    • Worker Nodes: Minimum 2 vCPUs, 8 GB RAM, 80 GB disk space per node (scale based on workload).

  • Operating System: Ubuntu 22.04 LTS or CentOS Stream 9. Avoid desktop editions; use server editions for stability.
  • Network: All nodes must be able to communicate over a private network. Open ports: 6443 (API server), 23792380 (etcd), 10250 (Kubelet), 10251 (scheduler), 10252 (controller manager).
  • Domain Name or Static IPs: Assign static IPs to all nodes. Use DNS names if possible for easier certificate management.
  • SSH Access: Enable SSH key-based authentication across all nodes. Disable password authentication for security.

Step 1: Prepare the Operating System

Begin by logging into each server via SSH and running the following commands on all nodes (control plane and worker):

sudo apt update && sudo apt upgrade -y

sudo apt install curl wget vim net-tools -y

Disable swap, which Kubernetes does not support for performance reasons:

sudo swapoff -a
sudo sed -i '/ swap / s/^/

/' /etc/fstab

Enable kernel modules and configure sysctl parameters for networking:

cat overlay

br_netfilter

EOF

sudo modprobe overlay

sudo modprobe br_netfilter

cat

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward = 1

EOF

sudo sysctl --system

These settings ensure proper container networking and packet forwarding between pods.

Step 2: Install Container Runtime (containerd)

Kubernetes requires a container runtime. While Docker was once the default, containerd is now the recommended choice due to its lightweight nature and direct CRI (Container Runtime Interface) compliance.

Install containerd:

sudo apt install containerd -y

sudo mkdir -p /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml

Edit the configuration to use systemd as the cgroup driver (required for Kubernetes):

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

Restart containerd to apply changes:

sudo systemctl restart containerd

sudo systemctl enable containerd

Step 3: Install Kubernetes Components

Add the official Kubernetes APT repository:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

Install kubeadm, kubelet, and kubectl:

sudo apt update

sudo apt install -y kubelet kubeadm kubectl

sudo apt-mark hold kubelet kubeadm kubectl

The apt-mark hold command prevents automatic updates to Kubernetes components, which is critical in production to avoid unexpected breaking changes.

Step 4: Initialize the Control Plane

On the first node designated as the control plane, initialize the cluster using kubeadm:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Replace 10.244.0.0/16 with your preferred pod network CIDR. This value must not overlap with your node network or any other service CIDRs.

Upon successful initialization, youll see output similar to:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

Follow these instructions to configure kubectl for your user:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Verify the cluster status:

kubectl get nodes

At this point, the control plane node will show as NotReady because the network plugin has not been installed yet.

Step 5: Install a Pod Network Add-on

Kubernetes requires a Container Network Interface (CNI) plugin to enable pod-to-pod communication. We recommend Calico for its performance, security, and network policy support.

Apply Calico:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml

Wait a few moments, then check the status:

kubectl get pods -n kube-system

Once all pods (especially calico-node and kube-dns) show Running, verify the node status:

kubectl get nodes

The control plane node should now show as Ready.

Step 6: Join Worker Nodes to the Cluster

To add worker nodes, you need the join command generated during kubeadm init. If you lost it, regenerate it:

sudo kubeadm token create --print-join-command

Copy the output, which looks like:

kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef \

--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

SSH into each worker node and run the join command with sudo:

sudo kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef \

--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

Once joined, return to the control plane and verify the nodes:

kubectl get nodes

You should now see all nodes listed with status Ready.

Step 7: Deploy a Test Application

To confirm your cluster is fully functional, deploy a simple Nginx application:

kubectl create deployment nginx --image=nginx:latest

kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get services

Access the application via any worker nodes IP address and the assigned NodePort (e.g., http://<worker-ip>:30000).

Best Practices

Use Multiple Control Plane Nodes for High Availability

Running a single control plane node creates a single point of failure. For production environments, deploy at least three control plane nodes. Use kubeadms init command on the first node, then join additional control plane nodes using:

sudo kubeadm join <control-plane-ip>:6443 --token <token> \

--discovery-token-ca-cert-hash sha256:<hash> \

--control-plane --certificate-key <key>

Generate the certificate key during init:

sudo kubeadm init phase upload-certs --upload-certs

This ensures certificates are synchronized across control plane nodes, enabling seamless failover.

Implement Role-Based Access Control (RBAC)

Always define granular roles and bindings. Avoid using the default cluster-admin role for everyday tasks. Create custom roles with minimal privileges:

kubectl create role pod-reader --verb=get,list --resource=pods

kubectl create rolebinding dev-pod-reader --role=pod-reader --user=developer

Use service accounts for applications, not user accounts, to reduce attack surface.

Secure etcd and API Server Communication

etcd stores sensitive cluster data. Ensure it communicates over TLS and is not exposed to the public internet. Use network policies to restrict access to etcd ports (23792380) only to control plane nodes.

Enable API server authentication and authorization. Use webhook token authentication or OIDC integration with identity providers like Keycloak or Azure AD.

Apply Resource Requests and Limits

Never deploy containers without resource requests and limits. This prevents resource starvation and enables the scheduler to make intelligent placement decisions.

resources:

requests:

memory: "64Mi"

cpu: "250m"

limits:

memory: "128Mi"

cpu: "500m"

Use Horizontal Pod Autoscalers (HPA) and Cluster Autoscalers to dynamically adjust resources based on load.

Enable Audit Logging

Kubernetes audit logs record all API calls. Enable them to detect unauthorized access or misconfigurations:

sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml

Add:

- --audit-policy-file=/etc/kubernetes/audit-policy.yaml

- --audit-log-path=/var/log/kube-apiserver/audit.log

Create a policy file to define what events to log (e.g., all writes, admin actions).

Regularly Update and Patch

Kubernetes releases new versions every 3 months. Subscribe to security advisories and plan upgrades during maintenance windows. Use tools like kubeadms upgrade command:

sudo kubeadm upgrade plan

sudo kubeadm upgrade apply v1.29.0

Always test upgrades in a staging environment first.

Monitor and Log Everything

Deploy a monitoring stack: Prometheus for metrics, Grafana for dashboards, and Loki or Fluentd for logs. Use Kubernetes-native tools like kube-state-metrics to monitor cluster health.

Tools and Resources

Essential Tools for Kubernetes Deployment

  • kubeadm: Official tool for bootstrapping clusters. Lightweight and reliable for production use.
  • kubectl: Command-line interface for interacting with the cluster. Essential for debugging and management.
  • Calico: High-performance CNI plugin with built-in network policy enforcement.
  • Flannel: Simpler CNI option for basic networking needs (not recommended for production with strict security requirements).
  • Helm: Package manager for Kubernetes. Use Helm charts to deploy complex applications like Prometheus, PostgreSQL, or Kafka with a single command.
  • Kustomize: Native Kubernetes configuration management tool. Ideal for managing environment-specific overlays (dev, staging, prod).
  • Velero: Backup and disaster recovery tool for Kubernetes resources and persistent volumes.
  • Argo CD: GitOps operator for continuous delivery. Automatically syncs cluster state with Git repositories.

Recommended Learning and Reference Resources

Automation and Infrastructure-as-Code

For scalable and repeatable deployments, use Infrastructure-as-Code (IaC) tools:

  • Terraform: Provision VMs, networks, and firewalls on AWS, Azure, or GCP. Use the hashicorp/kubernetes provider to deploy clusters.
  • Ansible: Automate OS-level configuration (e.g., disabling swap, installing containerd) across multiple servers.
  • Packer: Build custom VM images with pre-installed Kubernetes components for faster node provisioning.

Example Terraform snippet for provisioning Ubuntu VMs on AWS:

resource "aws_instance" "k8s_control_plane" {

count = 3

ami = "ami-0abcdef1234567890"

instance_type = "t3.medium"

key_name = "k8s-key"

security_groups = ["k8s-control-plane-sg"]

user_data =

!/bin/bash

apt update && apt install -y containerd kubelet kubeadm kubectl

swapoff -a

EOF

}

Combine this with Ansible playbooks to run kubeadm commands automatically, creating a fully automated cluster deployment pipeline.

Real Examples

Example 1: Deploying a Multi-Tier Application

Consider a web application consisting of a frontend (React), backend (Node.js), and database (PostgreSQL). Heres how to deploy it on your Kubernetes cluster:

1. Create a namespace:

kubectl create namespace myapp

2. Deploy PostgreSQL using a StatefulSet:

kubectl create -f - apiVersion: v1

kind: Service

metadata:

name: postgres

namespace: myapp

spec:

ports:

- port: 5432

selector:

app: postgres

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: postgres

namespace: myapp

spec:

serviceName: "postgres"

replicas: 1

selector:

matchLabels:

app: postgres

template:

metadata:

labels:

app: postgres

spec:

containers:

- name: postgres

image: postgres:15

ports:

- containerPort: 5432

env:

- name: POSTGRES_DB

value: "myapp"

- name: POSTGRES_USER

value: "user"

- name: POSTGRES_PASSWORD

valueFrom:

secretKeyRef:

name: postgres-secrets

key: password

volumeMounts:

- name: postgres-storage

mountPath: /var/lib/postgresql/data

volumeClaimTemplates:

- metadata:

name: postgres-storage

spec:

accessModes: ["ReadWriteOnce"]

resources:

requests:

storage: 10Gi

EOF

3. Create a secret for credentials:

kubectl create secret generic postgres-secrets --from-literal=password=securepassword123 -n myapp

4. Deploy the backend (Node.js):

kubectl create deployment backend --image=myregistry/backend:latest -n myapp

kubectl expose deployment backend --port=3000 --target-port=3000 -n myapp

5. Deploy the frontend (React) as a Deployment with Ingress:

kubectl create deployment frontend --image=myregistry/frontend:latest -n myapp

kubectl expose deployment frontend --port=80 --target-port=80 -n myapp

6. Install NGINX Ingress Controller:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml

7. Create an Ingress resource:

kubectl create -f - apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: myapp-ingress

namespace: myapp

spec:

rules:

- host: app.example.com

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: frontend

port:

number: 80

- path: /api

pathType: Prefix

backend:

service:

name: backend

port:

number: 3000

EOF

Once DNS points to the Ingress controllers external IP, the application is accessible via http://app.example.com.

Example 2: Blue-Green Deployment with Argo CD

Use GitOps to automate blue-green deployments. Maintain two Helm releases in your Git repository: blue and green.

Argo CD continuously monitors your Git repo. When you update the green branch with a new image tag, Argo CD applies the change to the cluster. Once verified, you switch the Ingress to point to the green service. If issues arise, rollback is as simple as reverting the Git commit.

This approach eliminates downtime and ensures consistent, auditable deployments.

FAQs

Can I deploy Kubernetes on my laptop?

Yes, using tools like Minikube or Kind. These create single-node clusters using Docker or virtual machines. Theyre ideal for learning and testing but not suitable for production workloads due to limited resources and lack of high availability.

How many nodes do I need for a production cluster?

Minimum: 3 control plane nodes and 3 worker nodes. This ensures high availability and sufficient capacity for application workloads. Scale worker nodes based on your applications resource demands and expected traffic.

Do I need to use Docker with Kubernetes?

No. Kubernetes uses the Container Runtime Interface (CRI), so you can use containerd, CRI-O, or other CRI-compliant runtimes. Docker is no longer required and has been deprecated as a default runtime since Kubernetes v1.24.

How do I secure my Kubernetes cluster?

Implement these security measures: use RBAC, enable audit logging, restrict API server access, use network policies, scan images for vulnerabilities, sign container images with Cosign, and disable anonymous access. Regularly update components and rotate certificates.

Whats the difference between kubeadm, kops, and EKS?

  • kubeadm: Tool to bootstrap clusters manually on any infrastructure. Requires more configuration but gives full control.
  • kops: Tool for managing production-grade clusters on AWS and other clouds. Automates many tasks but is cloud-specific.
  • EKS/GKE/AKS: Managed services where the cloud provider handles the control plane. Lowest operational overhead but less control over underlying components.

How do I backup my Kubernetes cluster?

Use Velero to back up resources and persistent volumes. Velero can back up to S3, GCS, or Azure Blob Storage. Schedule daily backups and test restores regularly to ensure reliability.

Why is my node showing NotReady after joining?

This usually means the CNI plugin (like Calico) hasnt been installed or is failing. Check pod status in the kube-system namespace. If Calico pods are CrashLooping, verify your pod CIDR matches the one used during kubeadm init.

Can I run Kubernetes on Windows?

Yes, but only as worker nodes. The control plane must run on Linux. Windows containers are supported via Kubernetes 1.18+, but require Windows Server 2019 or later and specific CNI plugins.

Conclusion

Deploying a Kubernetes cluster is not merely a technical taskits the foundation of a modern, scalable, and resilient application infrastructure. By following this guide, youve learned how to install, configure, and secure a production-grade cluster from the ground up. Youve explored best practices for high availability, resource management, and security. Youve seen real-world examples of deploying multi-tier applications and implementing GitOps workflows.

Remember: Kubernetes is not a one-time setup. Its an ongoing operational discipline. Regular monitoring, patching, and optimization are essential. Use automation tools like Terraform and Argo CD to reduce human error and ensure consistency. Always validate your deployments in staging before promoting to production.

As cloud-native technologies continue to evolve, your ability to deploy and manage Kubernetes clusters will remain a critical skill. Start small, learn deeply, and scale thoughtfully. The future of application deployment is orchestrationand youre now equipped to lead it.