אתם יכולים ליצור מכונות וירטואליות (VM) בתוך מכונות וירטואליות אחרות באמצעות וירטואליזציה בתצורה משולבת. Compute Engine מוסיף הוראות וירטואליזציה לסדרות ספציפיות של מכונות, כדי שמכונות וירטואליות יוכלו ליצור מכונות וירטואליות מקוננות. מכיוון שהצמתים של Google Kubernetes Engine (GKE) פועלים במכונות וירטואליות של Compute Engine, עומסי העבודה של GKE יכולים ליצור מכונות וירטואליות בתצורה בת-מקוננת ולהשתמש בהן. במסמך הזה מוסבר איך להפעיל וירטואליזציה מקוננת ב-GKE.
איך מכונות וירטואליות מוטמעות פועלות ב-GKE
כדי להשתמש במכונות וירטואליות מוטמעות ב-GKE, צריך להפעיל וירטואליזציה מוטמעת בצמתים ספציפיים או במאגרי צמתים ספציפיים. תוספי הווירטואליזציה המתאימים של המעבד (CPU), כמו Intel Virtualization Technology (VT-x) או AMD Virtualization (AMD-V), מופעלים במכונות הווירטואליות הבסיסיות. לאחר מכן תוכלו להפעיל את היצירה של מכונות וירטואליות בתצורה בת-מקוננת מ-Pods באמצעות תוכנות כמו QEMU או Kata Containers.
ב-GKE, מכונות וירטואליות מוטמעות שימושיות בתרחישי השימוש הבאים:
- להריץ קוד לא מהימן, כמו סוכני AI, במכונות וירטואליות קלות, כמו Kata Containers. מידע נוסף על תרחיש השימוש הזה זמין במאמר בנושא שימוש ב-Kata Containers בקוד פתוח עם Agent Sandbox ב-GKE.
- הוספת שכבת בידוד בעזרת חומרה לעומסי עבודה של כמה דיירים.
- להריץ תוכנות ייעודיות כמו אמולטור Android בענן.
השלכות על הביצועים
בעזרת וירטואליזציה מקוננת עם שיפור מהירות באמצעות חומרה, יכול להיות שיהיה שיפור בביצועים של עומסי עבודה שפועלים במכונות וירטואליות מקוננות, בהשוואה להגדרות של וירטואליזציה לא מקוננת. ההשפעה על הביצועים תלויה בפרופיל העומס הספציפי, כולל מאפייני השימוש בזיכרון ובקלט/פלט.
בנוסף, יצירת מכונות וירטואליות בתצוגת עץ במכונות הווירטואליות הבסיסיות של צומתי GKE עשויה להשפיע על הביצועים של עומסי עבודה אחרים שפועלים בצמתים האלה.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שמדיניות הארגון תומכת ביצירת מכונות וירטואליות בתצורה בת-מקוננת.
- בודקים את המגבלות של מכונות וירטואליות בתצורה בת-מקוננת.
דרישות ומגבלות
כדאי להביא בחשבון את הפרטים הבאים לפני שמפעילים וירטואליזציה מקוננת ב-GKE ומאפשרים ל-Pods ליצור מכונות וירטואליות מקוננות:
- אפשר להגדיר מאגרי צמתים עם מכונות וירטואליות מוטמעות רק עם מספר מוגבל של סדרות מכונות וירטואליות. כדי לוודא אילו סדרות מכונות נתמכות, אפשר לעיין בשורה Nested virtualization בהשוואה בין סדרות מכונות.
- אין תמיכה בווירטואליזציה בתצורה מקוננת במאגרי צמתים של Windows Server.
- אי אפשר להשתמש בווירטואליזציה בתצורה משולבת אם האילוץ Disable VM nested virtualization נאכף במדיניות הארגון.
- כדי ש-Pods יוכלו ליצור אינטראקציה עם מכונות וירטואליות מוטמעות, צריך להגדיר את
securityContext.privileged:true. אם אתם משתמשים ב-GKE Autopilot, אתם לא יכולים ליצור צמתים של Pods עם הרשאות מיוחדות, אלא במקרים הבאים:
- ה-Pods הם בבעלות GKE, שותף של GKE או פרויקט קוד פתוח שאושר.
- ה-Pods הם בבעלותכם והם נכללים בWorkloadAllowlist.
אי אפשר להפעיל וירטואליזציה בתצורה מקוננת במאגרי צמתים קיימים.
וירטואליזציה בתצורה מקוננת היא הגדרה שלא ניתנת לשינוי ב-GKE.
אם אתם משתמשים ב-ComputeClasses כדי להפעיל וירטואליזציה מקוננת, האשכול שלכם צריך להריץ GKE מגרסה 1.37.0-gke.4713000 ואילך.
הפעלת וירטואליזציה מקוננת
בקטעים הבאים מוסבר איך להפעיל וירטואליזציה מקוננת ב-GKE בדרכים הבאות:
- שימוש ב-ComputeClasses: במצב Autopilot או מצב רגיל, מפעילים וירטואליזציה מקוננת להגדרות ספציפיות של צמתים ב-ComputeClass. בשיטה הזו, אתם יכולים להפעיל וירטואליזציה בתצוגת עץ במאגרי צמתים שנוצרו באופן אוטומטי, ולחזור למצב קודם בכמה הגדרות של צמתים לפי סדר עדיפויות.
- שימוש ב-GKE API: במצב רגיל, משתמשים בלקוח כמו Google Cloud המסוף, ה-CLI של gcloud או Terraform כדי ליצור מאגרי צמתים ספציפיים שמשתמשים בווירטואליזציה מקוננת.
הפעלה באמצעות ComputeClasses
אתם יכולים להשתמש ב-ComputeClass כדי להפעיל וירטואליזציה בתצורה מקוננת לקבוצות ספציפיות של צמתים במצב Autopilot או Standard. ComputeClasses הם השיטה היחידה שבה אפשר להפעיל וירטואליזציה מקוננת עבור מאגרי צמתים שנוצרו אוטומטית ועבור צמתי Autopilot. כדי לפרוס ComputeClass לדוגמה שמאפשר וירטואליזציה בתצורה מקוננת, פועלים לפי השלבים הבאים:
שומרים את המניפסט הבא של ComputeClass כקובץ בשם
nested-virt-class.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: nested-virt-class spec: priorities: - machineFamily: c3 spot: true enableNestedVirtualization: true - machineFamily: c4 spot: false enableNestedVirtualization: true - machineFamily: c4d spot: true enableNestedVirtualization: true nodePoolConfig: imageType: "cos_containerd" nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUpלדוגמה, ל-ComputeClass הזה יש את המאפיינים הבאים:
- נותן עדיפות למכונות C3 ב-VM במודל Spot, עובר למכונות C4 על פי דרישה ואז למכונות C4D ב-VM במודל Spot.
- הפעלת וירטואליזציה בתצורה מקוננת לכל המכונות.
- מונעת מ-GKE להגדיל את סדרת המכונות שמוגדרת כברירת מחדל באשכול אם מופעים עם עדיפות לא זמינים.
- משתמש בתמונת הצומת של מערכת ההפעלה שמותאמת לקונטיינרים לכל הצמתים.
- ההגדרה הזו מאפשרת יצירה אוטומטית של מאגרי צמתים, כך ש-GKE יכול ליצור מאגרי צמתים חדשים להרצת Pods כשצריך.
לחלופין, אפשר להפעיל וירטואליזציה מקוננת לכל כללי העדיפות ב-ComputeClass על ידי ציון השדה
enableNestedVirtualization: trueבשדהspec.priorityDefaults.יוצרים את ComputeClass:
kubectl apply -f nested-virt-class.yamlכשמפעילים וירטואליזציה מקוננת ב-ComputeClass, GKE בודק את סדרת המכונות שצוינה כדי לוודא שהיא תואמת למכונות וירטואליות מקוננות. אם סדרת מכונות בכלל עדיפות שמפעיל וירטואליזציה בתצורה מקוננת לא תואמת, GKE מציג אזהרה. עם זאת, יכול להיות שהבדיקה הזו לא תמצא את כל ההגדרות הלא תואמות.
כדי להפעיל יצירה של מאגר צמתים, יוצרים Pod שבוחר את ComputeClass:
שומרים את מניפסט ה-Pod הבא כקובץ בשם
nested-virt-example-pod.yaml:apiVersion: v1 kind: Pod metadata: name: nested-virt-example-pod spec: nodeSelector: cloud.google.com/compute-class: nested-virt-class containers: - name: example-container image: registry.k8s.io/pause:3.9יוצרים את ה-Pod:
kubectl apply -f nested-virt-example-pod.yaml
הצמתים ש-GKE יוצר עבור ComputeClass הזה כוללים וירטואליזציה מקוננת. אתם יכולים להריץ אפליקציות שיוצרות מכונות וירטואליות מוטמעות בצמתים האלה. כל קבוצת Pod שמשתמשת ב-ComputeClass יכולה ליצור מכונות וירטואליות מקוננות. לדוגמה, אפשר להתקין Kata Containers בצמתים האלה על ידי ציון node selector (בורר צמתים) לתווית cloud.google.com/compute-class="nested-virt-class".
הפעלה במאגרי צמתים רגילים
אם אתם לא רוצים להשתמש ב-ComputeClasses, אתם יכולים להפעיל ידנית וירטואליזציה מקוננת למאגרי צמתים חדשים ספציפיים באשכולות רגילים במהלך כל אחת מהפעולות הבאות:
- כשיוצרים אשכול Standard חדש, שמאפשר וירטואליזציה בתצורה בת-מקוננת למאגר ברירת המחדל של הצמתים. ההפעלה הזו חלה רק על מאגר הצמתים שמוגדר כברירת מחדל. ב-GKE, לא מופעלת אוטומטית וירטואליזציה מקוננת למאגרי צמתים נוספים שיוצרים בשלב מאוחר יותר.
- כשיוצרים מאגר צמתים חדש באשכול קיים מסוג Standard.
כדי להפעיל וירטואליזציה בתצורה מקוננת במאגרי צמתים שנוצרו באופן ידני, בוחרים באחת מהאפשרויות הבאות:
המסוף
מפעילים וירטואליזציה מקוננת עבור מאגר הצמתים שמוגדר כברירת מחדל באשכול חדש:
- נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
- קובעים את ההגדרות הבסיסיות של האשכול.
- בתפריט הניווט, בקטע מאגרי צמתים, מרחיבים את הקטע default-pool ולוחצים על צמתים.
- בקטע Machine configuration בוחרים סוג מכונה נתמך (אפשר לראות את האפשרויות בשורה Nested virtualization).
- אחרי הקטע Reservations, מסמנים את התיבה Enable nested virtualization.
- כדי ליצור את האשכול, לוחצים על Create.
הפעלת וירטואליזציה בתצורה מקוננת למאגר צמתים חדש באשכול קיים:
נכנסים לדף Kubernetes clusters במסוף Google Cloud .
לוחצים על השם של האשכול שבו רוצים ליצור את מאגר הצמתים החדש.
מגדירים את מאגר הצמתים.
לוחצים על הכרטיסייה Nodes.
בכותרת של הקטע מאגרי צמתים, לוחצים על add_box יצירת מאגר צמתים בניהול המשתמש.
בתפריט הניווט, לוחצים על Nodes.
בקטע Machine configuration, בוחרים סדרת מכונות שתומכת בווירטואליזציה מקוננת. למידע נוסף, סננו את טבלת ההשוואה של סדרות המכונות לפי המאפיין Nested virtualization.
מסמנים את התיבה Enable nested virtualization. אם התיבה הזו מושבתת, צריך לוודא שבחרתם סדרת מכונות שתומכת בווירטואליזציה בתצורה מקוננת.
לוחצים על יצירה.
gcloud
הפעלת וירטואליזציה בתצורה מקוננת למאגר ברירת המחדל של הצמתים באשכול חדש:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --machine-type=MACHINE_TYPEמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: שם לאשכול. -
CONTROL_PLANE_LOCATION: האזור או התחום של מישור הבקרה של האשכול. -
MACHINE_TYPE: סוג מכונה שתומך בווירטואליזציה בתצורה בת-מקוננת, כמוn4-standard-8. למידע נוסף, סננו את טבלת ההשוואה של סדרות המכונות לפי המאפיין Nested virtualization.
-
כדי להפעיל וירטואליזציה מקוננת למאגר צמתים חדש באשכול קיים:
gcloud container node-pools create NODEPOOL_NAME \ --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --machine-type=MACHINE_TYPEמחליפים את מה שכתוב בשדות הבאים:
-
NODEPOOL_NAME: שם למאגר הצמתים. -
CLUSTER_NAME: השם של האשכול הקיים. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול. -
MACHINE_TYPE: סוג מכונה שתומך בווירטואליזציה מקוננת, כמוn4-standard-8. למידע נוסף, סננו את טבלת ההשוואה של סדרות המכונות לפי המאפיין Nested virtualization.
-
אחרי שיוצרים את האשכול או את מאגר הצמתים, אפשר לבדוק אם הווירטואליזציה המקוננת מופעלת.
לצמתים במאגרי הצמתים האלה יש את התווית nested-virtualization=enabled של צומת Kubernetes, שאפשר להשתמש בה כדי לתזמן קבוצות Pod שיוצרות מכונות וירטואליות מוטמעות.
תזמון של Pod לצומת שתומך בווירטואליזציה מקוננת
כדי לתזמן Pod בצומת שמופעלת בו וירטואליזציה בתצורה מקוננת, מוסיפים למפרט את בורר הצמתים הבא:
nodeSelector:
nested-virtualization: enabled
בנוסף, כדי שה-Pod יוכל להתחבר למכונה וירטואלית מוטמעת, צריך להגדיר את ה-Pod כבעל הרשאות על ידי הגדרת securityContext.privileged:true.