הפתרון למעבר מ-VM לקונטיינר: Kubevirt

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

כל מי שהתחיל ומשתמש בקונטיינרים, Kubernetes וכו’ – מבין בוודאי שקונטיינרים אינם מכונות וירטואליות. בניגוד ל-VM, קונטיינר מקבל שרותי OS ממערכת ההפעלה המותקנת על ה-VM (או על הברזל) שמריץ את הקונטיינר, ולפיכך קונטיינרים ברוב המקרים הם דברים די קטנים בהשוואה למערכת הפעלה מלאה שמותקנת ב-VM, גם כשהיא מותקנת כ-Minimal.

בניגוד לסטארטאפים שברוב הזמן מתחילים להקים את רוב התשתית שלהם בקונטיינרים, בחברות בינוניות וגדולות, המצב שונה לחלוטין – אצלן הכל רץ או בתוך מכונות VM או על ברזלים. המרת VM לקונטיינר יכולה להיות דבר קטן ופשוט ולפעמים זו יכולה להיות עבודה מייגעת וארוכה, במיוחד אם ב-VM רצים מספר אפליקציות וצריך להפריד כל אפליקציה לקונטיינר (לא מומלץ להריץ מספר אפליקציות בקונטיינר) ולדאוג שהן “ידברו” אחת עם השניה.

ישנם גם מקרים שאי אפשר להמיר מכונת VM לקונטיינרים חדשים. מקרים כמו:

  • האפליקציה רצה ומבוססת על Windows
  • האפליקציה רצה על גירסת לינוקס מאוד ישנה
  • האפליקציה רצה על מערכת הפעלה שאינה מבוססת לינוקס
  • ה-VM נבנה ע”י מומחה חיצוני ולאף אחד אין מושג ירוק איך הדברים מוגדרים ב-VM (לדוגמא: Cobol ישן)

במקרים כאלו, קשה מאוד או בלתי אפשרי להמיר ידנית את המכונות הללו לקונטיינרים, וכך פרויקטים לקונטיינריזציה מתעכבים או שממשיכים להריץ את מכונת ה-VM בתוך פתרון וירטואליזציה (vSphere לדוגמא) – אבל אז מפסידים את כל היתרונות של Kubernetes או Openshift.

וכאן נכנסת לתמונה אפליקציית Kubevirt.

אפליקציית Kubevirt מרחיבה בעצם את Kubernetes/OpenShift ומוסיפה למערכת תמיכה בקונטיינרים מסוג נוסף: קונטיינר שמריץ VM. כך בעצם אפשר לקחת VM מהדוגמאות לעיל ו”להכניס” אותו לתוך קונטיינר, כך שנוכל להריץ אותו כמו שאנחנו מפעילים קונטיינרים נוספים, ובכך נוכל להשתמש באפליקציה שרצה ב-VM, נוכל לשכפל את הקונטיינר לפי פרמטרים שנרצה, נוכל לשדרג את הקונטיינר ועוד ועוד.

מאחורי הקלעים, מה ש-Kubevirt עושה, הוא להשתמש ב-KVM (הוירטואליזציה המצויה בכל לינוקס) ובספריית Libvirt וספריות נוספות בכדי ליצור POD ובתוך ה-POD להריץ VM. את אותו VM אנחנו נגדיר בעזרת קבצי YAML, כמו שמגדירים כל דבר ב-Kubernetes, וכך נוכל להגדיר כמות זכרון, היכן הדיסק הוירטואלי יושב, האם ה-VM יהיה בעצם Immutable (כלומר שכל שינוי ל-VM ימחק ברגע שה-VM “כובה”), ועוד פונקציות נוספות. הגישה ל-VM תוכל להתבצע בכלים הרגילים (SSH, RDP) או VNC וחיבור סריאלי וירטואלי (במקרה שמדובר בלינוקס או כל מערכת תואמת UNIX אחרת).

