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
StatefulSet | Deployment |
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:
- Service:
- clusterIP: None: Membuat Headless Service yang memberikan DNS unik untuk setiap Pod, seperti
mariadb-0.mariadb-service
.
- clusterIP: None: Membuat Headless Service yang memberikan DNS unik untuk setiap Pod, seperti
- StatefulSet:
- replicas: 3: Menjalankan tiga instance MariaDB.
- volumeClaimTemplates: Membuat PVC unik untuk setiap Pod (misalnya,
mariadb-data-mariadb-0
,mariadb-data-mariadb-1
).
- Environment Variables:
- MYSQL_ROOT_PASSWORD: Password root MariaDB.
5. Praktik Baik Menggunakan StatefulSet
- Gunakan Headless Service:
- Contoh konfigurasi untuk DNS unik per Pod:
apiVersion: v1
kind: Service
metadata:
name: mariadb-service
spec:
clusterIP: None
selector:
app: mariadb
- Pilih Storage yang Tepat:
- Gunakan storage class dengan performa tinggi (contoh: SSD).
- Backup dan Restore:
- Implementasikan snapshot PVC jika menggunakan penyedia Cloud.
- Skalabilitas:
- Tambahkan replika sesuai kebutuhan:
kubectl scale statefulset mariadb --replicas=5
- Tambahkan replika sesuai kebutuhan:
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
- Pod 0:
- 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.