רשת שירותים מבוססת Istio: התקנה והגדרה ב-Kubernetes

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

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

שאלות נפוצות

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

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

Istio ב-Kubernetes: היכן מתפרקת הקישוריות בין השירותים

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

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

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

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

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

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

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

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

מה נותנת רשת השירותים: אפקטים מדידים

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

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

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

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

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

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

מצבי פריסה של Istio ב-Kubernetes

הטמעת רשת שירותים ב-Kubernetes מתחילה בבחירת מצב: ממנו תלויים העלויות הנלוות של מישור הנתונים, מהירות חיבור השירותים ואיך תיבנה תצורת ריבוי-קלאסטרים.

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

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

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

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

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

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

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

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

תצורות ונהלים: מה נשאר בידי הצוות

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

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

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

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

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

מה היה לפני ההטמעה

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

מה שינינו

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

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

מה נהיה

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

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

במה הרשת שונה מספרייה בתוך האפליקציה?

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

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

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

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

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

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

ספקות טכניים לפני הטמעת הרשת

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

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

בכמה תגדל ההשהיה בין השירותים?

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

אפשר להפעיל בשלבים ולחזור אחורה?

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

מי מעדכן את האישורים?

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

מה נשאר לנו אחרי המסירה?

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

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

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

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

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

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