העברת אשכול משתמשים ל-Controlplane V2

במאמר הזה מוסבר איך להעביר אשכול משתמשים מגרסה 1.29 באמצעות kubeception אל Controlplane V2. אם האשכולות שלכם הם בגרסה 1.30 ומעלה, מומלץ לפעול לפי ההוראות במאמר תכנון העברת אשכול לתכונות מומלצות.

‫1.29: תצוגה מקדימה
‫1.28: לא זמין

מידע על מישורי בקרה של אשכולות משתמשים

לפני גרסה 1.13 של Google Distributed Cloud, מישור הבקרה של אשכול משתמשים פעל בצומת אחד או יותר באשכול אדמין. מישור בקרה מהסוג הזה נקרא kubeception. בגרסה 1.13, הוצג Controlplane V2 עבור אשכולות משתמשים חדשים. כש-Controlplane V2 מופעל, מישור הבקרה של אשכול המשתמשים פועל באשכול המשתמשים עצמו.

היתרונות של Controlplane V2 כוללים:

  • בידוד של כשלים. כשל באשכול אדמין לא משפיע על אשכולות משתמשים.

  • הפרדה תפעולית. שדרוג של אשכול אדמין לא גורם להשבתה של אשכולות משתמשים.

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

דרישות

כדי להעביר אשכול משתמשים ל-Controlplane V2, אשכול המשתמשים צריך לעמוד בדרישות הבאות:

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

  • ב-user cluster צריך להפעיל את Dataplane V2. השדה הזה הוא קבוע, ולכן אם Dataplane V2 לא מופעל באשכול, אי אפשר להעביר אותו ל-Controlplane V2.

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

  • בודקים את מסמך התכנון של כתובות ה-IP ומוודאים שיש מספיק כתובות IP זמינות לצמתי מישור הבקרה של אשכול המשתמשים. לצמתים של מישור הבקרה נדרשות כתובות IP סטטיות, ותצטרכו כתובת IP נוספת לכתובת IP וירטואלית (VIP) חדשה של מישור הבקרה.

הכנות להעברה

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

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

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
  get onpremusercluster USER_CLUSTER_NAME \
  -n USER_CLUSTER_NAME-gke-onprem-mgmt \
  -o jsonpath={.spec.secretsEncryption}

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

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

בדוגמה הבאה אפשר לראות פלט לא ריק:

{"generatedKeyVersions":{"keyVersions":[1]}}

השבתת ההצפנה של סודות שמופעלת תמיד ופענוח סודות אם צריך

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

  1. כדי להשבית את ההצפנה של סודות שמופעלת תמיד, מוסיפים שדה disabled: true לקטע secretsEncryption בקובץ התצורה של אשכול המשתמשים:

    secretsEncryption:
        mode: GeneratedKey
        generatedKey:
            keyVersion: KEY_VERSION
            disabled: true
    
  2. מעדכנים את האשכול:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config USER_CLUSTER_CONFIG
    

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

    • ADMIN_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול האדמין
    • USER_CLUSTER_CONFIG: הנתיב של קובץ התצורה של אשכול המשתמשים
  3. כדי לבצע עדכון בהדרגה (rolling) ב-DaemonSet ספציפי, פועלים לפי השלבים הבאים:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      rollout restart statefulsets kube-apiserver \
      -n USER_CLUSTER_NAME
  4. כדי לקבל את המניפסטים של כל הסודות באשכול המשתמשים בפורמט YAML:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
      get secrets -A -o yaml > SECRETS_MANIFEST.yaml
  5. כדי שכל הסודות יאוחסנו ב-etcd כטקסט פשוט, צריך להחיל מחדש את כל הסודות באשכול המשתמש:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
      apply -f SECRETS_MANIFEST.yaml

    עכשיו אפשר להתחיל את המיגרציה ל-Controlplane V2. אחרי שההעברה מסתיימת, אפשר להפעיל מחדש את ההצפנה של סודות בזמינות תמידית באשכול.

תיקון webhooks של עומסי עבודה שהוגדרו באופן שגוי

אם יש לכם webhooks שכוללים פודים של מערכת במרחב השמות kube-system, צריך להוסיף namespaceSelector כדי לסנן את מרחב השמות kube-system.

לדוגמה,

  namespaceSelector:
    matchExpressions:
    - key: kubernetes.io/metadata.name
      operator: NotIn
      values:
      - kube-system

עדכון קובץ התצורה של אשכול המשתמשים

