تخطَّ إلى المحتوى

Deployments

ستتعلم كيف يستخدم Deployment كل من ReplicaSet و Pods لتشغيل تطبيق قابل للتحديث، وكيف تنفذ rollout و rollback وتقرأ الحالة.

Deployment هو الطريقة الافتراضية لتشغيل تطبيق stateless في Kubernetes. أنت تقول له: “أريد 3 نسخ من هذا التطبيق بهذه الصورة”، وهو يحافظ على العدد المطلوب ويغير النسخ تدريجيا عند التحديث.

flowchart LR
D[Deployment web] --> RS1[ReplicaSet v1]
D --> RS2[ReplicaSet v2]
RS2 --> P1[Pod web-a]
RS2 --> P2[Pod web-b]
RS2 --> P3[Pod web-c]
  • Deployment يدير استراتيجية التحديث.
  • ReplicaSet يحافظ على عدد Pods.
  • Pod يشغل containers.

احفظ الملف باسم deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
labels:
app: web
spec:
replicas: 3
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 15
periodSeconds: 10
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"

نقطتان مهمتان:

الجزءلماذا مهم؟
selector.matchLabelsيحدد أي Pods يملكها Deployment
template.metadata.labelsيجب أن تطابق selector، وإلا يفشل إنشاء Deployment
Terminal window
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get replicasets
kubectl get pods -l app=web
kubectl rollout status deployment/web

Expected output:

deployment.apps/web created
deployment "web" successfully rolled out
NAME READY UP-TO-DATE AVAILABLE AGE
web 3/3 3 3 45s
Terminal window
kubectl set image deployment/web nginx=nginx:1.28
kubectl rollout status deployment/web
kubectl rollout history deployment/web

Expected output:

deployment.apps/web image updated
deployment "web" successfully rolled out
REVISION CHANGE-CAUSE
1 <none>
2 <none>

لو الإصدار الجديد فيه مشكلة:

Terminal window
kubectl rollout undo deployment/web
kubectl rollout status deployment/web
kubectl get pods -l app=web
أحتاج إلىاستخدم
تطبيق web أو API بدون state محليDeployment
قاعدة بيانات تحتاج اسم ثابت وتخزين ثابتStatefulSet
Agent يعمل على كل NodeDaemonSet
مهمة تنتهي مرة واحدةJob
مهمة متكررة بوقت محددCronJob
الخطأالتشخيصالحل
selector does not match template labelskubectl apply -f deployment.yaml يفشلاجعل labels في template تطابق selector
rollout لا ينتهيkubectl rollout status deployment/web يعلقافحص kubectl describe pod و probes
Pods كثيرة تقعkubectl get pods يظهر CrashLoopBackOffاقرأ logs وعدل image أو config
التحديث أحدث downtimemaxUnavailable كبير أو readiness ناقصأضف readinessProbe وخفض maxUnavailable

Lab: Deployment قابل للتحديث والاسترجاع

المستوى: مبتدئ الوقت: 40 دقيقة الأدوات: kubectl

الهدف: تشغيل Nginx بثلاث نسخ، تنفيذ update، ثم rollback.

  • Cluster محلي يعمل.
  • kubectl get nodes يرجع Node جاهز.
  1. احفظ YAML في deployment.yaml.
  2. طبق الملف:
Terminal window
kubectl apply -f deployment.yaml
kubectl rollout status deployment/web
  1. تأكد من عدد النسخ:
Terminal window
kubectl get pods -l app=web
  1. حدث image:
Terminal window
kubectl set image deployment/web nginx=nginx:1.28
kubectl rollout status deployment/web
  1. ارجع للإصدار السابق:
Terminal window
kubectl rollout undo deployment/web
kubectl rollout status deployment/web
NAME READY STATUS RESTARTS AGE
web-xxxxxxxxxx-aaaaa 1/1 Running 0 1m
web-xxxxxxxxxx-bbbbb 1/1 Running 0 1m
web-xxxxxxxxxx-ccccc 1/1 Running 0 1m
Terminal window
kubectl delete -f deployment.yaml
kubectl get deployments,pods -l app=web

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

كل مشروع في المسار سيستخدم Deployment للتطبيقات stateless. في مشروع GitOps ستتعلم لماذا يجب أن يكون Deployment مكتوبا في Git، وليس منشأ بأوامر مؤقتة فقط.