انتقل إلى المحتوى الرئيسي

المختبر 7.1 - StatefulSet لقاعدة البيانات

أهداف المختبر​

في نهاية هذا المختبر، ستكون قادرًا على:

  • نشر قاعدة بيانات (MySQL) باستخدام StatefulSet.
  • تكوين التخزين الدائم لقاعدة بيانات.
  • فهم أهمية ترتيب بدء التشغيل لقواعد البيانات.
  • تكوين خدمة headless للاكتشاف.
  • اختبار استمرارية بيانات قاعدة البيانات.

المدة المقدرة​

60-75 دقيقة

المتطلبات المسبقة​

  • تثبيت وتكوين kubectl.
  • عنقود Kubernetes محلية تعمل (minikube أو kind).
  • معرفة بـ StatefulSets (الفصل 7.1).

الجزء 1: إعداد StorageClass​

قم بإنشاء StorageClass لتخزين قاعدة البيانات:

# storageclass-mysql.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mysql-storage
provisioner: k8s.io/minikube-hostpath # Pour minikube
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete

تطبيق StorageClass:

kubectl apply -f storageclass-mysql.yaml

الجزء 2: إنشاء Secret لـ MySQL​

قم بإنشاء Secret لتخزين كلمة مرور root لـ MySQL:

# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: cGFzc3dvcmQxMjM= # "password123" en base64
mysql-password: cGFzc3dvcmQxMjM= # "password123" en base64

تطبيق Secret:

kubectl apply -f mysql-secret.yaml

الجزء 3: إنشاء خدمة Headless​

يتطلب StatefulSet خدمة headless لاكتشاف DNS:

# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None # Service headless
selector:
app: mysql

تطبيق الخدمة:

kubectl apply -f mysql-service.yaml

الجزء 4: إنشاء StatefulSet لـ MySQL​

قم بإنشاء StatefulSet لـ MySQL مع تخزين دائم:

# mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql # Nom du Service headless
replicas: 1 # Pour ce lab, une seule instance MySQL
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: init-mysql
image: busybox:1.35
command:
- sh
- -c
- |
# Créer le répertoire de données si nécessaire
if [ ! -d /var/lib/mysql/mysql ]; then
echo "Initialisation du répertoire de données MySQL"
fi
volumeMounts:
- name: data
mountPath: /var/lib/mysql
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: data
mountPath: /var/lib/mysql
resources:
requests:
cpu: 500m
memory: 512Mi
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: mysql-storage
resources:
requests:
storage: 1Gi

تطبيق StatefulSet:

kubectl apply -f mysql-statefulset.yaml

الجزء 5: التحقق من النشر​

الخطوة 5.1: التحقق من الـ Pod​

انتظر حتى يكون الـ Pod في حالة Running:

kubectl get pods -l app=mysql

تحقق من السجلات للتأكد من أن MySQL يبدأ بشكل صحيح:

kubectl logs mysql-0

الخطوة 5.2: التحقق من الـ PVC​

تحقق من أن الـ PVC قد تم إنشاؤه:

kubectl get pvc

يجب أن ترى PVC باسم data-mysql-0.


الجزء 6: اختبار قاعدة البيانات​

الخطوة 6.1: إنشاء قاعدة بيانات وجداول​

اتصل بـ MySQL وأنشئ قاعدة بيانات اختبار:

kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "CREATE DATABASE testdb;"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');"

الخطوة 6.2: التحقق من البيانات​

تحقق من أن البيانات قد تم إدخالها:

kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"

الجزء 7: اختبار الاستمرارية​

الخطوة 7.1: حذف الـ Pod​

احذف الـ Pod لاختبار الاستمرارية:

kubectl delete pod mysql-0

سيقوم StatefulSet بإعادة إنشاء الـ Pod تلقائيًا بنفس الاسم.

انتظر حتى يكون الـ Pod الجديد في حالة Running:

kubectl get pods -l app=mysql

انتظر بضع ثوانٍ حتى يعيد MySQL التشغيل بالكامل:

kubectl logs mysql-0 -f

اضغط على Ctrl+C بمجرد أن يكون MySQL جاهزًا.

الخطوة 7.2: التحقق من استمرارية البيانات​

تحقق من أن البيانات لا تزال موجودة:

kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"

يجب أن ترى المستخدمين الثلاثة (Alice، Bob، Charlie)، مما يثبت أن البيانات قد استمرت!


الجزء 8: التنظيف​

احذف الموارد التي تم إنشاؤها:

kubectl delete statefulset mysql
kubectl delete service mysql
kubectl delete secret mysql-secret
kubectl delete pvc data-mysql-0
kubectl delete -f storageclass-mysql.yaml

ملخص المختبر​

في هذا المختبر، قمت بنشر قاعدة بيانات MySQL باستخدام StatefulSet. لقد تعلمت كيفية تكوين التخزين الدائم لقاعدة بيانات، واستخدام Secrets لكلمات المرور، واختبار استمرارية البيانات أثناء إعادة التشغيل. تعتبر StatefulSets مثالية للتطبيقات ذات الحالة مثل قواعد البيانات.


الخطوات التالية​

سيعرض لك المختبر التالي كيفية استخدام DaemonSets لنشر الوكلاء على جميع العقد.

المختبر 7.2: DaemonSet للمراقبة


تم إنشاء المختبر في: ديسمبر 2024