skip to content
Adiatma Blog's

Setup Kubernetes Cluster di Linode

/ 7 min read

Overview

Kubernetes adalah salah satu platform open source yang digunakan untuk mengelolah containerized dan services. kubernetes menyediakan pengaturan yang deklaratif, dan punya dukungan komunitas yang luas juga pustaka yang proper.

Tulisan ini akan membahas tentang “cara setup kubernetes di platform Linode”. Berikut daftar yang akan dibahas.

  • Perkenalan singkat tentang kubernetes
  • Syarat yang dibutuhkan untuk menjalankan kubernetes di platform Linode.
  • Setup publik DNS dengan menggunakan external-dns
  • Setup ingress dengan menggunakan traefik class controller.
  • Setup keamanan untuk HTTPS
  • Cara deploy dengan menggukan kubernetes.

Architecture Overview

Sedikit gambaran architecture ketika kita deploy aplikasi dengan menggunakan kubernetes adalah sebagai berikut:

Architecture

Akses dari luar (internet) trafic nya akan masuk melalui ingress kemudian akan di route ke service yang di tuju.

  • Ingress adalah kubernetes object yang bertugas mengelolah akses dari luar ke dalam service yang ada didalam cluster.
  • Service bertugas untuk expose network yang berjalan di sebuah Pod.
  • Pod adalah bagian dari deployment, atau biasa dikenal sebagai kelompok dari containers.

Pre-requisites

  • Install kubectl
  • Punya akun Linode
  • Install helm

Getting Started

Kubernetes

Kubernetes itu sederhananya adalah sebuah orkestrator untuk mengelolah container, kubernetes cocok untuk microservices dengan skala yang cukup besar.

Kalau pernah belajar docker swarm atau docker compose secara konsep ini mirip tetapi lebih powerfull, karena punya banyak fitur dan support yang banyak untuk mengelolah ratusan bahkan ribuan container.

Sebagai developer pilihlah dengan bijak, kalau service yang dikelolah masih sedikit pakai VM (Virtual Machine) adalah pilihan yang tepat.

Namun kalau butuh skalabilitas tinggi, trafic services yang cukup besar, maka butuh kehandalan kubernetes sebagai pilihan yang tepat.

Untuk lebih detail sila baca referensi di link ini https://kubernetes.io/id/docs/home/

Setup Cluster

Di tahap awal hal yang perlu dilakukan adalah membuat cluster kubernetes di Linode.

Berikut langkah - langkah yang diperlukan:

  • Pilih menu kubernetes di Linode kemudian cukup klik create saja dan lanjutkan.
  • Setup node pools dan region.

Node Pools

node pools adalah kelompok machine yang berada didalam sebuah cluster dan saling terhubung satu dan lainnya, termasuk CPU, memory, networking dan OS.

Node PoolsvCPU’sRAMPriceRegionStorage
shared-node-112 GB$12singapore50 GB
shared-node-212 GB$12singapore50 GB
  • $10/month Load Balancer
  • $2/month Volumes (optional jika dibutuhkan)
nodes=12*2=24
lb=$10
billing=nodes+lb
billing=$34

Kalau di rupiahkan sekitar 552.673 per bulan dengan kurs $1 = 16.255 ribu rupiah.

Setelah selesai setup awal, lanjut untuk download file kubernetes config <cluster-name-kubeconfig.yaml>.

Setelah download selanjutnya teman - teman cukup copy file config tersebut ke dalam direktori .kube/config.yaml di komputer local teman - teman.

Namun jika sebelumnya sudah ada config cluster lainnya. Teman - teman bisa menggunakan cara merge config

contohnya seperti dibawah:

Terminal window
# merge old config witg a new config
mv .kube/config .kube/config.old
# set variable KUBECONFIG
KUBECONFIG=.kube/config.old:~/Downloads/cluster-name-config.yaml kubectl config view --raw > .kube/config
# remove old config
rm -rf .kube/config.old

Selanjutnya bisa di cek hasil config cluster nya dengan perintah seperti ini:

Terminal window
kubectl config get-clusters

