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

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

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

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

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

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

כשמפעילים את החלפת הזיכרון של הצומת, 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 מקומיים.

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

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

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

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

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

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

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת 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
    

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