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

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

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

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

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

מגבלות

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

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

  • אילוצי אחסון של StatefulSet: מכיוון ש-volumeClaimTemplates של Kubernetes לא ניתנים לשינוי, אי אפשר להרחיב את הדיסקים של ה-Pod באמצעות פקודת 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, לדוגמה 1.1.0.
  • ‫CPU_CORES: מספר ליבות ה-vCPU שיוקצו לכל pod של שרת, לדוגמה 8.
  • ‫MEMORY_LIMIT: מגבלת ה-RAM לכל pod של שרת, לדוגמה 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, לדוגמה 1.1.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.

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

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

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

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

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

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

כדי לצמצם את מספר השרתים:

  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 שמשויכות ל-Pods שהוסרו. כדי למנוע אובדן נתונים מקרי, Helm ו-Kubernetes לא מוחקים באופן אוטומטי את ה-PVC כשמצמצמים אנכית בהתאם לעומס (scale down) את ה-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 מעודכן שכולל את אזור המיקום החדש:

    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. מוסיפים את האזור החדש באמצעות ה-CLI של Spanner Omni. מחכים שהפודים של שרת הבסיס באזור החדש שנוצר ייכנסו למצב 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: רשימה מופרדת בפסיקים של נקודות קצה (endpoints) של שרתי הבסיס באזור החדש, לדוגמה 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 והעברת בלוק 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
    

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

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

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

  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, לדוגמה 1.1.0.
  2. מריצים את הפקודות כדי לתקן את ה-PVC, למחוק את ה-StatefulSet (ולהשאיר את ה-Pod של הקצה העורפי ללא שינוי) ולשדרג את פריסת 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
    

השלבים הבאים