StatefulSet untuk Aplikasi Stateful di Kubernetes

1. Apa Itu StatefulSet?

StatefulSet adalah sumber daya Kubernetes yang digunakan untuk mengelola aplikasi stateful, yaitu aplikasi yang membutuhkan identitas tetap atau data persisten antara replikasi. Contohnya adalah database, sistem file terdistribusi, atau aplikasi caching seperti Redis.

Karakteristik Utama StatefulSet:

  • Identitas Tetap: Setiap Pod dalam StatefulSet memiliki identitas unik (misalnya, myapp-0, myapp-1).
  • Urutan Deploy dan Scale: StatefulSet memastikan Pod dideploy, dihapus, atau diskalakan berdasarkan urutan tertentu.
  • Penyimpanan Persisten: Setiap Pod dapat memiliki PersistentVolumeClaim (PVC) yang unik untuk menyimpan data.

2. Perbedaan StatefulSet vs Deployment

StatefulSetDeployment
Cocok untuk aplikasi stateful seperti database.Cocok untuk aplikasi stateless seperti web server.
Mempertahankan identitas unik per Pod.Pod tidak memiliki identitas unik.
PVC unik untuk setiap Pod.PVC dibagikan atau bersifat ephemeral.
Deploy Pod dalam urutan tertentu.Pod dideploy tanpa urutan khusus.

3. StatefulSet dalam Aplikasi Stateful

StatefulSet digunakan untuk aplikasi yang:

  • Membutuhkan identitas jaringan tetap (misalnya, hostname unik per Pod).
  • Membutuhkan data yang tetap meskipun Pod dihapus atau dibuat ulang.
  • Contoh aplikasi: MySQL, PostgreSQL, Redis, Cassandra.

4. Contoh StatefulSet untuk MariaDB

File StatefulSet YAML untuk MariaDB

apiVersion: v1
kind: Service
metadata:
  name: mariadb-service
  labels:
    app: mariadb
spec:
  ports:
    - port: 3306
      targetPort: 3306
  clusterIP: None  # Headless Service
  selector:
    app: mariadb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mariadb
spec:
  serviceName: mariadb-service
  replicas: 3  # Jumlah replika
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: mariadb:10.5  # Versi MariaDB
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "your_root_password"  # Ganti dengan password root MariaDB
        volumeMounts:
        - name: mariadb-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mariadb-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 5Gi  # Kapasitas storage per Pod

Penjelasan Konfigurasi:

  1. Service:
    • clusterIP: None: Membuat Headless Service yang memberikan DNS unik untuk setiap Pod, seperti mariadb-0.mariadb-service.
  2. StatefulSet:
    • replicas: 3: Menjalankan tiga instance MariaDB.
    • volumeClaimTemplates: Membuat PVC unik untuk setiap Pod (misalnya, mariadb-data-mariadb-0, mariadb-data-mariadb-1).
  3. Environment Variables:
    • MYSQL_ROOT_PASSWORD: Password root MariaDB.

5. Praktik Baik Menggunakan StatefulSet

  1. Gunakan Headless Service:
    • Contoh konfigurasi untuk DNS unik per Pod:
apiVersion: v1
kind: Service
metadata:
  name: mariadb-service
spec:
  clusterIP: None
  selector:
    app: mariadb
  1. Pilih Storage yang Tepat:
    • Gunakan storage class dengan performa tinggi (contoh: SSD).
  2. Backup dan Restore:
    • Implementasikan snapshot PVC jika menggunakan penyedia Cloud.
  3. Skalabilitas:
    • Tambahkan replika sesuai kebutuhan:
      kubectl scale statefulset mariadb --replicas=5

6. Akses MariaDB di StatefulSet

  • Gunakan DNS unik untuk mengakses Pod tertentu, misalnya:
    • Pod 0: mariadb-0.mariadb-service
    • Pod 1: mariadb-1.mariadb-service
    • Pod 2: mariadb-2.mariadb-service
  • Uji koneksi menggunakan kubectl exec:
    kubectl exec -it mariadb-0 -- mysql -u root -p

7. Kesimpulan

StatefulSet adalah solusi ideal untuk mengelola aplikasi stateful seperti MariaDB di Kubernetes. Dengan menggunakan PVC unik, urutan deploy yang teratur, dan kemampuan failover, StatefulSet memastikan aplikasi berjalan dengan stabil dan data tetap aman.