מבצעים את השינויים הבאים בקובץ התצורה הקיים של אשכול המשתמשים:

  1. מגדירים את enableControlplaneV2 לערך true.

  2. אופציונלית, אפשר להגדיר זמינות גבוהה (HA) למישור הבקרה של אשכול המשתמשים Controlplane V2. כדי לשנות מאשכול ללא זמינות גבוהה לאשכול עם זמינות גבוהה, משנים את הערך של masterNode.replicas מ-1 ל-3.

  3. מוסיפים את כתובת ה-IP הסטטית (או הכתובות) של הצמתים במישור הבקרה של אשכול המשתמשים לקטע network.controlPlaneIPBlock.ips. כתובת ה-IP (או הכתובות) של הצמתים במישור הבקרה צריכה להיות באותו VLAN כמו הצמתים של העובדים. חובה לציין את שמות המארחים.

  4. ממלאים את מסכת הרשת ואת שער ברירת המחדל בקטע network.controlPlaneIPBlock.

  5. אם הקטע network.hostConfig ריק, ממלאים אותו.

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

  7. אם באשכול המשתמשים נעשה שימוש באיזון עומסים ידני, צריך להגדיר את loadBalancer.manualLB.controlPlaneNodePort ואת loadBalancer.manualLB.konnectivityServerNodePort ל-0, כי הם לא נדרשים כש-Controlplane V2 מופעל.

  8. מעדכנים את השדה loadBalancer.vips.controlPlaneVIP עם כתובת ה-IP החדשה של ה-VIP של מישור הבקרה. שימו לב שהיא צריכה להיות באותו VLAN כמו כתובות ה-IP של צומת מישור הבקרה.

  9. כל השדות הקודמים הם קבועים, אלא אם מעדכנים את האשכול לצורך ההעברה. חשוב לבדוק שוב את כל ההגדרות.

  10. מריצים את הפקודה gkectl diagnose cluster ופותרים את הבעיות שהיא מוצאת.

    gkectl diagnose cluster --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
          --cluster-name=USER_CLUSTER_NAME

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

    • ADMIN_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול האדמין.

    • USER_CLUSTER_NAME: השם של אשכול המשתמשים.

שינוי ההגדרה של מאזן עומסים ידני

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

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

  • (ingressVIP:80) -> (NEW_NODE_IP_ADDRESS:ingressHTTPNodePort)
  • (ingressVIP:443) -> (NEW_NODE_IP_ADDRESS:ingressHTTPNodePort)

עדכון האשכול

מריצים את הפקודה הבאה כדי להעביר את האשכול ל-Controlplane V2:

gkectl update cluster \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config USER_CLUSTER_CONFIG

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

  • ADMIN_CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול האדמין.

  • USER_CLUSTER_CONFIG: הנתיב של קובץ התצורה של אשכול המשתמשים.

הפקודה מבצעת את הפעולות הבאות:

  1. יוצרים את מישור הבקרה של אשכול חדש עם ControlPlane V2 מופעל.

  2. מפסיקים את מישור הבקרה של Kubernetes באשכול kubeception.

  3. מצלמים תמונת מצב של etcd של אשכול kubeception.

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

  5. משחזרים את נתוני האשכול במישור הבקרה החדש באמצעות תמונת ה-etcd שצוינה למעלה.

  6. מחברים את הצמתים של מאגר הצמתים של אשכול kubeception למישור הבקרה החדש, שאפשר לגשת אליו באמצעות controlPlaneVIP החדש.

  7. התאמה של אשכול המשתמשים המשוחזר למצב הסופי של האשכול עם ControlPlane V2 מופעל.

הערות

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

  • במהלך ההעברה, מישור הבקרה של אשכול המשתמשים מושבת למשך זמן מסוים. באופן ספציפי, מישור הבקרה לא זמין בין שלב 2 לבין סיום שלב 6. (זמן ההשבתה הוא פחות מ-7 דקות על סמך הבדיקות שלנו, אבל האורך בפועל תלוי בתשתית שלכם).

  • בסיום ההעברה, הצמתים של מישור הבקרה של אשכולות kubeception נמחקים. אם הערך של network.ipMode.type באשכול האדמין מוגדר כ-static, אפשר לעשות שימוש חוזר בחלק מכתובות ה-IP הסטטיות שלא נמצאות בשימוש. לשם כך, צריך להסיר אותן מקובץ ההגדרה של אשכול האדמין ולהריץ את הפקודה gkectl update admin. אפשר לרשום את אובייקטים של צמתים באשכול האדמין באמצעות kubectl get nodes -o wide כדי לראות אילו כתובות IP נמצאות בשימוש.

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

אחרי המיגרציה

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

  1. בקובץ התצורה של אשכול המשתמשים, מגדירים את הערך של secretsEncryption.generatedKey.disabled ל-false. לדוגמה:

    secretsEncryption:
        mode: GeneratedKey
        generatedKey:
            keyVersion: KEY_VERSION
            disabled: false
    
  2. מעדכנים את אשכול המשתמשים:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config USER_CLUSTER_CONFIG