כשמנהלים אלפי משאבים ב-Kubernetes בסנכרון הגדרות, פיצול של מאגר שורש או מאגר מרחב שמות גדול לכמה מאגרים קטנים יותר עוזר לשפר את מהירות ההתאמה ולמנוע כשלים בסנכרון.
בסנכרון ההגדרות, מאגר מסונכרן מתייחס לשילוב של מאגר Git, הסתעפות, גרסה וספרייה. אם מפצלים מאגר מונוליטי לכמה אובייקטים מסוג RootSync או RepoSync, אפשר לצמצם את מספר המשאבים שכל מתאם עוקב אחריהם ומחיל אותם.
למה מאגרים גדולים גורמים לבעיות בסנכרון
אם מאגר הבסיס מכיל מספר גדול של משאבים (לדוגמה, יותר מ-5,000), יכול להיות שיהיו בעיות בביצועים או בסנכרון של סנכרון תצורות מהסיבות הבאות:
- יכול להיות שהאובייקט ResourceGroup חורג ממגבלת הגודל של אובייקט etcd. האובייקט ResourceGroup מתעד את הקבוצה, הסוג, מרחב השמות והשם של כל המשאבים במאגר Git. אם יש הרבה משאבים, יכול להיות שהאובייקט ResourceGroup יהיה גדול.
- סנכרון של מאגר גדול נמשך יותר זמן מסנכרון של מאגר קטן, כי סנכרון תצורות מחיל משאבים על האשכול באופן רציף. אם סנכרון ההגדרות לא מצליח להחיל משאב בניסיון הראשון, הוא צריך לנסות שוב.
אם נתקלתם בבעיות האלה, כדאי לפצל את מאגר הבסיס לכמה מאגרים, כך שכל מאגר בסיס ינהל פחות משאבים.
פירוק של מאגר בסיס לא מובנה
בשלבים הבאים נעשה שימוש באובייקטים של RootSync כדוגמה, אבל אפשר להחיל את השלבים האלה גם על אובייקטים של RepoSync.
1.21.0 ואילך (מומלץ)
השיטה הזו פועלת ב-סנכרון תצורות בגרסה 1.21.0 ואילך, כי בגרסה הזו נוסף finalizer שמפסיק את ניהול האובייקטים כשמוחקים אובייקט RootSync או RepoSync. בעבר, לאובייקטים מיותמים היו מטא-נתונים קבועים, שמנעו את הניהול שלהם על ידי לקוחות אחרים או אובייקטים חדשים של RootSync או RepoSync.
נניח שמאגר הבסיס מסונכרן על ידי האובייקט RootSync single-root-sync.
אחרי פיצול המאגר, יש לכם שני מאגרי שורש. אחד מסונכרן על ידי האובייקט RootSync של root-sync-1 והשני מסונכרן על ידי האובייקט RootSync של root-sync-2.
כדי לפצל את המאגר, פועלים לפי השלבים הבאים:
מוודאים של-RootSync
single-root-syncיש את ערך ההערהconfigsync.gke.io/deletion-propagation-policyשלOrphanאו שהוא לא מוגדר. ערך ברירת המחדל כשהמדיניות לא מוגדרת זהה לערך Orphan. ההגדרה הזו מבטיחה שהאובייקטים לא יימחקו.מוחקים את RootSync
single-root-sync:kubectl delete rootsync single-root-sync -n config-management-systemכדי להגדיר את המאגרים החדשים:
- יוצרים מאגר חדש או ספרייה חדשה במאגר Git הקיים.
- מעבירים את המשאבים למאגר החדש או לספרייה החדשה.
- אם אתם מפצלים את מאגר הבסיס ליותר משני מאגרים, חזרו על השלבים האלה לפי הצורך.
שומרים ודוחפים את השינוי:
git commit -am 'add configuration for the new root repository'מחילים את האובייקטים
root-sync-1ו-root-sync-2של RootSync. כך מסנכרנים את המאגר או הספרייה החדשים, כדי שהאובייקטים הקיימים באשכול ינוהלו על ידי אובייקטי RootSync החדשיםroot-sync-1ו-root-sync-2:apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured git: repo: NEW_ROOT_REPOSITORY revision: NEW_ROOT_REVISION branch: NEW_ROOT_BRANCH dir: "NEW_ROOT_DIRECTORY" auth: ROOT_AUTH_TYPE gcpServiceAccountEmail: ROOT_EMAIL # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount. secretRef: name: git-credsמחליפים את מה שכתוב בשדות הבאים:
-
NEW_ROOT_REPOSITORY: כתובת ה-URL של מאגר Git שישמש כמאגר הבסיס החדש. אפשר להזין כתובות URL באמצעות פרוטוקול HTTPS או SSH. לדוגמה, ב-https://github.com/GoogleCloudPlatform/anthos-config-management-samplesנעשה שימוש בפרוטוקול HTTPS. אם לא מזינים פרוטוקול, כתובת ה-URL נחשבת לכתובת URL מסוג HTTPS. -
NEW_ROOT_REVISION: (אופציונלי) גרסת ה-Git (תג או גיבוב) של מאגר הבסיס החדש שרוצים להוציא. -
NEW_ROOT_BRANCH: (אופציונלי) הענף של מאגר הבסיס החדש שממנו רוצים לסנכרן. -
NEW_ROOT_DIRECTORY: (אופציונלי) הנתיב במאגר Git לתיקיית השורש החדשה שמכילה את ההגדרות שרוצים לסנכרן. -
ROOT_AUTH_TYPE: הערך הזה צריך להיות זהה לאובייקט RootSync/root-sync הקיים. -
ROOT_EMAIL: הערך הזה צריך להיות זהה לאובייקט RootSync/root-sync הקיים.
-
מחכים שהאובייקט החדש של RootSync ב-
root-sync-1יסונכרן. כדי לבדוק את הסטטוס, משתמשים בפקודה הבאה:nomos status
כל הגרסאות
השיטה הזו פועלת בכל גרסה של סנכרון ההגדרות, כולל גרסה 1.21.0, אבל אנחנו ממליצים להשתמש בשיטה שזמינה בגרסה 1.21.0 ואילך כי היא דורשת פחות שלבים. אם גרסת סנכרון תצורות שלכם היא לפני 1.21.0, אתם יכולים להשתמש בשיטה הזו.
נניח שמאגר הבסיס מסונכרן על ידי האובייקט RootSync root-sync.
אחרי פיצול המאגר, יש לכם שני מאגרי שורש. אחד מסונכרן על ידי האובייקט root-sync של RootSync, והשני מסונכרן על ידי האובייקט root-sync-1 של RootSync.
כדי לפצל את המאגר, פועלים לפי השלבים הבאים:
במאגר הבסיס הקיים, בוחרים את המשאבים שרוצים להעביר למאגר או לספרייה אחרים ומוסיפים להם את ההערה
configmanagement.gke.io/managed: disabled. ההערה הזו מבטיחה שהאובייקטים הקיימים באשכול לא יושפעו כשמעבירים את ההגדרות שלהם ממאגר אחד למאגר אחר. אם אתם משתמשים בפורמט Kustomize או בתרשימי Helm, אתם יכולים לבחור בערך חצי מהבסיסים ולהוסיף את ההערה הנפוצה לקובץkustomization.yaml, כמו בדוגמה הזו:# kustomization.yaml commonAnnotations: configmanagement.gke.io/managed: disabledשומרים ודוחפים את השינוי:
sh git commit -am 'disable Config Sync management on subset of the configuration'ממתינים לסנכרון של אובייקט
root-syncRootSync הקיים באמצעות הפקודה הבאה:nomos statusכדי להגדיר את המאגר השני:
- יוצרים מאגר חדש או ספרייה חדשה במאגר Git הקיים.
- מעתיקים את המשאבים עם ההערה
configmanagement.gke.io/managed: disabledלמאגר החדש או לספרייה החדשה. - מסירים את ההערה
configmanagement.gke.io/managed: disabledבמאגר או בספרייה החדשים. - אם אתם מפצלים את מאגר הבסיס ליותר משני מאגרים, חזרו על השלבים האלה לפי הצורך.
שומרים ודוחפים את השינוי:
git commit -am 'add configuration for the new root repository'מחילים אובייקט RootSync של
root-sync-1כדי לסנכרן את המאגר או הספרייה החדשים, כך שהאובייקטים הקיימים באשכול ינוהלו על ידי אובייקט RootSync החדש שלroot-sync-1.apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: root-sync-1 namespace: config-management-system spec: sourceFormat: unstructured git: repo: NEW_ROOT_REPOSITORY revision: NEW_ROOT_REVISION branch: NEW_ROOT_BRANCH dir: "NEW_ROOT_DIRECTORY" auth: ROOT_AUTH_TYPE gcpServiceAccountEmail: ROOT_EMAIL # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount. secretRef: name: git-credsמחליפים את מה שכתוב בשדות הבאים:
-
NEW_ROOT_REPOSITORY: כתובת ה-URL של מאגר Git שישמש כמאגר הבסיס החדש. אפשר להזין כתובות URL באמצעות פרוטוקול HTTPS או SSH. לדוגמה, ב-https://github.com/GoogleCloudPlatform/anthos-config-management-samplesנעשה שימוש בפרוטוקול HTTPS. אם לא מזינים פרוטוקול, כתובת ה-URL נחשבת לכתובת URL מסוג HTTPS. -
NEW_ROOT_REVISION: (אופציונלי) גרסת ה-Git (תג או גיבוב) של מאגר הבסיס החדש שרוצים להוציא. -
NEW_ROOT_BRANCH: (אופציונלי) הענף של מאגר הבסיס החדש שממנו רוצים לסנכרן. -
NEW_ROOT_DIRECTORY: (אופציונלי) הנתיב במאגר Git לתיקיית השורש החדשה שמכילה את ההגדרות שרוצים לסנכרן. -
ROOT_AUTH_TYPE: הערך הזה צריך להיות זהה לאובייקט RootSync/root-sync הקיים. -
ROOT_EMAIL: הערך הזה צריך להיות זהה לאובייקט RootSync/root-sync הקיים.
-
מחכים שהאובייקט החדש של RootSync ב-
root-sync-1יסונכרן. כדי לבדוק את הסטטוס, משתמשים בפקודה הבאה:nomos statusמסירים את המשאבים עם ההערה
configmanagement.gke.io/managed: disabledמהמאגר המקורי. שומרים ודוחפים את השינוי:git commit -am 'remove configuration managed by the new root repository'ממתינים לסנכרון של אובייקט
root-syncRootSync הקיים באמצעות הפקודה הבאה:nomos status
פיצול מאגר בסיס היררכי
השלבים לפירוק מאגר היררכי דומים לשלבים לפירוק מאגר לא מובנה.
יש שלושה הבדלים עיקריים:
גם מאגר הבסיס החדש (או הספרייה החדשה) צריך להיות היררכי. צריך להעתיק את הספרייה הקיימת
system/ואת הספריותclusterregistry/למאגר הבסיס החדש (או לספרייה החדשה).המשאבים במרחב שמות לא יכולים להתפרס על פני כמה מאגרים. אחרת, גורמי התאמה שונים יתחרו על ניהול מרחב השמות.
האובייקט
root-sync-1RootSync צריך להשתמש ב-spec.sourceFormat: hierarchical.
אנחנו ממליצים על מאגרים לא מובְנים, לכן כדאי גם לשקול להמיר את המאגר ההיררכי למאגר לא מובְנה לפני שמפצלים אותו.