אפשר ליצור מכונות וירטואליות (VM) בתוך מכונות וירטואליות אחרות באמצעות וירטואליזציה מקוננת. Compute Engine מוסיף הוראות וירטואליזציה לסדרות ספציפיות של מכונות, כדי שאותן מכונות וירטואליות יוכלו ליצור מכונות וירטואליות מקוננות. מכיוון שצמתים של Google Kubernetes Engine (GKE) פועלים במכונות וירטואליות של Compute Engine, עומסי העבודה של GKE יכולים ליצור מכונות וירטואליות מוטמעות ולהשתמש בהן. במסמך הזה מוסבר איך להפעיל וירטואליזציה מקוננת ב-GKE.
איך מכונות וירטואליות מוטמעות פועלות ב-GKE
כדי להשתמש במכונות וירטואליות מוטמעות ב-GKE, צריך להפעיל וירטואליזציה מוטמעת בצמתים ספציפיים או במאגרי צמתים ספציפיים. התוספים המתאימים של וירטואליזציה של המעבד, כמו Intel Virtualization Technology (VT-x) או AMD Virtualization (AMD-V), מופעלים במכונות הווירטואליות הבסיסיות. אחר כך אפשר להפעיל את היצירה של מכונות וירטואליות מקוננות מ-Pods באמצעות תוכנה כמו QEMU או Kata Containers.
ב-GKE, מכונות וירטואליות מוטמעות שימושיות בתרחישי השימוש הבאים:
- הפעלת קוד לא מהימן כמו סוכני AI במכונות וירטואליות קלות משקל, כמו Kata Containers. מידע נוסף על תרחיש השימוש הזה זמין במאמר בנושא שימוש ב-Kata Containers בקוד פתוח עם GKE Agent Sandbox.
- הוספת שכבת בידוד בעזרת חומרה לעומסי עבודה של כמה דיירים.
- להריץ תוכנות ייעודיות כמו אמולטורים של Android בענן.
ההשלכות על הביצועים פחות משמעותיות
בעזרת וירטואליזציה מקוננת עם שיפור מהירות באמצעות חומרה, יכול להיות שיהיה שיפור בביצועים של עומסי העבודה שפועלים במכונות הווירטואליות המקוננות, בהשוואה להגדרות של וירטואליזציה לא מקוננת. ההשפעה על הביצועים תלויה בפרופיל העומס הספציפי, כולל מאפייני השימוש בזיכרון ובקלט/פלט.
בנוסף, יצירת מכונות וירטואליות מוטמעות במכונות הווירטואליות הבסיסיות של צמתי GKE עשויה להשפיע על הביצועים של עומסי עבודה אחרים שפועלים בצמתים האלה.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שמדיניות הארגון תומכת ביצירת מכונות וירטואליות מוטמעות.
- בודקים את המגבלות של מכונות וירטואליות מקוננות.
דרישות ומגבלות
כדאי להביא בחשבון את הפרטים הבאים לפני שמפעילים וירטואליזציה מקוננת ב-GKE ומאפשרים ל-Pods ליצור מכונות וירטואליות מקוננות:
- אפשר להגדיר מאגרי צמתים עם מכונות וירטואליות מוטמעות רק עם מספר מוגבל של סדרות מכונות וירטואליות. כדי לוודא אילו סדרות מכונות נתמכות, אפשר לעיין בשורה Nested virtualization בהשוואה בין סדרות מכונות.
- אין תמיכה בווירטואליזציה מקוננת במאגרי צמתים של Windows Server.
- אי אפשר להשתמש בווירטואליזציה מקוננת אם האילוץ השבתת וירטואליזציה מקוננת של מכונות וירטואליות נאכף במדיניות הארגון.
- כדי ש-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 וירטואליות מסוג Spot, עובר למכונות C4 וירטואליות לפי דרישה, ואז למכונות C4D וירטואליות מסוג 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 .
- קובעים את ההגדרות הבסיסיות של האשכול.
- בתפריט הניווט, בקטע Node pools, מרחיבים את הקטע default-pool ולוחצים על Nodes.
- בקטע Machine configuration בוחרים סוג מכונה נתמך (אפשר לראות את האפשרויות בשורה Nested virtualization).
- אחרי הקטע Reservations, מסמנים את תיבת הסימון Enable nested virtualization.
- כדי ליצור את האשכול, לוחצים על Create.
כדי להפעיל וירטואליזציה מקוננת למאגר צמתים חדש באשכול קיים:
נכנסים לדף Kubernetes clusters במסוף Google Cloud .
לוחצים על השם של האשכול שבו רוצים ליצור את מאגר הצמתים החדש.
מגדירים את מאגר הצמתים.
לוחצים על הכרטיסייה Nodes (צמתים).
בכותרת של הקטע Node pools, לוחצים על add_box Create user-managed node pool.
בתפריט הניווט, לוחצים על Nodes (צמתים).
בקטע Machine configuration, בוחרים סדרת מכונות שתומכת בווירטואליזציה מקוננת. למידע נוסף, אפשר לסנן את טבלת ההשוואה של סדרות המכונות לפי המאפיין 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.