المختبر 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