How To Create a Kubernetes Cluster on Digital Ocean using Terraform
May 2020
The source code for this post can be found on Github.
Kubernetes has democratized the cloud more than any piece of software before or since. What used to be proprietary APIs by AWS, Azure, or GCP for things like auto scaling groups, load balancers, or virtual machines is now abstracted away behind never ending yaml configuration. Combine this wonderful abstraction with the pricing model of Digital Ocean and you've got all the makings of a developer party.
To spin up a simple digital ocean kubernetes cluster to play around with, I decided to use terraform:
provider "digitalocean" {
// token automatically picked up using env variables
}
variable "region" {
# `doctl kubernetes options regions` for full list
default = "sfo3"
}
data "digitalocean_kubernetes_versions" "do_k8s_versions" {}
output "k8s-versions" {
value = data.digitalocean_kubernetes_versions.do_k8s_versions.latest_version
}
resource "digitalocean_kubernetes_cluster" "hellok8s" {
name = "hellok8s"
region = var.region
# Or grab the latest version slug from `doctl kubernetes options versions`
version = data.digitalocean_kubernetes_versions.do_k8s_versions.latest_version
node_pool {
name = "worker-pool"
size = "s-2vcpu-2gb"
node_count = 1
}
}
You'll need to set an environment variable for terraform to pick up the credentials necessary to actually run this [DIGITALOCEAN_ACCESS_TOKEN]. Here, I'm using a terraform data source to provide the version to use, since digital ocean changes the versions that they are supporting on a regular basis. This kubernetes cluster will not be dynamically spinning up and down DO infrastructure, instead it will have a single worker node. I also have elected to use the third San Fransisco data center. If you want to find out what data centers can support this, you can run:
$ doctl kubernetes options regions
If you navigate to the directory where the above file (I called it kubs.tf) is located, run:
$ terraform apply
And wait about five minutes, it will finally come up. If you go and configure doctl, the command line client for digital ocean, then you should be able to see your cluster with:
$ doctl kubernetes cluster list
ID Name Region Version Auto Upgrade Status Node Pools
02522c88-9c46-4a4e-9776-a7e1e229b13a hellok8s sfo3 1.17.5-do.0 false running worker-pool
You can save the context for the kubectl cli utility with:
$ doctl kubernetes cluster kubeconfig save hellok8s
Then you should be able to start running kubernetes commands:
$ kubectl get deployments -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system cilium-operator 1/1 1 1 18m
kube-system coredns 2/2 2 2 18m
kube-system kubelet-rubber-stamp 1/1 1 1 18m
And you're good to go.
Nick Fisher is a software engineer in the Pacific Northwest. He focuses on building highly scalable and maintainable backend systems.