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

החלפת זיכרון בצומת של Google Kubernetes Engine‏ (GKE) מאפשרת לצמתים של GKE להשתמש בשטח דיסק כזיכרון וירטואלי כשנגמר הזיכרון הפיזי. החלפת זיכרון של צומת יכולה לשפר את עמידות האפליקציה ולמנוע שגיאות של חוסר זיכרון (OOM) בעומסי עבודה מסוימים.

מתי כדאי להשתמש בהחלפת זיכרון של צומת

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

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

איך פועל ה-swap של הזיכרון בצומת

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

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

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

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

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

דרישות ומגבלות

אלו הדרישות והמגבלות שחלות על החלפת הזיכרון של הצומת:

  • אשכולות GKE צריכים להיות בגרסה 1.34.1-gke.1341000 ומעלה.
  • רק Pods עם מחלקת Burstable איכות שירות (QoS) יכולים להשתמש בהחלפת זיכרון של צומת. מידע נוסף על מחלקות QoS זמין במסמכי Kubernetes בנושא מחלקות איכות השירות של Pod.
  • כדי לשנות את הגודל של משאבי הזיכרון של קונטיינרים, צריך להגדיר את מדיניות שינוי הגודל של הקונטיינר ל-RestartContainer.
  • אם מגדירים החלפת זיכרון של צומת לשימוש בדיסק אתחול, גודל ההחלפה לא יכול להיות גדול מ-50% מהקיבולת הכוללת של דיסק האתחול.

אם מגדירים את החלפת הזיכרון של הצומת לשימוש ב-SSD מקומי, צריך לוודא שהדרישות הבאות מתקיימות:

  • סוג המכונה חייב לתמוך בכונני SSD מקומיים. אי אפשר להשתמש באחסון בלוקים גולמי עם כונן SSD מקומי.
  • צריך להקצות ל-Nodes כונני SSD מקומיים. שיטת ההקצאה תלויה בסדרת המכונות:
    • בסדרות מכונות מהדור הראשון או השני, מגדירים את הדגל --ephemeral-storage-local-ssd=count.
    • בסדרות מכונות מהדור השלישי או הרביעי, בוחרים סוג מכונה שכולל כונני SSD מקומיים.
  • סוג המכונה e2-medium שמוגדר כברירת מחדל לא תומך בכונני SSD מקומיים, ולכן צריך לבחור סוג מכונה אחר.
  • הוראות ליצירה או לעדכון של אשכול כדי להקצות כונני SSD מקומיים זמינות במאמר הקצאה ושימוש באחסון זמני שמגובה בכונני SSD מקומיים.

שיטות מומלצות

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

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

  • כדי לבודד צמתים שמופעל בהם החלפת זיכרון בצומת, מחילים taint על מאגר הצמתים, לדוגמה, gke-swap=enabled:NoSchedule, ומוסיפים toleration תואם לעומסי העבודה שמיועדים לשימוש בהחלפה.
  • צריך להגדיר את גודל מרחב ההחלפה של הזיכרון של הצומת בצורה מתאימה. יכול להיות שמרחב החלפה לא ימנע שגיאות OOM, ושימוש מוגזם עלול לפגוע בביצועים.
  • לעקוב אחרי השימוש בהחלפת הזיכרון של הצומת בעומסי העבודה. שימוש תכוף בהחלפת זיכרון של צומת יכול להצביע על עומס על הזיכרון.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

הפעלת החלפת זיכרון של צומת

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

linuxConfig:
  swapConfig:
    enabled: true

יש הגדרות נוספות שאפשר לקבוע. בדוגמה הזו מוגדרת החלפה לא מוצפנת לשימוש ב-30% משטח האחסון של SSD מקומי זמני:

linuxConfig:
  swapConfig:
    enabled: true
    encryptionConfig:
      disabled: true
    ephemeralLocalSsdProfile:
      swapSizePercent: 30

רשימת השדות האופציונליים שאפשר להגדיר מופיעה במאמרי העזרה של LinuxNodeConfig API.

הפעלת החלפת זיכרון של צומת באשכול

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

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

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=1.34.1-gke.1341000 \
        --system-config-from-file=system-config.yaml
    

    מחליפים את מה שכתוב בשדות הבאים:

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

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_NAME: השם של האשכול החדש.
    • LOCATION: האזור או התחום של האשכול.

הפעלת החלפת זיכרון של צומת במאגר צמתים

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

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

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --node-version=1.34.1-gke.1293000 \
        --system-config-from-file=system-config.yaml \
        --machine-type=MACHINE_TYPE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODEPOOL_NAME: השם של מאגר הצמתים החדש.
    • CLUSTER_NAME: השם של האשכול.
    • LOCATION: האזור או התחום של האשכול.
    • MACHINE_TYPE: סוג מכונה תואם. במקרה של SSD מקומי, חשוב לבחור סוג מכונה שכולל SSD מקומי, למשל n1-standard-1.
  • כדי לעדכן מאגר צמתים קיים ולהפעיל החלפת זיכרון בצמתים, מריצים את הפקודה הבאה:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODEPOOL_NAME: השם של מאגר הצמתים.
    • CLUSTER_NAME: השם של האשכול.
    • LOCATION: האזור או התחום של האשכול.

אימות ההגדרה

כדי לוודא שההחלפה של זיכרון הצומת מופעלת:

  1. מריצים את הפקודה הבאה כדי לוודא שההגדרה system-config.yaml חלה עם ההגדרות swapConfig:

    gcloud container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. מריצים את הפקודה הבאה כדי לוודא שההגדרה של kubelet קיימת בצומת:

    kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
    

מעקב אחרי השימוש בהחלפת זיכרון

אפשר לעקוב אחרי הזיכרון של הצומת באמצעות Cloud Monitoring או kubectl.

מעקב

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

  • kubernetes.io/node/memory/swap_used_bytes
  • kubernetes.io/container/memory/swap_used_bytes

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

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

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

  1. מריצים את הפקודה הבאה כדי לבדוק את התנאי SwapDetected באובייקט של הצומת:

    kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .
    

    הפלט אמור להיראות כך:

    {
      "lastHeartbeatTime": "2025-07-11T00:14:52Z",
      "lastTransitionTime": "2025-06-25T05:20:10Z",
      "message": "Swap is active: Total=49Gi Used=0B Free=49Gi",
      "reason": "SwapDetected",
      "status": "True",
      "type": "Swap"
    }
    
  2. מריצים את הפקודה הבאה כדי לבדוק את קיבולת ה-swap:

    kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'
    

    הפלט אמור להיראות כך:

    {"capacity":53687087104}
    

השבתת החלפת הזיכרון של הצומת

כדי להשבית את החלפת הזיכרון של הצומת, מעדכנים את הקובץ system-config.yaml לפי השלבים הבאים:

  1. מעדכנים את הקובץ system-config.yaml כדי להגדיר את swapConfig.enabled לערך false:

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. מעדכנים את מאגר הצמתים עם ההגדרה החדשה:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

המאמרים הבאים