Creating Kubernetes cluster on DigitalOcean
First of all, why this article? This article is for those people like me, who want to quickly create a simple Kubernetes cluster to learn and try out things. Also, use it for some medium size applications. But you got lost in jargon, documentation, and terminologies surrounding it.
There are several ways to create a Kubernetes cluster – AWS, Azure, DigitalOcean, etc. The list continues. What I find good about DigitalOcean is – it is one of the cheapest and quickest using DigitalOcean. Yes, there are more complex solutions and more features in other options, but that is not my aim as a beginner.
What we know about the Kubernetes cluster, it has one or more master nodes and one or more worker nodes. And there is a CLI available called kubectl. Using kubectl, we inform Kubernetes cluster how many pods to run, what configmaps and services to be present, etc. The Kubernetes cluster accordingly should do the job. So, my option has been DigitalOcean.
The setup includes two parts.
- Kubernetes cluster with two worker nodes on DigitalOcean.
- Ubuntu machine I have taken on AWS where I will install kubectl.
The second point can be any machine, even your laptop. But I prefer keeping all things on the cloud.
With no more time spent on theory, let’s start with the steps.
1. Sign up in DigitalOcean and fill in your billing details
Below is the first page you see after signing up. They would not charge you unless you are going to use any resources. Click on the “Explore our control panel” link on this page.

2. First project page is displayed

3. Click on the “Create” dropdown
You would see the option “Create Kubernetes clusters” in the dropdown of Create as below.

4. The “Create a Kubernetes cluster” page is displayed

5. Fill up each of the settings for the cluster creation
The entire page with the options I filled is as in the below image. We will discuss each setting in detail.

VPC Network: You can fill in the nearest or your choice of location for this option. We have filled NYC.
Kubernetes Version: We left the recommended latest version as it is in the selection.
Cluster capacity: We have chosen Fixed as we want the most simple possible configuration. We selected the machine type and node plan for the most basic ones present. The aim is to get minimal and cheapest options as we are just using them for learning or demo purpose. In an actual production system, you can choose more high-end options.
Nodes: We have chosen the number of worker nodes as 2. We want multiple nodes to test out things, but we do not want to scale too much. Two nodes are enough.
The rest of the options are left as they are. And we can click on the “Create cluster” button.
6. The node pool status portion shows the status as “Provisioning”

7. Node status becomes “Running”

8. The “Resources” tab shows the node pool name and each of the nodes

9. Click on Dashboard for the node pool to see the workloads page

10. Click on Nodes in the left tab to see details of each of the worker nodes

11. Click on the Overview tab and click on “Get Started”

12. “Connecting to Kubernetes” page displays connection options
Usually, we consider the Kubernetes cluster as a set of one or more worker nodes, one or more master nodes, and one admin node where the control plane and coredns can reside. kubectl is a CLI utility provided on the admin node. Using this CLI, you can spawn the instructions to the Kubernetes cluster.
DigitalOcean setup provides only worker nodes and keeps Core DNS and Control Plane on separate nodes.
As seen in the below image, it provides two CLIs – doctl and kubectl options. We should install either of these on our machines and send instructions to the Kubernetes cluster. We have chosen the kubectl option as it is more standard. Also, we want full control of each step while doing operations on the Kubernetes cluster.

13. Download the kubeconfig YAML and issue kubectl commands
Login to your machine. Download kubectl as per the OS. In the above case, I took an AWS-hosted Ubuntu machine, and installed kubectl using instructions from the link in the above image that says “Kubernetes official client”.
The individual steps followed for the same are as below.
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 138 100 138 0 0 579 0 --:--:-- --:--:-- --:--:-- 577
100 45.7M 100 45.7M 0 0 39.4M 0 0:00:01 0:00:01 --:--:-- 112M
$ curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 138 100 138 0 0 585 0 --:--:-- --:--:-- --:--:-- 587
100 64 100 64 0 0 134 0 --:--:-- --:--:-- --:--:-- 134
$ echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
kubectl: OK
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
$ kubectl version --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:58:30Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Finally, we are displaying the version of kubectl by using “kubectl version –client” command. The version of kustomize is v4.5.7, go is go1.19.4, version of kubectl is 1.26.
With the downloaded kubeconfig file, we can issue kubectl commands to know the nodes or cluster info as below. We can use the config file in the argument as below.
$ mkdir kubernetes
$ cd kubernetes/
~/kubernetes$ pwd
/home/ubuntu/kubernetes
Download the kubeconfig file here.
~/kubernetes$ kubectl --kubeconfig=/home/ubuntu/kubernetes/k8s-1-25-4-do-0-nyc1-xyz-kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
pool-s6agz78ze-m6ae5 Ready <none> 29m v1.25.4
pool-s6agz78ze-m6aes Ready <none> 29m v1.25.4
There is an alternative method. Keep the KUBECONFIG environment variable in the .bashrc file to point to the kubeconfig file, as shown below. Now, we can issue kubectl commands without passing the kubeconfig file each time as an argument.
~/kubernetes$ cat ~/.bashrc | grep KUBE
export KUBECONFIG=/home/ubuntu/kubernetes/k8s-1-25-4-do-0-nyc1-xyz-kubeconfig
~/kubernetes$ source ~/.bashrc
~/kubernetes$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
pool-s6agz78ze-m6ae5 Ready <none> 32m v1.25.4
pool-s6agz78ze-m6aes Ready <none> 33m v1.25.4
That’s it.
The Kubernetes cluster with two worker nodes and our machine as the client is ready. We can have more variations like volumes, secrets setup, and database setup automated in the above process. But to learn Kubernetes in fully detailed ways, it is good to do them without using any automation provided by respective third-party tools.