הגדרת קונטיינרים של Windows ב-Docker/Kubernetes

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

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

שאלות נפוצות

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

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

מדוע קונטיינרים של Windows נופלים על מארח זר

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

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

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

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

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

מה נותן מעגל קונטיינרים מנוהל

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

בנייה צפויה

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

חלון עדכון קצר

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

השבתת השירות — שניות, ולא חלונות לילה

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

שחזוריות הסביבה

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

קונטיינרים של Windows: מצבי בידוד ותאימות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

מה שינינו

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

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

מה קרה בסוף

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

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

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

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

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

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

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

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

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

ספקות טכניים נפוצים לפני ההתחלה

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

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

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

אילו הרשאות דרושות לתהליך בתוך הקונטיינר?

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

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

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

מה משתנה בעת העברה למארח או למעגל אחר?

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

מה עם רישיונות בעת ההעברה?

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

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

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

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

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

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

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