Kali ini kita akan membahas cara untuk deploy Kubernetes di DigitalOcean dengan Terraform. Kubernetes dari DigitalOcean adalah managed kubernetes yang ditawarkan oleh DigitalOcean, saat ini versi yang tersedia adalah 1.21.x, 1.20.x dan 1.19.x. Disini yang perlu kita bayar adalah node yang digunakan kubernetes, karena control plane-nya sendiri disediakan gratis.

Untuk menjalankan kubernetes dengan biaya termurah di Digital Ocean adalah $10 atau sekitar Rp. 140.000/bulan.

Install Terraform, kubectl dan doctl

1. Install Terraform
Terraform adalah infrastructure as code yang memungkinkan untuk build, scaling dan manage server dari code atau lebih spesific dengan YAML file. DigitalOcean merupakah salah satu dari provider yang disupport Terraform, jadi kita bisa langsung menggunakan terraform ini untuk deploy berbagai macam service di DO

wget https://releases.hashicorp.com/terraform/1.1.2/terraform_1.1.2_linux_amd64.zip
unzip terraform_1.1.2_linux_amd64.zip
sudo cp terraform /usr/local/bin/terraform

2. Install doctl
doctl adalah command line interface/CLI dari DigitalOcean yang digunakan untuk mengelola services yang ditawarkan lewat CLI. Dengan doctl banyak yang bisa operasi yang bisa dilakukan tanpa perlu login ke dashboard DigitalOcean.
Install doctl di Linux

wget https://github.com/digitalocean/doctl/releases/download/v1.68.0/doctl-1.68.0-linux-amd64.tar.gz
tar zxvf doctl-1.68.0-linux-amd64.tar.gz
sudo cp doctl /usr/local/bin/doctl

3. Install kubectl
kubectl adalah command line interface, tool ini yang akan banyak kita gunakan untuk berinteraksi dengan Kubernetes.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo cp kubectl /usr/local/bin/kubectl

1. Buat Token API

Token/Key ini digunakan sebagai akses masuk ke akun DigitalOcean anda, token ini bisa digunakan di terraform dan doctl. Buat lewat api/token.
digitalocean personal access token
nanti muncul tokennya, simpan token tersebut. Di terminal anda eksekusi

export DIGITALOCEAN_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

token ini yang akan digunakan oleh terraform nantinya.

2. Terraform

Buat folder tempat menyimpan konfigurasi Terraform, disini kita akan menggunakan folder terraform-kubernetes

mkdir terraform-kubernetes
cd terraform-kubernetes

di folder tersebut buat file provider.tf, yang berisi

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.16.0"
    }
  }
}
 
provider "digitalocean" {
  # Configuration options
}
 
resource "digitalocean_kubernetes_cluster" "jaranguda-sg-prod" {
  name   = "jaranguda-sg-prod"
  region = "sgp1"
  # Grab the latest version slug from `doctl kubernetes options versions`
  version = "1.21.5-do.0"
 
  node_pool {
    name       = "default-pool"
    size       = "s-1vcpu-2gb"
    node_count = 2
  }
}
 
resource "digitalocean_kubernetes_node_pool" "microservices" {
  cluster_id = digitalocean_kubernetes_cluster.jaranguda-sg-prod.id
 
  name       = "microservices"
  size       = "s-1vcpu-2gb"
  node_count = 2
  tags       = ["backend"]
 
  labels = {
    service  = "backend"
  }
 
}
 
resource "digitalocean_loadbalancer" "public-lb" {
  name   = "public-lb"
  region = "sgp1"
  size = "lb-small"
  algorithm = "round_robin"
 
  forwarding_rule {
    entry_port     = 80
    entry_protocol = "http"
 
    target_port     = 80
    target_protocol = "http"
  }
 
}

Dari script diatas akan kita buat cluster kubernetes dengan nama jaranguda-sg-prod, di region Singapore, dengan 2 node pool (default-pool dan microservices), dan 1 Load Balancer.
Biasa saya menggunakan node berbeda untuk berbagai jenis services, contoh

PoolKegunaan
microservicesUntuk aplikasi microservice
jobsUntuk jobs/cronjob
debugsUntuk debugging/troubleshooting
frontendUntuk frontend

3. Download Config Kubernetes

Cara ini akan mendownload config kubernetes dan menyimpannya kedalam file $HOME/.kube/configdigitalocean download kubernetes config

doctl kubernetes cluster kubeconfig save CLUSTERNAME
# contoh
doctl kubernetes cluster kubeconfig save jaranguda-sg-prod

4. Test Deployment Kubernetes

Buat file YAML sederhana, nginx.yaml, untuk mengetes cluster yang baru dibuat

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

deploy dengan kubectl

kubectl apply -f nginx.yaml 
# output
pod/nginx created

cek informasi pod yang baru di deploy

kubectl describe pod/nginx

akses shell pod nginx

kubectl exec --tty --stdin pod/nginx -- sh

docker exec pod nginx

Akses POD dengan Public IP/Load Balancer

Ubah nginx.yaml menjadi

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-services
  labels:
    service: nginx-services
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80

re-deploy nginx.yaml

kubectl apply -f nginx.yaml

Cek services yang baru dibuat

kubectl get pods,services
# output
NAME        READY   STATUS    RESTARTS   AGE
pod/nginx   1/1     Running   0          7m41s
 
NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
service/kubernetes       ClusterIP      10.245.0.1       <none>         443/TCP        67m
service/nginx-services   LoadBalancer   10.245.212.106   167.99.31.xx   80:30565/TCP   8m5s

dibrowser buka yang EXTERNAL-IP di TYPE LoadBalancer

nginx kubernetes via public ip

Leave a comment

Your email address will not be published. Required fields are marked *