הטמעת EaaS: סביבות תצוגה מקדימה מבודדות ב-Kubernetes

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

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

שאלות נפוצות

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

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

Environment as a service: מדוע סביבות משותפות מעכבות שחרורים

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

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

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

Environment as a service מסיר את התלות הזו. כל ענף מקבל סביבת preview מבודדת, שעולה אוטומטית מאותו תיאור תשתית כמו שאר הסביבות: מסד נתונים משלו, מטמון, סודות וכתובת, ואורך החיים קשור למחזור החיים של המשימה.

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

מה נותן בידוד סביבות לכל ענף ומשימה

סביבה לכל ענף ומשימה היא לא סביבת בדיקות שמקימים ידנית, אלא תהליך אוטומטי. אירוע במאגר מפעיל בנייה ופריסה של מניפסטים במרחב שמות נפרד: סודות משלו, נתיב וסכימת נתונים.

תיאור הסביבה נשמר במאגר, ו-Argo CD מביא את האשכול למצב הזה ומסיר סטיות — זו סביבה כשירות, ולא עבודה ידנית חד-פעמית.

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

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

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

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

העומס על התחזוקה תלוי לא במספר הסביבות אלא במדיניות: זמן חיים עם מחיקה אוטומטית, מכסות משאבים, תבנית אחידה. איתם עשר סביבות בו-זמנית דורשות פחות תשומת לב של מהנדסים מאשר סביבה משותפת אחת שמתקנים כל הזמן.

Environment as a service: השוואת גישות לסביבות

הטמעת environment as a service מתחילה לא בכלי אלא בבחירת מודל הסביבות. הוא נקבע לפי מספר המשימות בו-זמנית ולפי מחיר הטעות בבידוד — מסביבה משותפת ועד סביבה זמנית למשימה אחת.

איך בוחרים מודל

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

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

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

איך אנחנו מטמיעים שירות סביבות: שלבי העבודה

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

  1. ביקורת סביבות. ספירת מלאי של סביבות פעילות, אופני ההקמה, אורך החיים ופעולות ידניות שגוזלות את מרב הזמן.
  2. תרשים בידוד. מרחבי שמות לכל ענף, מכסות משאבים, מדיניות רשת — סביבות שכנות אינן משפיעות זו על זו.
  3. הגדרת האשכול. צמתים, גישה למאגר אימג'ים, כניסה משותפת עם דומיין תבנית ותעודות, כדי שכתובות יוקצו בלי עבודה ידנית.
  4. אוטומציה של הקצאת סביבות. היצירה מופעלת בתיאור הענף, והסביבה נבנית מאימג'ים מוכנים בדקות ספורות.
  5. חיבור לבנייה. התוצאה והקישור לסביבה חוזרים למשימת המפתח, והבדיקות רצות באותה סביבה.
  6. קבלת הפתרון. הרצה בעומס, מדידת זמן עלייה ומחיקה, בדיקת כשל וניקוי לפי אורך חיים.
  7. נוהל תחזוקה. הוראות, כללי שמות, מדיניות ניקוי, נקודות ניטור ואחראי תפעול.

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

ערכת קונפיגורציות, מדיניות גישה ותיעוד

הערכה שנשארת אצל הצוות אחרי הטמעת Environment as a Service היא לא מצגת ולא אוסף צילומי מסך, אלא ארטיפקטים עובדים. לפיהם אפשר להקים, לשנות ולמחוק סביבה בלעדינו: קונפיגורציות נמצאות במערכת בקרת גרסאות, ותרשימים ונוהלים — בתיעוד לצד הקוד.

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

מקרה בוחן: בידוד סביבות לצוות מוצר

צוות מוצר של ארבע קבוצות חלק סביבת בדיקות אחת: ענפים התמזגו לסביבה משותפת, מיגרציות סכימה רצו מעל נתונים של אחרים, ובדיקת שינויים המתינה עד שהסביבה תתפנה. בודק תפס את הסביבה ליום-יומיים, ומהנדס באותו זמן או חיכה או בדק את הענף שלו מעל שחרור של אחרים.

קונפליקטים בין הקבוצות התרחשו 4-6 פעמים בשבוע — לרוב בגלל שמישהו הפעיל מחדש שירות משותף או ביטל מיגרציה של אחר.

מה שינינו

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

מה השתנה

זמן קבלת הסביבה הצטמצם מיום-שלושה של המתנה ל-15-20 דקות, וזאת כש-8 מתוך 10 סביבות עולות בלי פנייה לצוות התשתית. שיעור השחרורים ללא צורך בחזרה לאחור עלה מ-68% ל-93%: רוב הפגמים נתפסים כעת בעותק מבודד ולא בסביבה המשותפת.

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

במה שירות סביבות שונה מסביבה משותפת?

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

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

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

בשירות סביבות מחזור החיים נקבע לפי מדיניות: יצירה מתבנית לפי בקשת מיזוג, חימום תלויות, סכימת נתונים נפרדת, מחיקה עם סיום המשימה או בתום התקופה. אף אחד לא מנקה משאבים ידנית ולא מתאם תפוסה — מצב כל סביבה נגזר מהענף ולא מהתכתבות. בדיוק לכך מתכוונים ב"סביבות כשירות": הסביבה הופכת למשאב מתכלה ולא לרכוש משותף.

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

שאלות שעולות לפני תחילת ההטמעה

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

איך מבודדים נתוני פרודקשן?

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

כמה משאבי אשכול זה יתפוס?

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

איך זה ישתלב בתשתית שלנו?

הסביבות נבנות מאותם אימג'ים במאגר ואותם תיאורים כמו סביבת הייצור, ולכן לא מצטברים ביניהן פערים. החיבור למערכת הבנייה, לניתוב התעבורה, למאגר הסודות ולניטור מוגדר פעם אחת בשלב ההטמעה.

מי ומתי מוחק סביבות?

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

מי אחראי על התחזוקה אחרי ההרצה?

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

נדון במשימה שלכם: ממה נתחיל

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

בתגובה אנחנו שולחים:

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

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