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:

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 Pools | vCPU’s | RAM | Price | Region | Storage |
---|---|---|---|---|---|
shared-node-1 | 1 | 2 GB | $12 | singapore | 50 GB |
shared-node-2 | 1 | 2 GB | $12 | singapore | 50 GB |
- $10/month Load Balancer
- $2/month Volumes (optional jika dibutuhkan)
nodes=12*2=24lb=$10billing=nodes+lbbilling=$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:
# merge old config witg a new configmv .kube/config .kube/config.old# set variable KUBECONFIGKUBECONFIG=.kube/config.old:~/Downloads/cluster-name-config.yaml kubectl config view --raw > .kube/config# remove old configrm -rf .kube/config.old
Selanjutnya bisa di cek hasil config cluster nya dengan perintah seperti ini:
kubectl config get-clusters
Untuk switch cluster direkomendasikan pakai tools ini https://github.com/ahmetb/kubectx
Cara pakainya seperti contoh dibawah:
# list clusterkubectx# switch clusterskubectx <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
.
NAME STATUS ROLES AGE VERSIONlke183742-265723-086716350000 Ready <none> 8d v1.29.2lke183742-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:
kubectl create namespace external-dnskubectl 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: cloudflareenv: - name: CF_API_TOKEN valueFrom: secretKeyRef: name: cloudflare-api-key key: apiKey
Tahap awal tambahkan repo external-dns di local kemudian update.
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/helm repo update
Setelah itu install seperti perintah yang ada dibawah.
helm upgrade --install external-dns external-dns/external-dns --values values.yaml
Tunggu sampai selesai kalau sukses harusnya tampil seperti ini:
NAME READY STATUS RESTARTS AGEexternal-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/v1kind: Deploymentmetadata: name: nginxspec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx annotations: external-dns.alpha.kubernetes.io/hostname: nginx.adiatma.tech external-dns.alpha.kubernetes.io/ttl: "120" #optionalspec: selector: app: nginx type: LoadBalancer ports: - protocol: TCP port: 80 targetPort: 80
Kemudian deploy:
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.
# add traefik to local reposhelm repo add traefik https://traefik.github.io/charts# installhelm 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
.
kubectl get pods --namespace=traefik
NAME READY STATUS RESTARTS AGEtraefik-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.
# add repohelm repo add cert-manager https://charts.jetstack.io# helm installhelm 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
.
kubectl get pods --namespace=cert-manager
NAME READY STATUS RESTARTS AGEcert-manager-796cbd6574-hfg94 1/1 Running 0 67scert-manager-cainjector-9b74bc658-xxkbw 1/1 Running 0 67scert-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/v1kind: ClusterIssuermetadata: name: letsencrypt-productionspec: 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:
kubectl create -f issuer.yaml# checkkubectl get clusterissuers.cert-manager.ioNAME READY AGEletsencrypt-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.
kubectl create deployment nginx --image=nginx
Selanjutnya expose deployment dengan membuat service nginx.
kubectl expose deployment/nginx --port=80
Kemudian kita akan coba membuat ingress dengan nama nginx, dan menambahkan anotasi di ingress tersebut.
# create new ingresskubectl create ingress <ingress-name> --rule="nginx.adiatma.tech/*=nginx:80,tls=nginx.adiatma.tech"# annotate ing with cert-managerkubectl 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/v1kind: Ingressmetadata: annotations: cert-manager.io/cluster-issuer: letsencrypt-production name: nginx namespace: tutorial-demospec: 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.
kubectl edit deployment.apps/traefik --namespace=traefik
Kemudian tambahkan entripoints baru di spec.containers[].args
.
- --entrypoints.web.http.redirections.entryPoint.to=:443