Post

Deploy Kubernetes cluster on DigitalOcean with terraform

Deploy Kubernetes cluster on DigitalOcean with terraform

Installing Terraform

Follow Installation Instructions here.

Digital Ocean provider

1
2
3
4
5
6
7
8
terraform {
  required_providers {
    digitalocean: {
      source = "digitalocean/digitalocean"
      version= "2.22.3"
    }
  }
}

Authentication

Authentication can be done either with environment variables or terraform variables.

Windows PowerShell

Open PowerShell and run the following to add new environment variable.

1
$ENV:DIGITALOCEAN_ACCESS_TOKEN: 'token'

To set the token as environment variable Persistently

1
[System.Environment]::SetEnvironmentVariable('DIGITALOCEAN_ACCESS_TOKEN','token')

Bash

1
export DIGITALOCEAN_ACCESS_TOKEN='token'

To set the token as environment variable Persistently

echo 'export DIGITALOCEAN_ACCESS_TOKEN='token'' >> ~/.profile

Replace token with the actual token.

Using Terraform variables Create var.tf and add following

1
2
3
4
5
variable "do_token" {
    type       = string
    description= "Digital Ocean API Token"
    sensitive  = true
}

And add following to provider.tf

1
2
3
provider "digitalocean" {
  token= var.do_token
}

Variables

Variables and their default values

variableRemarksDefault
do_cluster_nameCluster Namek8s-test
do_regionRegionsfo3
do_pool_nameCluster Pool Namek8s-test-pool
do_node_sizeNode CPu and Memorys-1vcpu-2gb
do_nodepool_countNo’s nodes1
do_pool_ad_nameAdditional Pool Namek8s-test-pool-ad
do_node_ad_sizeNode CPu and Memorys-1vcpu-2gb
do_nodepool_ad_countNode CPu and Memory1
do_nodepool_scaleEnable Autoscalingtrue
do_node_maxMax no’s nodes for auto scale3

Cluster

Cluster module can be found in k8s.tf

k8s version

Get latest k8s version supported by Digital Ocean with digitalocean_kubernetes_versions data source.

1
data "digitalocean_kubernetes_versions" "get_version" {}

To use version prefix, add version_prefix: "1.24"

1
2
3
data "digitalocean_kubernetes_versions" "get_version" {
    version_prefix= "1.24."
}

Cluster with pool

deploy cluster with version from version above

1
2
3
4
5
6
7
8
9
10
11
12
13
resource "digitalocean_kubernetes_cluster" "k8s_cluster" {
  name   = var.do_cluster_name
  region = var.do_region
  version= data.digitalocean_kubernetes_versions.get_version.latest_version

  node_pool {
    name      = var.do_pool_name
    size      = var.do_node_size
    auto_scale= var.do_nodepool_scale
    min_nodes = var.do_nodepool_count
    max_nodes = var.do_node_max
  }
}

Additional pool

1
2
3
4
5
6
7
8
9
resource "digitalocean_kubernetes_node_pool" "k8s_cluster_pool_ad" {
  cluster_id: digitalocean_kubernetes_cluster.k8s_cluster.id

  name      = var.do_pool_ad_name
  size      = var.do_node_ad_size
  auto_scale= var.do_nodepool_scale
  min_nodes = var.do_nodepool_ad_count
  max_nodes = var.do_node_max
}

Deploying

Before deploying make sure everything is as per spec by validating with

1
terraform validate

Plan the deployment with

1
terraform plan

Deploy the cluster with

1
terraform deploy

Append -var "do_token=token" to use different token.

Destroy

To destroy the infrastructure, run

1
terraform destroy

Append -var "do_token=token" to use different token.

Conclusion

Everything used here is in publicly available repo on GitHub here.Check the official documentation here. Feel free to comment here. Au Revoir.

This post is licensed under MIT by the author.