שינוי גודל של פריסת Kubernetes

סביבות Kubernetes מאפשרות לכם לשנות את גודל משאבי מסד הנתונים באופן דינמי בהתאם לשינויים בעומס העבודה. אם פרסתם את Spanner Omni באמצעות תרשים Helm, תוכלו להשתמש בהליכי ההרחבה האלה.

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

לפני שמגדילים את פריסת Kubernetes, צריך לבצע את הפעולות הבאות:

כשיטה מומלצת, מומלץ להרחיב אנכית בהתאם לעומס (scale up) עד ל-32 GB לפחות של זיכרון לכל שרת, לפני שמוסיפים עוד שרתים כדי להרחיב אופקית בהתאם לעומס (scale out).

מגבלות

יש כמה מגבלות לגבי שינוי קנה מידה ב-Kubernetes:

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

  • מגבלות אחסון של StatefulSet: מכיוון ש-Kubernetes‏ volumeClaimTemplates הם בלתי ניתנים לשינוי, אי אפשר להרחיב את הדיסקים של הפוד באמצעות פקודה אחת של helm upgrade. במקום זאת, כדי להגדיל או להקטין את נפח האחסון צריך לבצע שלבים ידניים להרחבת נפח.

שינוי גודל אנכי

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

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set resources.cpu=CPU_CORES \
  --set resources.memory=MEMORY_LIMIT \
  -n NAMESPACE

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

  • HELM_CHART_PATH: הנתיב לתרשים Helm, לדוגמה, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: הגרסה של תרשים Helm, למשל 0.2.0.
  • CPU_CORES: מספר ליבות ה-vCPU להקצאה לכל פוד של שרת, לדוגמה, 8.
  • MEMORY_LIMIT: מגבלת ה-RAM לכל פוד של שרת, לדוגמה, 32Gi.
  • NAMESPACE: מרחב השמות של Kubernetes של הפריסה, לדוגמה, spanner-ns.

שינוי גודל אופקי

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

הוספת שרתים שאינם שרתי הבסיס

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

שינוי גודל אחיד

כדי לשנות את גודל כל אזור בפריסה ל-15 שרתים, מריצים את הפקודה הבאה:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set deployment.replicasPerZone=REPLICAS \
  -n NAMESPACE

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

  • HELM_CHART_PATH: הנתיב לתרשים Helm, לדוגמה oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: הגרסה של תרשים Helm. לדוגמה, 0.2.0.
  • REPLICAS: מספר היעד של העתקי השרת לכל אזור, לדוגמה 15.
  • NAMESPACE: מרחב השמות של Kubernetes – לדוגמה, spanner-ns.

שינוי הגודל של אזור ספציפי

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

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set locations[0].zones[0].replicas=REPLICAS \
  -n NAMESPACE

מחליפים את REPLICAS במספר העותקים המשוכפלים של אזור היעד – לדוגמה, 15.

כדי לוודא שהשרתים החדשים הצטרפו בהצלחה לפריסה, מריצים שאילתה ב-Spanner Omni CLI כדי להציג רשימה של שרתי הפריסה או מעיינים בלוח הבקרה של Grafana.

spanner deployment servers list \
  --zone=ZONE \
  --deployment-endpoint=ENDPOINT

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

  • ZONE: האזור שרוצים להציג. לדוגמה, us-central1-a.
  • ENDPOINT: נקודת הקצה החיצונית של הפריסה, לדוגמה ${ENDPOINT}:15000.

הסרת שרתים שאינם שרתי בסיס

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

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

  1. כדי לזהות שרתים שאפשר להסיר, מציגים את השרתים באזור:

    spanner deployment servers list \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    פלט לדוגמה:

    NAME                                                          HOST                        PORT_BASE  ROOT  STATE
    zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000  spanner-a-0.pod.spanner-ns  15000      true  -
    zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000  spanner-a-1.pod.spanner-ns  15000      -     -
    

    מוחקים את השרת שהוצא משימוש שאינו שרת הבסיס עם האינדקס הגבוה ביותר (לדוגמה, spanner-a-1.pod.spanner-ns:15000):

    spanner deployment servers delete SERVER_NAME \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    מחליפים את SERVER_NAME במזהה השרת, לדוגמה, spanner-a-1.pod.spanner-ns:15000.

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

  2. מצמצמים את הפריסה של Helm על ידי הפעלת פקודת שדרוג של Helm כדי להתאים למספר העותקים המשוכפלים הרצוי. לדוגמה, כדי להקטין את מספר הרפליקות לכל אזור ל-1 פוד, מריצים את הפקודה הבאה:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set deployment.replicasPerZone=REPLICAS \
      -n NAMESPACE
    

    מחליפים את REPLICAS במספר העותקים המעודכן, לדוגמה, 1.

  3. מוחקים את התביעות לנפח אחסון מתמיד (PVC) של Kubernetes שמשויכות לקבוצות ה-Pod שהוסרו. כדי למנוע אובדן נתונים בטעות, Helm ו-Kubernetes לא מוחקים אוטומטית PVCs כשמצמצמים את קנה המידה של StatefulSet. כדי לפנות את האחסון לחלוטין, צריך למחוק ידנית את ה-PVC:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    לדוגמה, כדי למחוק את היומנים ואת נפחי הנתונים של spanner-a-1 במרחב השמות spanner-ns:

    kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
    

