אם קראתם משהו על הרצה בטוחה של קוד שנוצר בידי בינה מלאכותית, ראיתם את המילה microVM, בדרך כלל ליד Firecracker. בדרך כלל מסבירים אותה או כ„מכונה וירטואלית קלה“ (נכון, לא מועיל) או בעזרת תרשים של פנים הליבה. זו הגרסה שבאמצע.
שתי אפשרויות ותיקות יותר, ולמה אף אחת לא מתאימה
התחילו משני הדברים ש־microVM יושבת ביניהם.
קונטיינר הוא קבוצה של תהליכים רגילים על המחשב שלכם, שהליבה הסכימה „לשקר“ להם. namespaces מראים להם מערכת קבצים, רשימת תהליכים ורשת משלהם; cgroups מגבילים כמה מעבד וזיכרון הם יכולים לצרוך. הוא עולה באלפיות שנייה כי שום דבר חדש לא מאותחל. אבל כל הקונטיינרים על מארח מדברים עם אותה ליבה. באג בליבה שאפשר להגיע אליו מתוך קונטיינר אחד הוא דרך החוצה מכולם.
מכונה וירטואלית מביאה ליבה משלה. המעבד של המארח, באמצעות וירטואליזציה בחומרה (KVM ב־Linux), מריץ את האורח כאילו היה לו מחשב משלו. הגבול הוא ההיפרווייזר, שחושף הרבה פחות ממאות קריאות המערכת של ליבה. המחיר הוא כובד. מכונה וירטואלית קלאסית מדמה מחשב שלם: קושחה, אפיק PCI, בקרי USB, כרטיס גרפי, לפעמים כרטיס קול. היא עולה דרך כל אלה, לוקחת שניות עד דקות, וכל מופע נושא עשרות או מאות מגה־בייט של תקורה.
אנלוגיה שמחזיקה די טוב: קונטיינרים הם דירות באותו בניין, עם יסודות, צנרת וחיווט משותפים. מכונות וירטואליות הן בתים נפרדים. בתים הם שכנים בטוחים יותר, אבל אף אחד לא בונה בית לביקור של 20 שניות.
מה Firecracker מסיר
Firecracker הוא virtual machine monitor (התוכנה שמקימה ומריצה מכונה וירטואלית מעל KVM), שנכתב ב־Rust ושוחרר כקוד פתוח ב־2018. הוא נבנה למשימה אחת: הרצה של מספר עצום של עומסים קצרי חיים, שאינם סומכים זה על זה, על חומרה משותפת. הוא מגיע לשם בעיקר על ידי מחיקת דברים:
- אין קושחה, אין גילוי חומרה. הליבה נטענת ישירות לזיכרון ומופעלת. שום דבר לא מחפש התקנים שאינם קיימים.
- מודל התקנים זעיר. כרטיס רשת, התקן בלוקים, קונסולה טורית ועוד כמה, כולם virtio (התקנים שתוכננו למכונות וירטואליות ולא חיקויים של התקנים פיזיים). אין USB, אין גרפיקה, אין PCI.
- בסיס קוד קטן ובטוח־זיכרון. פחות קוד שמדמה התקנים פירושו פחות מקומות לבאג שמאפשר לאורח להגיע למארח.
- כלוב סביב ה־VMM עצמו. כל תהליך Firecracker רץ בתוך chroot, עם מסנני seccomp שמגבילים את קריאות המערכת שלו ו־cgroups שמגבילים את המשאבים שלו. גם אם משהו היה פורץ מהאורח, הוא היה נוחת בכלוב ולא על המארח.
המספרים שהפרויקט עצמו מפרסם: מרחב משתמש תוך 125 ms בלבד ופחות מ־5 MiB תקורת זיכרון לכל microVM. אלה נתוני מעבדה במקרה הטוב; ארגז חול אמיתי צריך גם הכנה של דיסק ורשת וסוכן בפנים שמוכן לקבל פקודות, ולכן שלנו מוכן תוך כשנייה. זה עדיין קרוב מספיק למהירות של קונטיינר כדי שתוכלו ליצור אחד לכל משימה ולזרוק אותו אחר כך.
קונטיינר מול microVM, בפועל
| קונטיינר | Firecracker microVM | |
|---|---|---|
| ליבה | משותפת עם המארח | משלה |
| הגבול מול המארח | קריאות מערכת לליבה משותפת | היפרווייזר + VMM קטן |
| זמן עלייה | אלפיות שנייה | ~0.1–1 ש׳ |
| תקורה למופע | קטנה מאוד | כמה MiB |
| התקנים | מה שהמארח חושף | רשת, דיסק, קונסולה |
| GPU | אפשרי | לא |
| מתאים ל־ | קוד שסומכים עליו, אריזת אפליקציות | קוד לא מהימן, עומסים מרובי דיירים |
השורה החשובה היא השנייה. עם קונטיינר, השאלה „האם הקוד הזה יכול לברוח?“ הופכת ל„האם יש באג נגיש איפשהו בליבה של המארח?“. עם microVM היא הופכת ל„האם יש באג בהיפרווייזר או בקומץ התקנים וירטואליים?“. המשטח השני קטן בהרבה, והוא בדיוק המשטח שפלטפורמות ענן כבר מגינות עליו באירוח מרובה הדיירים שלהן.
על מה מוותרים
microVM היא לא שדרוג חינמי.
- אין GPU ואין מסכים. היא נועדה להרצת קוד, לא לשולחנות עבודה או לעומסים גרפיים.
- פחות התקנים, פחות גמישות. כל דבר שמצפה לחומרה אמיתית, או לרשימה ארוכה של מודולי ליבה, לא ירגיש בבית.
- גבולות עדיין צריכים מדיניות. microVM עם תעבורה יוצאת פתוחה עדיין יכולה לשלוח תעבורה שאינכם רוצים; כזו שמפתחות ה־API שלכם בתוכה עדיין יכולה להדליף אותם. בידוד מגן על המארח מפני האורח, לא על הסודות שלכם מפני הקוד שמסרתם לו אותם.
איך ארגזי החול שלנו משתמשים בזה
כל ארגז חול של EQVPS הוא microVM אחת של Firecracker עם ליבה משלה, מ־0.25 vCPU ו־512 MB ועד 8 vCPU ו־16 GB. הוא מגיע עם Python 3.12, Node.js 22, bash, git ו־curl, יש לו אינטרנט יוצא ואין לו פורטים נכנסים. ארגזי חול זמניים נמחקים כשמסיימים; ארגזי persistent שומרים את הדיסק שלהם, והשהיה כותבת תמונת מצב של ה־microVM לדיסק כך שהיא לא עולה כלום עד שהיא ממשיכה. תמונות מצב מושהות נשמרות 14 יום. אחר כך ארגז החול נמחק והמזהה שלו מחזיר 410 sandbox_deleted.
בחרנו ב־microVM על פני קונטיינרים מסיבה אחת: הקוד שרץ בארגז חול הוא, מעצם התכנון, קוד שאף אחד לא בדק. פלט של סוכן בינה מלאכותית, pull request של זר, מבחן ביצועים של אלף תוכניות שמודל כתב. עבור אלה, ליבה משלה היא הגבול שכדאי לשלם עליו. הפרטים של מה שבנינו סביבה — תעריפים, מכסות, מגבלת 55 השניות לפקודות סינכרוניות — נמצאים בתיעוד ארגזי החול.
אם תרצו להשוות את הגבול הזה לאפשרויות האחרות לעומק, רמות בידוד לקוד לא מהימן מציב תהליכים, קונטיינרים, microVM ומכונות וירטואליות מלאות זה לצד זה. ואם המחיר לפי שנייה הוא שתפס את עינכם, איך חיוב לפי שנייה עובד באמת מציג את החשבון.
תגובות
אין עדיין תגובות. היו הראשונים.