Docker Swarm vs Kubernetes

Docker Swarm vs Kubernetes
Photo by Ian Taylor / Unsplash
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 terhubung

Komponen 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

  1. Pastikan docker sudah terpasang dan jalankan docker swarm init
  2. Simpan berkas dan jalankan perintah docker stack deploy -c berkas.yaml nama-app
  3. Jalankan localhost dan localhost:8080 untuk memastikan aplikasi berjalan dengan semestinya
  4. Apabila aplikasi tidak berjalan dengan baik, cek docker service ls untuk memastikan bahwa semua aplikasi berjalan dan jika perlu jalankan docker 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: 80

Komponen utama

  1. Deployment:
    • Deployment digunakan untuk mengelola replika pod.
    • Replicas: Menentukan jumlah pod yang dijalankan.
    • Template: Mendefinisikan spesifikasi pod, termasuk container dan perintah yang dijalankan.
  2. 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.
  3. Ingress:
    • Ingress digunakan untuk mengelola traffic HTTP/HTPS dari luar cluster.
    • Rules: Mendefinisikan host dan path untuk routing traffic ke service tertentu.
  4. 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

  1. Pastikan kubernetes terpasang
  2. Simpan berkas dengan nama berkas.yaml
  3. Jalankan perintah kubectl apply -f berkas.yml
  4. Cek PORT yang bisa diakses dengan perintah kubectl get svc traefik -o jsonpath='{.spec.ports[?(@.name=="web")].nodePort}'
  5. Akses whoami service dengan membuka localhost:PORT

Selamat mencoba!