מכיוון שב-Kubernetes אפשר להשתמש בכל מיני “דרייברים” (Storage Classes, Volumes), נצטרך להמיר בשלב ראשון את הדיסקים הוירטואליים של ה-VM מהפורמט הנוכחי (VMDK ב-vSphere) לפורמט ש-KVM ו-libvirt יכולים להבין ולהשתמש. סוג הדיסק שאנחנו נצטרך יהיה RAW וכלי ההמרה (שצריך לרוץ תחת לינוקס) הוא virt-v2v (זה קצת יותר מורכב ממה שהקישור מראה). מהרגע שביצענו זאת, אנחנו “מנתקים” בעצם את ה-VM מהוירטואליזציה הנוכחית (נניח vSphere), אבל ה-VM עדיין נשאר ב-vSphere. ברגע שיש לנו את הקובץ בפורמט RAW, נוכל להשתמש בכלי כמו CDI כדי לבצע Import של ה-Image לתוך Volume שנגדיר. אחרי שהצלחנו (שוב, לא דבר כל כך קל, אלא אם אתם משתמשים ב-Openshift דרך ה-WEB UI), אנחנו נגדיר POD עם ה-VM ושם אנחנו נבחר דברים כמו כמות זכרון, מערכת הפעלה, וכו’. בזמן ההגדרות נוכל להוסיף דיסקים וירטואליים חדשים ל-VM ועוד. לאחר שהתהליך מסתיים ונפעיל את ה-VM, תופיע כתובת IP שדרכה נוכל להתחבר אל ה-VM.

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

  • Kubevirt עובד על כל גירסת Kubernetes מ-1.10 ומעלה, ו-OpenShift 3.11 ומעלה.
  • בשביל לקבל ביצועים טובים עם ה-VM, יש צורך בתמיכת Nested Virtualization (אם ה-Kubernetes שלכם רץ כמכונה וירטואלית).
  • עננים ציבוריים: אם אתם רוצים להריץ Kubevirt על ענן ציבורי, תצטרכו לבחור Instances שכוללים תמיכת Nested Virtualization. גם לאז’ור וגם לגוגל יש מכונות כאלו, ב-AWS אין ולפיכך ב-AWS מכונות VM כאלו ירוצו יותר לאט מאחר ומדובר באמולציית X86-64 בתוכנה.
  • דיסקים וירטואליים: מכיוון שאין Thin Provisioning בשיטה כזו, הווליומים יהיו גדולים (כמה שהגדרתם ב-VM בהתחלה תחת vSphere), לכן אם הגדרתם את ה-VM עם דיסק של 100 ג’יגה אבל השתמשתם רק ב-15 ג’יגה, הקטינו את הדיסק (הוראות נמצאות כאן אם מדובר ב-vSphere).
    נקודה נוספת חשובה לגבי דיסקים וירטואליים: אפשר לצרף אותם ישירות ל-Image של הקונטיינר אך הדבר אינו מומלץ (אלא אם אתם רוצים להפיץ את ה-Image החוצה).
  • קישוריות ל-VM ותקשורת: במקור כברירת מחדל יש ל-VM חיבור רשת יחיד. יחד עם זאת ניתן להשתמש ב-Multus או Genie כדי להוסיף דברים רבים הקשורים לרשת: VLAN, Bridges, אפילו PXE Boot – תשתוללו חופשי.
  • ניתן לשכפל את ה-VM לפי כל פרמטר שתרצו כדי לעמוד בעומסים. לשם כך תצטרכו להגדיר בקובץ YAML את ה-AccessModes לפי הצרכים שלכם.
  • KVM – מכיוון שה-VM שלכם ירוץ תחת KVM, כדאי להכיר את KVM. תרימו מכונת לינוקס, תפעילו Nested Virtualization ותריצו את Virt Manager (נקרא גם VMM). יש המון פונקציות והגדרות וכדאי להכיר אותם לפני כן, אחרת תקבלו הפתעות (במיוחד אם מכונת ה-VM שלכם משתמשת ב-UEFI. יש תמיכה ל-UEFI אבל תצטרכו להגדיר כמה דברים לשם כך).

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

אם אתם רוצים עוד הסברים על Kubevirt כולל הדגמה של לינוקס ו-Windows Server 2012, אתם מוזמנים לצפות בקליפ (הארוך – שעה) הבא.

לסיכום: אם אתם רוצים לעבור לקונטיינרים והדבר היחיד שמפריע זה מכונה אחת (או מספר מכונות) שבעייתי להמיר אותן ידנית לקבצי Docker Images ושירוצו כקונטיינרים טבעיים, Kubevirt יכול לסייע בכך. חברות כמו SAP, nVidia, Cloudflare כבר משתמשות ב-Kubevirt. חשוב לציין: Kubevirt עדיין לא מוגדר כגירסה סופית (מצד שני, גם Kubernetes לא מוגדר כך). אם אתם משתמשים ב-OpenShift מגירסה 3.10 ומעלה (גם בגירסת OKD – גירסת הקוד הפתוח) – קל מאוד לשלב את Kubevirt והחל מגירסה 4.2 – ה-Kubevirt יהיה חלק אינטגרלי (בגירסה הנ”ל תוכלו להתחבר ישירות ל-vCenter ולהמיר את ה-VM בכמה קליקים).
מיקרוסופט וגוגל כבר מזמן הבינו שאם רוצים למשוך את הלקוחות אליהם כדי שישתמשו בשרותי ה-Kubernetes שלהם, צריך לעזור ללקוחות בכך שיציעו המרה של מכונות VM להרצה בתוך קונטיינרים, וזה יהיה כנראה ה”גל” הבא.

כמה מילים על המרה מערכת לניהול גרסאות קוד

בשנה האחרונה ביצעתי מספר פרויקטים הקשורים להמרת מערכת לניהול גרסאות קוד, ממערכות שונות למערכות מבוססות GIT (כמו GitLab, או Bit Bucket ואחרים), ורציתי לשתף עם הקוראים כמה תובנות בנושא.

