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.
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
Pool | Kegunaan |
---|---|
microservices | Untuk aplikasi microservice |
jobs | Untuk jobs/cronjob |
debugs | Untuk debugging/troubleshooting |
frontend | Untuk frontend |
3. Download Config Kubernetes
Cara ini akan mendownload config kubernetes dan menyimpannya kedalam file $HOME/.kube/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
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