Kubernetes pod'larında veri kalıcılığı için bir StatefulSet kullanabilirsiniz. Deployment'tan farklı olarak, StatefulSet durum bilgisi olan uygulamalar için kendi Pod'larının her birinin kimliğini korur. Bununla birlikte bir StatefulSet, Pod'ların kimliğinden sorumlu bir Headless Service gerektirir.


Temelindeki PersistentVolume yalnızca bir Pod'a monte edilebildiğinden, tek örnekli uygulamalar için kullanılma eğilimindedir. Geliştirme, test veya qa gibi ortamlarda veri kaybını dert etmiyorsanız kullanabilirsiniz. Mantıklı olduğu yerlerde production ortamında kullanmaktan kaçının. Production ortamı için bulut tabanlı depolamayı tercih edin.


Yapılandırma


apiVersion: v1
kind: Namespace
metadata:
name: storage

---

apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: storage
labels:
app: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- name: tcp
protocol: TCP
port: 3306

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: storage
spec:
replicas: 1
serviceName: mysql
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: mysql:5.6
ports:
- name: tpc
protocol: TCP
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: password
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

Kurulum


Yukarıdaki yapılandırmayı kurmak için $ kubectl apply -f mysql.yaml komutunu çalıştırın ve sonuç aşağıdaki gibi olacaktır.


$ kubectl -n storage get all
NAME READY STATUS RESTARTS AGE
pod/mysql-0 1/1 Running 0 11s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP None 3306/TCP 11s

NAME READY AGE
statefulset.apps/mysql 1/1 11s

Test


MySQL hizmetini yerel ortama göstermek için $ kubectl -n storage port-forward service/mysql 3306:3306 komutunu çalıştırın. Ben MySQL'de bir veritabanı oluşturdum ve ona üç kayıt ekledim. Mevcut durum aşağıdaki gibi görünüyor.


$ kubectl -n storage exec -it pod/mysql-0 -c mysql bash

root@mysql-0:/# mysql -uroot -ppassword

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| inanzzz |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

mysql> USE inanzzz;
Database changed

mysql> SHOW TABLES;
+-------------------+
| Tables_in_inanzzz |
+-------------------+
| users |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)

Bölmeyi (pod), hizmeti (service) ve durum bilgisi kümesini (statefulset) silerseniz verileriniz korunmaya devam eder. Ancak, ad alanını (namespace) silerseniz, yok olacaktır.