---
title: "Stand up Kubernetes"
description: "Calico the hard way — stand up a minimal Kubernetes cluster ready to receive a manual Calico Open Source installation."
product: "Calico Open Source"
version: "3.32 (latest)"
section: "Installing and upgrading"
canonical_url: "https://docs.tigera.io/calico/latest/getting-started/kubernetes/hardway/standing-up-kubernetes"
---

# Stand up Kubernetes

We will install Calico on a Kubernetes cluster. To demonstrate a highly available Calico control plane, we will use five nodes in this guide. This lab walks you through provisioning a Kubernetes cluster in AWS using kubeadm.

## Provision EC2 Nodes

1. Provision five nodes

   1. Ubuntu 20.04 LTS - Focal
   2. T2.medium
   3. Ensure the instances are in the same subnet, and security group policy allows them communicate freely with one another.
   4. Disable Source / Destination Checks on the Elastic Network Interface for each instance

2. Install Docker on each node

   1. `sudo apt update`
   2. `sudo apt install docker.io`
   3. `sudo systemctl enable docker`

## Install Kubernetes

1. Install kubeadm, kubelet, kubectl by following [official documentation](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl)

2. Choose one node as your Kubernetes master. On that node `sudo kubeadm init --pod-network-cidr=192.168.0.0/16`

   The Kubernetes `pod-network-cidr` is the IP prefix for all pods in the Kubernetes cluster. This range must not clash with other networks in your VPC.

3. On all other nodes `sudo kubeadm join <output from kubeadm init>`

4. Copy admin credentials

5. Test Access

   1. Run

      `kubectl get nodes`

      Verify all nodes have joined. At this point nodes have joined but they are in `NotReady` state, because Kubernetes can't find a networking provider and configuration.

## Next

[The Calico datastore](https://docs.tigera.io/calico/latest/getting-started/kubernetes/hardway/the-calico-datastore.md)
