איתור סטיות (Drift Detection) ב-GitOps

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

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

שאלות נפוצות

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

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

GitOps Drift Detection: למה התצורה סוטה מהמאגר

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

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

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

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

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

האפקט של בקרת הפערים: זמן, תקלות, השבתה

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

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

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

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

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

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

מצבי בקרת פערים: השוואת גישות

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

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

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

הטמעת בקרת פערים: שלבי עבודה הנדסית

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

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

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

חפצי הטמעה: מניפסטים, מדיניות, נהלים

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

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

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

מקרה בוחן: איך פערים הפסיקו להגיע לפרודקשן

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

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

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

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

מדדים לפני ואחרי

מדד לפני אחרי
זמן גילוי הסטייה עד 8 שעות עד דקה
חלק העריכות שלא דרך המאגר כ-35% פחות מ-3%
תקלות בפרודקשן בגלל חוסר סנכרון 4 ברבעון 0

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

Drift אחרי סנכרון: מה עושים אם הפערים חוזרים?

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

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

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

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

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

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

ספקות טכניים: סודות, הרשאות, עריכות ידניות

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

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

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

האם האוטומציה לא תקבל הרשאות מיותרות בסביבה?

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

האם אפשר לבצע רולבק לשינוי?

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

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

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

ואם חלק מהמערכות חיות מחוץ למאגר?

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

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

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

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

בהמשך נתאם את הקונטור ההתחלתי — סביבה אחת שבה בודקים גילוי ותגובה — ואם התוצאה תואמת את הציפיות, נפרוס על השאר. תארו את המשימה בהיקף שבו היא נמצאת сейчас: גם טיוטה תתאים, את שאלות ההבהרה נשאל בעצמנו.