אם יש סוג מסויים של עסקים בהם אין עבודה כזו, אלו הם הסטארטאפים. אני לא מכיר ולא שמעתי אפילו על סטארטאפ אחד שלא משתמש בפתרון מבוסס GIT (בין בשימוש שרת GIT, שימוש בשרותי GIT של ספקי הענן וכו’). בדרך כלל עניין ההמרה מתרחש אצל חברות ותיקות, ושם אצל אותן חברות ותיקות יש כל מיני פתרונות לניהול קוד, בין אם מדובר ב-TFS (או VSS), ב-Subversion או Mercurial, וכן .. יש גם חברות שמשתמשות ב-CVS. כמעט בכל חברה, מעבר למערכת ניהול קוד אחרת זה תהליך לא קל (בירוקרטית וניהולית, טכנית ניתן להמיר את הדברים ביום או יומיים, תלוי בכל מיני פרמטרים).

ככל שעובר הזמן, עניין המעבר ל-GIT נהיה פחות “אופציה” ויותר “צורך”. חברות שחושבות לעבור להשתמש במערכות מבוססות קונטיינרים (בין אם זה Kubernetes, OpenShift, CaaS, Rancher, Mesos ועוד) יצטרכו להבין עוד בהתחלה שמבחינה טכנית ניתן איכשהו לעבור עם מערכת ניהול קוד הנוכחית שיש להן, אבל אם מכניסים מערכת קונטיינרים ל-Enterprise, הצורך לעבור ל-GIT יהיה יותר דחוף.

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

  • המרת קוד ממערכת קיימת למערכת GIT חדשה (מקומית, מכונה בענן, שרות GIT של ספק הענן) כולל היסטוריה ורוויזיות.
  • התאמת הכלים המקומיים שלהם לעבוד מול מערכת ה-GIT.
  • ביצוע “פרישה” (Retire) של מערכת הקוד הנוכחית.
  • תמיכה שוטפת.

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

  • אם אתם חברה גדולה ומסודרת, ואני אוריד את מערכת הקוד הנוכחית ואמחק אותה, והמחלקה המשפטית שלכם תשמע את זה, הם ירדפו אחריי עם נבוטים. קוד ישן ומערכות ישנות צריכות להיות זמינות במקרה שהחברה נתבעת על העתקת קוד או הפרת פטנטים. ישנה חשיבות קריטית לזמנים (תאריכים, כולל שעה מדוייקת) של הכנסת קוד והדברים האלו יוצגו בבית משפט/דיונים מול התובעת כדי להראות סתירות בתביעה. לכן, מה שעושים לגבי מערכות ניהול קוד קיימות (לאחר מעבר לעבודה עם GIT) – הוא שמירת גיבוי, כיבוי המכונה אך לא למחוק אותן.
  • העברת היסטוריה מלאה של קוד קיים ממערכות ניהול קוד אחרות ל-GIT: זה אפשרי בחלק מהמקרים (לדוגמא: mercurial או TFS) אך בעייתי במקרים כמו CVS או Subversion, ולכן בדרך כלל ההמלצה היא להעביר קוד נוכחי ולשמור קוד/Branches ישנים במערכת הקודמת. מיקרוסופט בעבר הבטיחו ללקוחות כי הם יעבירו בקלות קוד מ-SVN ל-GIT כולל היסטוריה מלאה, ורק אחרי שהם התחילו את הפרויקט, הם ראו כמה זה לא ממש ריאלי (במיוחד אם יש קוד ענק של מספר שנים) ומאז הם ירדו מכך.
  • האם להשתמש בשרותי Code Repository של ספק הענן שאיתו אתם עובדים או להרים VM עם אפליקציית שרת GIT (כמו GitLab, BitBucket, GitHub Enterprise)? זה תלוי בכם. אם חתמתם עם ספק הענן על חבילת תמיכה רצינית, אז אולי כדאי להשתמש בשרות (שימו לב, שתצטרכו לשלם תשלום חודשי על כך. באמזון AWS ה-5 משתמשים ראשונים הם בחינם). לעומת זאת, אפשר להקים Instance ולהקים מערכת GIT כמו אלו שציינתי במחירים נוחים:
    • מערכת GitLab היא חינמית כל עוד אינכם צריכים תמיכה מסחרית מהחברה.
    • מערכת BitBucket היא חינמית ל-5 משתמשים ראשונים, 2$ לאחר מכן (מינימום 10 משתמשים) ואתם מקבלים גם אינטגרציה עם Jira.
      שימו לב: ב-2 המקרים אתם מקבלים גם תמיכת Pipelines כדי לבצע אוטומציה לקימפולים, קונטיינרים וכו’.
  • עבודה עם מערכת ניהול קוד נוכחית יחד עם GIT: אם יש לכם מערכת ניהול קוד ישן מבוססת Subversion, ניתן להקים מערכת (היא בתשלום אם יש יותר מ-10 משתמשים) המאפשרת לעבוד מול ה-Subversion והמערכת המסחרית תמיר מיידית את הקוד למערכת ה-GIT שלכם ולהיפך, כך שניתן להמיר את המפתחים לעבודה ב-GIT ואת האוטומציה (Jenkins, Team City וכו’) בהדרגה ולא במכה אחת.
  • תמיכה והדרכה – חשוב לסגור את העניין במסגרת חוזה הפרויקט. קל מאוד לעשות שטויות מצד אחד ובמקרים רבים גם לא מנצלים את היתרון של מערכות מבוססות GIT מצד שני – וחבל.

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