Untuk switch cluster direkomendasikan pakai tools ini https://github.com/ahmetb/kubectx

Cara pakainya seperti contoh dibawah:

Terminal window
# list cluster
kubectx
# switch clusters
kubectx <cluster-name>

Gunakan perintah kubectx <cluster-name> untuk merubah ke cluster yang dituju. dengan catatan punya setup lebih dari satu cluster di komputer local teman - teman.

Jika hanya ada satu cluster harusnya tidak perlu switch cluster.

Selanjutnya untuk melihat nodes yang aktif bisa dengan perintah kubectl get nodes.

Terminal window
NAME STATUS ROLES AGE VERSION
lke183742-265723-086716350000 Ready <none> 8d v1.29.2
lke183742-265723-38e33b330000 Ready <none> 8d v1.29.2

Setup external-dns

Untuk menggunakan public DNS dibutuhkan komunikasi ke pihak luar yaitu pengelolah domain / provider DNS. external-dns adalah salah satu tools yang diperlukan, dengan tools ini sumber daya yang ada didalam cluster bisa di expose ke luar dengan menggunakan nama domain.

Untuk daftar penyedia layanan DNS yang di dukung bisa di lihat di sini https://github.com/kubernetes-sigs/external-dns?tab=readme-ov-file#the-latest-release

Selanjutnya karena pihak pengelolah DNS kita berada di platform Cloudflare maka perlu untuk setup external-dns untuk di integrasikan dengan Cloudflare.

Untuk itu teman - teman bisa merujuk ke referensi ini

Membuat API Token di Cloudflare

Login di halaman Cloudflare dan kemudian buat API Token dengan pilihan custom, dengan otoritas Zone Read, DNS Edit dan akses All Zones.

Setelah token diterima selanjutnya perlu untuk membuat secret dengan perintah dibawah:

Terminal window
kubectl create namespace external-dns
kubectl create secret generic cloudflare-api-key --from-literal=apiKey=YOUR_API_TOKEN -n external-dns

Kemudian ganti YOUR_API_TOKEN dengan token yang baru saja kita dapatkan.

Setelah berhasil kemudian perlu untuk membuat file atau manifest values.yaml. dan untuk installasi kita akan pakai helm.

Pastikan sudah switch namespace ke external-dns

provider:
name: cloudflare
env:
- name: CF_API_TOKEN
valueFrom:
secretKeyRef:
name: cloudflare-api-key
key: apiKey

Tahap awal tambahkan repo external-dns di local kemudian update.

Terminal window
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/
helm repo update

Setelah itu install seperti perintah yang ada dibawah.

Terminal window
helm upgrade --install external-dns external-dns/external-dns --values values.yaml

Tunggu sampai selesai kalau sukses harusnya tampil seperti ini:

Terminal window
NAME READY STATUS RESTARTS AGE
external-dns-774984bbc6-zn4d6 1/1 Running 0 7m19s

Sampai disini external-dns sudah terinstall dengan baik, selanjutnya kita akan coba deploy service nginx dengan domain http://nginx.adiatma.tech.

Basic Deployment with HTTP

Untuk manifest nya seperti dibawah ini:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
external-dns.alpha.kubernetes.io/hostname: nginx.adiatma.tech
external-dns.alpha.kubernetes.io/ttl: "120" #optional
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80

Kemudian deploy:

Terminal window
kubectl create -f nginx.yaml

Sampai di tahap ini service nya sudah ter-deploy, dan public dns nya bisa di akses di http://nginx.adiatma.tech.

Jika kembali ke halaman Cloudflare harusnya dns record baru sudah dibuat secara otomatis oleh external-dns.

Sampai di tahap ini sudah berhasil deploy, selanjutnya perlu untuk menambahkan ingress class baru, yaitu traefik.

Setup Traefik untuk Ingress

Traefik adalah salah satu platform open source reverse proxy dan ingress controller yang cukup familiar buat saya pribadi, jika teman - teman punya preferensi yang berbeda silahkan disesuaikan.

Langkah awal kita akan install traefik dengan menggunakan helm charts.

