ניהול מרכזי של תצורות מיקרו-שירותים

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

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

שאלות נפוצות

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

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

ניהול תצורה מרוכז: היכן נשברת סביבת המיקרו-שירותים

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

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

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

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

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

מה נותן מעגל הגדרות אחיד

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

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

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

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

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

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

גישות לאחסון והפצה של קונפיגורציות

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

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

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

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

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

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

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

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

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

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

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

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

מדיניות גישה והפרדת הרשאות

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

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

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

מקרה בוחן: כיצד הסרנו את דריפט ההגדרות בין הסביבות

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

מה היה לפני

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

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

מה שינינו

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

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

מה נהיה

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

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

במה שונה ניהול מרכזי מסנכרון ידני

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

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

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

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

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

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

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

ספקות טכניים נפוצים

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

האם יהיה צורך לכתוב מחדש את השירותים עבור שכבת התצורה החדשה?

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

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

מה יקרה אם שכבת התצורה לא תהיה זמינה?

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

כיצד מבצעים rollback לשינוי תצורה שלא צלח?

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

האם זה תואם לתשתית ולסודות הנוכחיים?

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

עד כמה ההגירה מסוכנת והאם ניתן לחזור אחורה?

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

תארו את המשימה שלכם — נחזור עם הערכה ותוכנית הטמעה המתאימה למתאר שלכם.

נדון במשימה שלכם ונחזור עם הערכה

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

מה שעוזר בהתחלה מצד הלקוח:

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

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

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