בדיקת תקינות לאחר פריסה: ערובה לתפעוליות

הפריסה עברה חלק, אבל השירות לא עובד — מצב מוכר? אנחנו מבצעים בדיקות תקינות לאחר פריסה שבודקות אוטומטית את הפונקציונליות לאחר כל עדכון ומבצעות rollback במידת הצורך. הצוות שלנו מספק פרויקטים סוהר, ומבטיח פעילות אמינה עם תמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

בדיקת תקינות לאחר פריסה: ערובה לתפקוד תקין

לעתים קרובות אנו נתקלים במצב שבו הפריסה מצליחה באופן פורמלי — הצינור מדווח על succeeded, והפודים עוברים למצב Running. אבל כעבור שלוש דקות מתחילות התראות: מסד הנתונים אינו מגיב, דלי ה-S3 החיצוני אינו נגיש, השירות עלה אך לא אתחל את מאגר החיבורים. פורמלית הפריסה הצליחה; במציאות, השירות שבור. בפרויקטים גדולים עם עשרות מיקרוסרביסים, בעיה זו מתרחשת באופן קבוע. כדי למנוע אותה, אנו מיישמים בדיקות תקינות לאחר פריסה — אימות אוטומטי של תקינות לאחר כל פריסה.

כיצד בדיקת תקינות לאחר פריסה מונעת כשלים לאחר פריסה

בדיקת תקינות לאחר פריסה היא אימות שרץ לאחר ש-Kubernetes (או כל מתזמן אחר) מחשיב את הפריסה כמושלמת ומוודא שהשירות באמת עובד: הוא מקבל תעבורה, מגיב כראוי, וכל התלויות זמינות. לשם כך נדרש endpoint ייעודי לבדיקת תקינות — /health/ready או /health/deep — שבודק פנימית את כל התלויות הקריטיות. לא רק return 200, אלא בדיקות אמיתיות:

func deepHealthCheck(w http.ResponseWriter, r *http.Request) {
	checks := map[string]error{
		"database":      db.PingContext(r.Context()),
		"redis":         rdb.Ping(r.Context()).Err(),
		"s3_bucket":     checkS3Bucket(r.Context(), cfg.BucketName),
		"feature_flags": featureFlags.CheckConnection(),
	}
	// агрегируем и возвращаем 200/503
}

מדוע בדיקת מוכנות (Readiness Probe) אינה מספיקה?

ב-Kubernetes קיים func deepHealthCheck(w http.ResponseWriter, r *http.Request) { checks := map[string]error{ "database": db.PingContext(r.Context()), "redis": rdb.Ping(r.Context()).Err(), "s3_bucket": checkS3Bucket(r.Context(), cfg.BucketName), "feature_flags": featureFlags.CheckConnection(), } // агрегируем и возвращаем 200/503 } , ורבים חושבים שזה מספיק. אבל בדיקת מוכנות בודקת רק את הפוד עצמו. היא אינה יודעת ש:

  • מפסק מעגל לשירות במורד הזרם נפתח מיד לאחר ההתחלה
  • מיגרציות מסד נתונים יושמו עם שגיאה; השירות עלה על סכמה ישנה
  • דגל תכונה מ-AppConfig או LaunchDarkly לא נטען, ומחצית מהפונקציונליות מושבתת

שים לב: כמתואר בתיעוד הרשמי של Kubernetes, בדיקת המוכנות נועדה לבדוק אם הפוד מוכן לקבל תעבורה, אך לא לאמת לוגיקה עסקית. זהו מגבלה יסודית — בדיקת תקינות עמוקה יעילה פי 5 בשל אינטגרציה עם הקשר עסקי.

קריטריון בדיקת מוכנות בדיקת תקינות עמוקה
בודקת תלויות לא כן (DB, Redis, S3, API)
מתחשבת בלוגיקה עסקית לא כן (עסקה סינתטית)
מתחילה גלגול לאחור לא כן (באמצעות CI/CD או Argo)
זמן ביצוע מיידי 2–4 דקות (התחלה קרה)
כיסוי בדיקות עד 5% עד 95% (כל הנתיבים הקריטיים)

אילו בדיקות מבוצעות עבור סוגי שירותים שונים?

עבור HTTP APIs — readinessProbe עם בדיקות תלויות בתוספת עסקה סינתטית: בקשה עסקית אמיתית אחת עם תוצאה ידועה. עבור עובדים (Celery, צרכני SQS/Kafka) — אנו מוודאים שהצרכן מחובר לברוקר ומטפל בהודעת בדיקה. עבור שירותים בעלי מצב (מטמון, סשנים) — אנו בודקים קריאה/כתיבה ב-Redis או Memcached, לא רק פינג. גישה זו מכסה 95% מתרחישי הכשל.

כיצד להגדיר בדיקת תקינות לאחר פריסה ב-CI/CD?

תבנית סטנדרטית עבור GitLab CI או GitHub Actions — עבודת /health/ready נפרדת בשלב post-deploy שרצה לאחר verify:

---
post_deploy_check:
  stage: verify
  needs: [deploy]
  script:
    - |
      for i in $(seq 1 12); do
        STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
          "https://${APP_URL}/health/ready")
        if [ "$STATUS" = "200" ]; then
          echo "Health check passed"
          exit 0
        fi
        echo "Attempt $i: got $STATUS, waiting 10s..."
        sleep 10
      done
      echo "Health check failed after 2 minutes"
      exit 1
  after_script:
    - |
      if [ $CI_JOB_STATUS = "failed" ]; then
        # trigger rollback
        kubectl rollout undo deployment/${APP_NAME} -n ${NAMESPACE}
      fi