Terminal window
# add traefik to local repos
helm repo add traefik https://traefik.github.io/charts
# install
helm upgrade --install traefik traefik/traefik \
--create-namespace --namespace traefik \
--set "ports.websecure.tls.enable.enabled=true" \
--set "providers.kubernetesIngress.publishedService.enabled=true"

Selanjutnya perlu untuk memastikan lagi, hasil instalasi traefik tersebut di namespace traefik.

Terminal window
kubectl get pods --namespace=traefik
Terminal window
NAME READY STATUS RESTARTS AGE
traefik-7d6bd6f86d-rcjkw 1/1 Running 0 6m39s

Yes harusnya traefik sudah ter install dengan baik.

Setup Cert Manager untuk HTTPS

Selanjutnya untuk meng-aktifkan HTTPS secara otomatis di url website kita perlu untuk setup cert-manager.

Install cert-manager dengan menggunakan helm charts.

Terminal window
# add repo
helm repo add cert-manager https://charts.jetstack.io
# helm install
helm upgrade --install cert-manager cert-manager/cert-manager \
--create-namespace --namespace cert-manager \
--set installCRDs=true

Kemudian pastikan kembali hasil install cert-manager di namespace cert-manager.

Terminal window
kubectl get pods --namespace=cert-manager
Terminal window
NAME READY STATUS RESTARTS AGE
cert-manager-796cbd6574-hfg94 1/1 Running 0 67s
cert-manager-cainjector-9b74bc658-xxkbw 1/1 Running 0 67s
cert-manager-webhook-7ddfd7c4bd-g5pk5 1/1 Running 0 67s

Jika sukses langkah selanjutnya perlu membuat untuk membuat Issuer / ClusterIssuer.

Tujuannya untuk setup certificate authorities (CAs).

Untuk config nya seperti dibawah ini.

Buat issuer.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
email: adiatma.mail@gmail.com
# to use staging environment
# server: https://acme-staging-v02.api.letsencrypt.org/directory
# to use the production environment
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: issuer-letsencrypt-production
solvers:
- http01:
ingress:
class: traefik

Jalankan dengan perintah ini:

Terminal window
kubectl create -f issuer.yaml
# check
kubectl get clusterissuers.cert-manager.io
NAME READY AGE
letsencrypt-production True 15s

Next Deployment with HTTPS

Sampai disini config issuer sudah selesai. dan sekarang kita akan coba lagi membuat deployment baru dengan image nginx.

Terminal window
kubectl create deployment nginx --image=nginx

Selanjutnya expose deployment dengan membuat service nginx.

Terminal window
kubectl expose deployment/nginx --port=80

Kemudian kita akan coba membuat ingress dengan nama nginx, dan menambahkan anotasi di ingress tersebut.

Terminal window
# create new ingress
kubectl create ingress <ingress-name> --rule="nginx.adiatma.tech/*=nginx:80,tls=nginx.adiatma.tech"
# annotate ing with cert-manager
kubectl annotate ing/<ingress-name> cert-manager.io/cluster-issuer=letsencrypt-production

Perintah diatas adalah cara membuat ingress dengan menggunakan CLI kubectl create ingress, untuk manifest nya akan tampil seperti dibawah ini:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production
name: nginx
namespace: tutorial-demo
spec:
ingressClassName: traefik
rules:
- host: nginx.adiatma.tech
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- nginx.adiatma.tech
secretName: nginx.adiatma.tech

Setelah berhasil tunggu saja beberapa menit biasanya butuh waktu sekitar 20 menitan.

Summary

Sampai disini teman - teman sudah berhasil membuat cluster di Linode, kemudian setup external-dns buat expose service ke public DNS, dan secure dns dengan HTTPS, juga memasang Traefik sebagai ingress controller.

Selanjutnya tambahan teman - teman perlu force setiap public route ke port :443, hal tersebut bisa dengan merubah beberapa pengaturan di traefik.

langsung saja edit traefik seperti dibawah.

Terminal window
kubectl edit deployment.apps/traefik --namespace=traefik

Kemudian tambahkan entripoints baru di spec.containers[].args.

- --entrypoints.web.http.redirections.entryPoint.to=:443