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

Rollouts و Probes و Resources

ستتعلم كيف تنفذ تحديث آمن، كيف تمنع traffic عن Pod غير جاهز، وكيف تضبط requests و limits حتى يستطيع scheduler اتخاذ قرار صحيح.

Kubernetes لا يعرف إن كان تطبيقك جاهزا من الداخل إلا لو أعطيته probes. ولا يعرف أين يضع Pod إلا لو أعطيته requests. لذلك أي Deployment جاد يحتاج rollout strategy و probes و resources.

احفظ الملف باسم web-rollout.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web-rollout
labels:
app: web-rollout
spec:
replicas: 3
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
app: web-rollout
template:
metadata:
labels:
app: web-rollout
spec:
terminationGracePeriodSeconds: 30
containers:
- name: nginx
image: nginx:1.27
ports:
- name: http
containerPort: 80
startupProbe:
httpGet:
path: /
port: http
failureThreshold: 12
periodSeconds: 5
readinessProbe:
httpGet:
path: /
port: http
periodSeconds: 5
failureThreshold: 2
livenessProbe:
httpGet:
path: /
port: http
periodSeconds: 10
failureThreshold: 3
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
الجزءالسؤالقرار عملي
Rolloutكيف أحدث بدون downtime؟maxUnavailable: 0 للتطبيقات الحساسة
readinessProbeهل Pod جاهز لاستقبال traffic؟ضع endpoint يعتمد على جاهزية التطبيق
livenessProbeهل التطبيق عالق ويحتاج restart؟لا تجعلها حساسة جدا حتى لا تسبب restarts زائدة
resources.requestsما الحد الأدنى الواقعي؟استخدم قياسات metrics وليس تخمين فقط
resources.limitsما الحد الأعلى المقبول؟انتبه: memory limit قد يسبب OOMKilled
Terminal window
kubectl apply -f web-rollout.yaml
kubectl rollout status deployment/web-rollout
kubectl set image deployment/web-rollout nginx=nginx:1.28
kubectl rollout status deployment/web-rollout
kubectl rollout history deployment/web-rollout

Expected output:

deployment.apps/web-rollout created
deployment "web-rollout" successfully rolled out
deployment.apps/web-rollout image updated
deployment "web-rollout" successfully rolled out
flowchart TD
A[Rollout عالق] --> B[kubectl get pods]
B --> C{Pod status?}
C -->|ImagePullBackOff| D[راجع image و registry]
C -->|CrashLoopBackOff| E[راجع logs --previous]
C -->|Running not Ready| F[راجع readinessProbe]
C -->|Pending| G[راجع resources والـ events]

أوامر مهمة:

Terminal window
kubectl rollout status deployment/web-rollout --timeout=90s
kubectl describe deployment web-rollout
kubectl get pods -l app=web-rollout
kubectl describe pod -l app=web-rollout
kubectl logs -l app=web-rollout --tail=50
الحالةمتى تحدث؟النتيجة
Guaranteedrequest يساوي limit لكل CPU و memoryأعلى حماية عند ضغط الموارد
Burstableتوجد requests أو limits لكنها غير متساويةمناسب لمعظم تطبيقات web
BestEffortلا توجد requests ولا limitsأول المرشحين للطرد عند الضغط

ستجد شرحا أعمق في درس QoS و Eviction.

Lab: Rollout آمن مع probes و resources

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

الهدف: تشغيل Deployment كامل، تحديث image، ثم تشخيص حالة rollout.

  • Cluster محلي يعمل.
  • اتصال بالإنترنت لسحب images.
  1. احفظ YAML في web-rollout.yaml.
  2. طبق الملف:
Terminal window
kubectl apply -f web-rollout.yaml
kubectl rollout status deployment/web-rollout
  1. راقب Pods أثناء التحديث:
Terminal window
kubectl get pods -l app=web-rollout -w
  1. من terminal آخر نفذ:
Terminal window
kubectl set image deployment/web-rollout nginx=nginx:1.28
kubectl rollout status deployment/web-rollout
  1. جرب rollback:
Terminal window
kubectl rollout undo deployment/web-rollout
kubectl rollout status deployment/web-rollout
deployment "web-rollout" successfully rolled out
NAME READY STATUS RESTARTS
web-rollout-xxxxxxxxxx-aaaaa 1/1 Running 0
web-rollout-xxxxxxxxxx-bbbbb 1/1 Running 0
web-rollout-xxxxxxxxxx-ccccc 1/1 Running 0
Terminal window
kubectl delete -f web-rollout.yaml

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

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

أي مشروع production-style في نهاية الكورس يجب أن يحتوي readinessProbe و resources على الأقل. بدونها لن تستطيع ضمان rollout آمن أو capacity planning واضح.