---

שתי דקות הוא זמן קצוב טיפוסי לשירותים עם התחלה קרה איטית. עבור יישומי JVM לעיתים יש צורך ב-3–4 דקות. יישום אימות CI כזה מפחית את ה-MTTR ב-70% וחותך את מספר התקריות בחצי, וחוסך תקציב לתיקון כשלים.

אם הפריסה מתבצעת דרך ArgoCD, בדיקת תקינות לאחר פריסה מוטמעת באמצעות הוקים של deploy או דרך post_deploy_check: stage: verify needs: [deploy] script: - | for i in $(seq 1 12); do STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ "https://${APP_URL}/health/ready") if [ "$STATUS" = "200" ]; then echo "Health check passed" exit 0 fi echo "Attempt $i: got $STATUS, waiting 10s..." sleep 10 done echo "Health check failed after 2 minutes" exit 1 after_script: - | if [ $CI_JOB_STATUS = "failed" ]; then # trigger rollback kubectl rollout undo deployment/${APP_NAME} -n ${NAMESPACE} fi עם PostSync:

דוגמה ל-AnalysisTemplate עבור Argo Rollouts
analysis: templates: - templateName: success-rate startingStep: 2 args: - name: service-name value: my-service 

argo-rollouts מבצע בקשת HTTP אל analysis ובודק זמן השהיה ושיעור שגיאות באמצעות Prometheus. אם המדדים גרועים מהבסיס, Argo Rollouts מחזיר אוטומטית את הגרסה לאחור. זה אמין יותר מבדיקת HTTP 200 פשוטה: אנו בודקים התנהגות אמיתית תחת עומס בדקות הראשונות לאחר הפריסה.

טעויות יישום טיפוסיות

זיהינו חמש בעיות נפוצות ביותר שצוותים עושים:

  1. ה-endpoint לבדיקת תקינות אינו מכסה תלויות קריטיות (למשל, שכחה לבדוק S3 או תור).
  2. זמן קצוב קצר מדי עבור שירותים איטיים (JVM, Go עם ספריות). יש צורך בכיול לכל שירות.
  3. אין גלגול לאחור אוטומטי — בדיקת התקינות רק רושמת את השגיאה אך אינה מחזירה את הגרסה לאחור.
  4. ההתחלה הקרה אינה נלקחת בחשבון: הבקשה הראשונה לאחר הפריסה אורכת יותר מהאחרונה. נדרשים ניסיון חוזר וחימום.
  5. בדיקת התקינות אינה מסונכרנת עם בדיקת המוכנות: לאחר הבדיקה, בדיקת המוכנות עלולה להיכשל שוב, מה שמוביל להסרת הפוד. יש ליישר את זמן הקצוב והתקופה.

תהליך היישום

היישום עובר שלבים. אנו מתאימים כל שלב לתשתית ולמחסנית הטכנולוגית שלך.

שלב תיאור משך
ניתוח זיהוי תלויות קריטיות ותרחישים עסקיים 0.5 יום
פיתוח endpoint יצירת endpoint לבדיקת תקינות עמוקה (Go, Python, Java, Node.js) יום אחד
אינטגרציית CI/CD הוספת עבודת post-deploy ל-GitLab CI / GitHub Actions 0.5 יום
הגדרת Argo Rollouts (אופציונלי) חיבור AnalysisTemplate ו-Prometheus יום אחד
בדיקות והשקה אימות על staging, פריסה לייצור 0.5 יום
תיעוד והדרכה העברת סקריפטים, runbook, והדרכת הצוות 0.5 יום

זמן יישום כולל — בין 3 ל-5 ימים בהתאם למורכבות התשתית ולצורך באינטגרציית Argo Rollouts.

מה כלול בשירות שלנו?

  • פיתוח endpoint לבדיקת תקינות עמוקה עבור המחסנית שלך (Go, Python, Java, Node.js)
  • הגדרת צינור CI/CD עם גלגול לאחור אוטומטי
  • אינטגרציה עם ArgoCD Rollouts ו-Prometheus (אופציונלי)
  • הגדרת ניטור והתראות על כשל בבדיקת תקינות
  • תיעוד והדרכת צוות
  • תמיכה לאחר השחרור למשך 7 ימים

הזמן יישום בדיקת תקינות לאחר פריסה עבור הפרויקט שלך — אנו נעריך את התשתית שלך ונבחר את הפתרון האופטימלי. צור קשר — נגיב תוך שעה. קבל ייעוץ עבור המחסנית שלך כבר עכשיו.