Kubernetes Operators: אוטומציה של PostgreSQL, Kafka ושירותים

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

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

שאלות נפוצות

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

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

Kubernetes Operators: היכן נשברת תחזוקה ידנית

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

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

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

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

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

מה נותנת אוטומציה של תחזוקת מסדי נתונים ותורים

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

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

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

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

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

Kubernetes Operators או סקריפטים ידניים: מה לבחור

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

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

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

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

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

כיצד מתבצעת ההטמעה: שלבי עבודת הנדסה

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

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

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

מה נשאר אצל הלקוח: תצורות ונהלים

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

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

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

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

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

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

לפני ואחרי

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

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

במה אופרטור שונה מתבנית פריסה

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

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

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

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

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

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

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

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

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

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

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

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

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

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

נדון במשימה: ממה נתחיל את העבודה

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

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

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