הוספת אזור

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

לדוגמה, הפקודה הבאה מאתחלת פריסה פעילה של אזור יחיד ב-Google Kubernetes Engine ‏ (GKE) באזור us-east1-b באזור us:

helm upgrade --install spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --set resources.cpu=2 \
  --set resources.memory=8Gi \
  --set global.platform=gke \
  --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
  -n NAMESPACE

כדי להוסיף את האזור us-east1-c להגדרות האלה, מבצעים את השלבים הבאים:

  1. מריצים את הפקודה helm upgrade ומעבירים בלוק JSON מעודכן שכולל את אזור המיקום החדש כדי להפעיל את ה-pods באזור החדש:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \
      -n NAMESPACE
    
  2. מוסיפים את האזור החדש באמצעות Spanner Omni CLI. ממתינים עד שה-pods של שרת הבסיס באזור החדש שנוצר יעברו למצב Running ויהיו מוכנים. לאחר מכן, מריצים את הפקודה ליצירת אזור:

    spanner deployment zones create NEW_ZONE \
      --location=LOCATION \
      --root-servers=ROOT_SERVERS_LIST \
      --deployment-endpoint=ENDPOINT
    

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

    • NEW_ZONE: המזהה של האזור שרוצים להוסיף, לדוגמה us-east1-c.
    • LOCATION: מיקום הפריסה, לדוגמה us.
    • ROOT_SERVERS_LIST: רשימה מופרדת בפסיקים של נקודות קצה של שרתי הבסיס באזור החדש – לדוגמה, spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000.
    • ENDPOINT: נקודת הקצה של הפריסה החיצונית, לדוגמה, ${ENDPOINT}:15000.
  3. ממתינים לסיום יצירת האזור. שכפול של סכימות וטבלאות קיימות במסד נתונים לאזור חדש לוקח זמן. כדי לעקוב אחרי התקדמות הסנכרון של האזורים, מריצים את הפקודה הבאה כדי להציג את אזורי הפריסה:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

הסרת אזור

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

כדי להסיר את האזור us-east1-c שנוצר בקטע הקודם, מבצעים את השלבים הבאים:

  1. מוחקים את האזור ומפעילים את פירוק האזור ב-Spanner Omni:

    spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT
    

    מחליפים את ZONE באזור שרוצים להסיר – לדוגמה, us-east1-c.

  2. מוודאים שהאזור הוסר. מריצים פקודת רשימה וממתינים עד שהאזור לא מופיע יותר בפלט:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. כדי להסיר את השרתים מאשכול Kubernetes, מריצים פקודת helm upgrade ומעבירים בלוק JSON מעודכן של מיקומים שלא כולל את האזור שהוסר:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
      -n NAMESPACE
    

הגדלת נפח האחסון

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

כדי להגדיל את נפח האחסון בדיסק, פועלים לפי השלבים הבאים:

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

    NEW_SIZE="NEW_SIZE"
    NAMESPACE="NAMESPACE"
    RELEASE_NAME="spanner-omni"
    STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3"
    HELM_CHART_PATH="HELM_CHART_PATH"
    VERSION="VERSION"
    

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

    • NEW_SIZE: גודל קיבולת האחסון של היעד, לדוגמה, 200Gi.
    • NAMESPACE: מרחב השמות של Kubernetes – לדוגמה, spanner-ns.
    • STATEFULSET_NAME_1,‏ STATEFULSET_NAME_2...: השמות של StatefulSets בפריסה, בדרך כלל בהתאם לשמות הקצרים של האזורים (לדוגמה, spanner-east-b spanner-east-c).
    • HELM_CHART_PATH: הנתיב לתרשים Helm, לדוגמה, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
    • VERSION: הגרסה של תרשים Helm – לדוגמה, 0.2.0.
  2. מריצים את הפקודות כדי לתקן את ה-PVC, למחוק את ה-StatefulSets (כך שה-pods של ה-backend יישארו ללא שינוי) ולשדרג את פריסת ה-Helm:

    # Patch all associated PVCs directly.
    for pvc in $(kubectl get pvc -n $NAMESPACE \
      -l app.kubernetes.io/instance=$RELEASE_NAME \
      -o name | grep "data-volume"); do
      kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}"
    done
    
    # Delete the StatefulSet while leaving backend pods intact (orphan cascade).
    kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan
    
    # Run Helm upgrade to align the templates with the expanded size.
    helm upgrade $RELEASE_NAME $HELM_CHART_PATH \
      --version $VERSION \
      --reuse-values \
      --set storage.data.size=$NEW_SIZE \
      -n $NAMESPACE
    

השלבים הבאים