בעזרת "סנכרון תצורות" אפשר למנוע שינויים בתצורה, כדי שמשאבי האשכול יישארו תואמים למקור האמת המרכזי. כברירת מחדל, התיקון העצמי המובנה ב-סנכרון תצורות מזהה באופן אוטומטי את הסחיפה ומבטל אותה, עם השפעה מינימלית על הביצועים של האשכול.
אם בסביבה שלכם צריך לחסום שינויים מתנגשים לפני שהאשכול מחיל אותם, אתם יכולים להפעיל את ה-webhook לאימות של סנכרון תצורות כדי למנוע חריגה מהתצורה. ה-webhook הזה מגדיל את התקורה של הזיכרון ויכול לגרום לשגיאות של חוסר בזיכרון (OOM), לכן ברוב התרחישים לדוגמה כדאי להסתמך על הריפוי העצמי המובנה.
למה לא מומלץ להשתמש במניעת חריגה
כדי לאמת בקשות, ה-webhook של הקבלה דורש שסנכרון ההגדרות יטען את סכימת OpenAPI של Kubernetes. באשכולות עם הרבה משאבים או CustomResourceDefinitions, עיבוד הסכימה הזה יכול לחרוג ממגבלות הזיכרון ולגרום לכשלים ברכיבים. ברוב תרחישי השימוש, התיקון העצמי המובנה ב"סנכרון תצורות" מספק הגנה מפני חריגה בלי סיכוני היציבות של ה-webhook. אי אפשר להשבית את התיקון העצמי המובנה.
כשהתכונה מופעלת, היא מגינה על אובייקטים מסוג RootSync כברירת מחדל. אתם יכולים להגדיר את התכונה כך שתגן על אובייקטים ב-RepoSync. כדי להשתמש במניעת שינויים, צריך להפעיל את ממשקי ה-API של RootSync ו-RepoSync. למידע נוסף, קראו את המאמר שדות RootSync ו-RepoSync.
לפני שמתחילים
אם כבר התקנתם את Google Cloud CLI, הריצו את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית.
הפעלת מניעת חריגה
אפשר להפעיל את מניעת השינויים באמצעות ה-CLI של gcloud. אי אפשר להפעיל את מניעת השינויים במסוף Google Cloud .
כדי להפעיל את מניעת החריגה, מבצעים את השלבים הבאים:
מעדכנים את מניפסט המפרט של apply כדי להגדיר את השדה
spec.configSync.preventDriftלערךtrue:applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: trueמחילים את מניפסט העדכונים:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
MEMBERSHIP_NAME: השם של החברות ב-Fleet שבחרתם כשרשמתם את האשכול. משיגים את השם באמצעות הפקודהgcloud container fleet memberships list. -
MANIFEST_NAME: השם של מניפסט המפרט להחלה, בדרך כללapply-spec.yaml. PROJECT_ID: מזהה הפרויקט.
-
ממתינים עד שהאובייקט
ValidateWebhookConfigurationשל סנכרון תצורות ייווצר על ידי ConfigManagement Operator:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.ioהפלט אמור להיראות כמו בדוגמה הבאה:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15sמבצעים שינוי חדש במקור המידע האמין שצריך לסנכרן, כדי שהפריסה של
root-reconcilerתוכל להוסיף תגובות לפעולה מאתר אחר (webhooks) לאובייקט ValidatingWebhookConfiguration של סנכרון תצורות. אפשרות אחרת היא למחוק את ה-Deployment שלroot-reconcilierכדי להפעיל התאמה. הפריסה החדשה שלroot-reconcilerתעדכן את האובייקט ValidatingWebhookConfiguration של סנכרון ההגדרות.מחכים עד ששרת ה-webhook יהיה מוכן. יומן הפריסה של ה-webhook לאימות של סנכרון תצורות צריך לכלול את
serving webhook server. הפעולה יכולה להימשך כמה דקות.kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"הפלט אמור להיראות כמו בדוגמה הבאה:
I1201 18:05:41.805531 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250 I1201 18:07:04.626199 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250
השבתת מניעת חריגה
כשמשביתים את מניעת השינויים, סנכרון ההגדרות מוחק את כל המשאבים של ה-webhook לאימות של סנכרון ההגדרות.
מכיוון שהאובייקט ValidatingWebhookConfiguration של סנכרון תצורות כבר לא קיים, המאזנים של סנכרון תצורות לא יוצרים יותר את הגדרות ה-webhook למשאבים המנוהלים.
כדי להשבית את מניעת השינויים, מבצעים את השלבים הבאים:
מעדכנים את מניפסט המפרט של apply כדי להגדיר את השדה
spec.configSync.preventDriftלערךfalse:applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: falseמחילים את מניפסט העדכונים:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
MEMBERSHIP_NAME: השם של החברות ב-Fleet שבחרתם כשרשמתם את האשכול. משיגים את השם באמצעות הפקודהgcloud container fleet memberships list. -
MANIFEST_NAME: השם של מניפסט המפרט להחלה, בדרך כללapply-spec.yaml. PROJECT_ID: מזהה הפרויקט.
-
הפעלת ה-webhook של האישור במקורות ברמת מרחב השמות
מקורות מידע מהימנים ברמת מרחב השמות לא מוגנים באופן מלא על ידי ה-webhook. למנגנון ההתאמה של סנכרון ההגדרות לכל מקור של מרחב שמות אין הרשאה לקרוא או לעדכן את האובייקטים של ValidatingWebhookConfiguration ברמת האשכול.
היעדר ההרשאה הזו גורם לשגיאה ביומנים של מתאמי מרחב השמות, בדומה לדוגמה הבאה:
Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope
אם אתם לא רוצים להשתמש בהגנה על ה-webhook למקור האמת ברמת מרחב השמות, אתם יכולים להתעלם מהשגיאה הזו. עם זאת, אם אתם רוצים להשתמש ב-webhook, תצטרכו לתת הרשאה למתאם לכל מקור מידע ברמת מרחב השמות אחרי שתגדירו סנכרון תצורות מיותר ממקור מידע אחד.
יכול להיות שלא תצטרכו לבצע את השלבים האלה אם כבר קיים RoleBinding ל-ns-reconciler-NAMESPACE עם הרשאות ClusterRole cluster-admin.
במקור האמת ברמה הבסיסית (root), מגדירים ClusterRole חדש שנותן הרשאה לתגובה לפעולה מאתר אחר (webhook) של סנכרון תצורות. צריך להגדיר את ה-ClusterRole הזה רק פעם אחת לכל אשכול:
# ROOT_SOURCE/cluster-roles/webhook-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: admission-webhook-role rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingwebhookconfigurations"] resourceNames: ["admission-webhook.configsync.gke.io"] verbs: ["get", "update"]לכל מקור ברמת מרחב השמות שצריך לתת לו הרשאה ל-webhook של בקרת הגישה, צריך להצהיר על הגדרת ClusterRoleBinding כדי לתת גישה ל-webhook של בקרת הגישה:
# ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-webhook subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: admission-webhook-role apiGroup: rbac.authorization.k8s.ioמחליפים את
NAMESPACEבמרחב השמות שבו יצרתם את המקור ברמת מרחב השמות.מבצעים את השינויים במקור האמת הבסיסי. לדוגמה, אם מסנכרנים ממאגר Git:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git pushכדי לוודא שהם נוצרו, משתמשים ב-
kubectl getכדי לוודא שנוצרו ClusterRole ו-ClusterRoleBinding:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook