17/08/2021 - KUBERNETES, MYSQL
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.
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
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 None3306/TCP 11s
NAME READY AGE
statefulset.apps/mysql 1/1 11s
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.