Docker Swarm vs Kubernetes
Apa yang harus dipersiapkan ketika traffic aplikasi sudah semakin banyak?
Orkestrasi kontainer untuk Scale Up aplikasi
Docker Swarm dan Kubernetes adalah platform orkestrasi kontainer, yang bertujuan untuk memudahkan pengelolaan multiple kontainer dan memungkinkan aplikasi agar dapat diduplikasi sehingga dapat menangani pertukaran data yang lebih banyak.
Docker Swarm adalah alat orkestrasi kontainer bawaan dari Docker. Ia dirancang untuk memudahkan pengguna Docker dalam mengelola sekelompok kontainer sebagai sebuah sistem terdistribusi. Docker Swarm memungkinkan pengguna untuk mengelompokkan beberapa kontainer Docker menjadi sebuah cluster dan mengelola kontainer secara terpusat.
Kubernetes (sering disingkat K8s) adalah platform open-source yang dikembangkan oleh Google untuk otomatisasi deployment, scaling, dan manajemen aplikasi yang telah dikemas ke dalam kontainer. Kubernetes menawarkan fitur yang lebih kompleks dan fleksibel dibandingkan Docker Swarm, sehingga cocok untuk lingkungan produksi yang besar dan kompleks.
Docker Swarm: syntax & struktur
version: '3'
services:
# Traefik: Reverse proxy untuk routing dan load balancing
traefik:
image: traefik:v2.10
command:
- "--api.insecure=true" # Aktifkan API dan dashboard
- "--providers.docker=true"
- "--providers.docker.swarmMode=true"
- "--entrypoints.web.address=:80" # Entrypoint HTTP di port 80 (bernama web)
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # Akses Docker socket (read-only)
networks:
- traefik
deploy:
placement:
constraints:
- node.role == manager
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.service=api@internal" # Routing untuk API Traefik
- "traefik.http.routers.api.entrypoints=web" # Gunakan entrypoint web
# Whoami: Contoh service sederhana
whoami:
image: containous/whoami
deploy:
replicas: 2 # Duplikasi instance menjadi 2 (untuk distribusi traffic)
labels:
- "traefik.enable=true"
- "traefik.http.services.whoami.loadbalancer.server.port=80" # Port dari service whoami
- "traefik.http.routers.whoami.rule=PathPrefix(`/`)" # Route semua request ke service ini
- "traefik.http.routers.whoami.entrypoints=web" # Gunakan entrypoint web
networks:
- traefik
# Network untuk komunikasi antar service
networks:
traefik:
driver: overlay # Gunakan overlay untuk komunikasi antar node
attachable: true # Izinkan container standalone terhubungKomponen utama
- Docker Swarm untuk mengelola replika layanan dan jaringan antar container.
- Replicas: Menentukan jumlah instance (replika) yang dijalankan untuk setiap layanan.
- Placement Constraints: Membatasi di mana layanan dapat dijalankan (misalnya, hanya di node manager).
Untuk menjalankan definisi docker swarm di atas, lakukan langkah berikut
- Pastikan docker sudah terpasang dan jalankan
docker swarm init - Simpan berkas dan jalankan perintah
docker stack deploy -c berkas.yaml nama-app - Jalankan localhost dan localhost:8080 untuk memastikan aplikasi berjalan dengan semestinya
- Apabila aplikasi tidak berjalan dengan baik, cek
docker service lsuntuk memastikan bahwa semua aplikasi berjalan dan jika perlu jalankandocker logs <service-name>untuk memastikan bahwa tidak ada error yang terjadi
Kubernetes: syntax & struktur
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: traefik
rules:
- apiGroups: [""]
resources: ["services", "endpoints", "secrets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses", "ingressclasses"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: traefik
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik
subjects:
- kind: ServiceAccount
name: traefik
namespace: default
---
# Traefik sebagai ingress controller
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik
labels:
app: traefik
spec:
replicas: 1
selector:
matchLabels:
app: traefik
template:
metadata:
labels:
app: traefik
spec:
serviceAccountName: traefik
containers:
- name: traefik
image: traefik:v2.10
args:
- --api.insecure=true
- --providers.kubernetesingress
- --entrypoints.web.address=:80
ports:
- name: web
containerPort: 80
- name: admin
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
type: LoadBalancer
selector:
app: traefik
ports:
- port: 80
name: web
targetPort: web
- port: 8080
name: admin
targetPort: admin
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: traefik
spec:
controller: traefik.io/ingress-controller
---
# Aplikasi whoami untuk testing
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
type: ClusterIP
selector:
app: whoami
ports:
- port: 80
targetPort: 80
---
# Ingress untuk routing ke whoami
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
spec:
ingressClassName: traefik
rules:
- host: localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80Komponen utama
- Deployment:
- Deployment digunakan untuk mengelola replika pod.
- Replicas: Menentukan jumlah pod yang dijalankan.
- Template: Mendefinisikan spesifikasi pod, termasuk container dan perintah yang dijalankan.
- Service:
- Service digunakan untuk mengekspos pod di dalam cluster ke internet.
- Selector: Mengarahkan traffic ke pod dengan label tertentu.
- Ports: Menentukan port service dan port target di container.
- Ingress:
- Ingress digunakan untuk mengelola traffic HTTP/HTPS dari luar cluster.
- Rules: Mendefinisikan host dan path untuk routing traffic ke service tertentu.
- Traefik:
- Traefik bertindak sebagai Ingress Controller (Reverse Proxy) di Kubernetes. Anda dapat menggantikan Traefik dengan ingress controller lainnya (misal, Istio atau Nginx)
- Entrypoints: Traefik mendefinisikan entrypoint (misalnya, port 80) untuk menerima traffic.
Untuk menjalankan berkas kubernetes di atas, lakukan langkah berikut
- Pastikan
kubernetesterpasang - Simpan berkas dengan nama
berkas.yaml - Jalankan perintah
kubectl apply -f berkas.yml - Cek PORT yang bisa diakses dengan perintah
kubectl get svc traefik -o jsonpath='{.spec.ports[?(@.name=="web")].nodePort}' - Akses
whoamiservice dengan membukalocalhost:PORT
Selamat mencoba!