הגדרת אשכולות ואובייקטים בהיקף האשכול

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

הגדרת אשכולות ואובייקטים בהיקף האשכול

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

הגדרה של CustomResourceDefinitions

בעזרת סנכרון תצורות אפשר לסנכרן CustomResourceDefinitions (CRDs) באותו אופן שבו מסנכרנים כל משאב אחר. יש כמה דברים שכדאי לזכור כשמסנכרנים CRD:

  • העדכונים של CRD ושל CustomResources התואמים לא מתבצעים בסדר צפוי. אם משנים CRD ואת CustomResources התואם באותו קומיט, אין לצפות שעדכוני CRD יתרחשו לפני עדכוני Custom Resource. יכול להיות שבגלל זה nomos status ידווח על שגיאה זמנית למשך תקופה קצרה, עד שגם CustomResource וגם CRD יהיו קיימים באשכול.

  • ‫סנכרון תצורות לא מאפשר הסרה של CRD אם יש CustomResource במאגר שתלוי בו. כדי להסיר CRD, צריך גם להסיר את CustomResource שלו. מומלץ להסיר את שניהם באותו קומיט למאגר.

  • אתם יכולים לסנכרן CustomResource בלי לסנכרן את ה-CRD שלו, כל עוד אתם יכולים להבטיח שה-CRD כבר קיים באוסף.

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

כברירת מחדל, סנכרון תצורות מחיל הגדרה על כל אשכול רשום. עם זאת, אם אתם צריכים להחיל הגדרה רק על קבוצת משנה של אשכולות, אתם יכולים להוסיף הערה מסוג cluster-name-selector או הגדרה מסוג ClusterSelector למאגר שלכם.

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

אובייקט ClusterSelector תומך בבחירת אשכולות לפי תוויות, אבל הוא דורש הגדרות מורכבות יותר.

הגדרה באמצעות ההערה cluster-name-selector

אפשר להחיל הגדרה על קבוצת משנה של אשכולות באמצעות ההערה configsync.gke.io/cluster-name-selector. אפשר להשתמש בהערה הזו כדי להחיל הגדרה על קבוצה של אשכולות, שמסומנים בשמות האשכולות. הערך של ההערה הוא רשימה מופרדת בפסיקים של שמות אשכולות יעד. אפשר להחיל את ההערה על אובייקטים בהיקף האשכול ואובייקטים בהיקף מרחב השמות. אובייקטים של מרחב שמות נבחרים כשההערה תואמת לשם האשכול וכשמרחב השמות שאליו משתייכים האשכולות נבחר גם הוא.

בחירת אשכול יחיד

ההגדרה הבאה יוצרת תפקיד בשם namespace-reader שמגדיר קבוצה של הרשאות לקריאת מרחבי שמות. התפקיד הזה חל רק על האשכול ששמו cluster-1.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

בחירת רשימת אשכולות

ההגדרה הבאה יוצרת את אותו תפקיד כמו בדוגמה הקודמת, אבל התפקיד הזה חל רק על האשכולות עם השם cluster-1, cluster-2 או cluster-3.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1,cluster-2,cluster-3
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

הגדרה באמצעות האובייקט ClusterSelector

‫ClusterSelector הוא סוג מיוחד של הגדרה שמשתמשת ב-labelSelectors של Kubernetes. אפשר להשתמש ב-ClusterSelector כדי להגביל את האשכולות שבהם חל קובץ הגדרה מסוים, על סמך התוויות של האשכול. אפשר גם להשתמש ב-ClusterSelectors כדי להגביל את האשכולות שיוצרים אובייקט בהיקף של מרחב שמות.

בדומה ל-labelSelectors אחרים, ‏ ClusterSelectors פועלים לפי לוגיקת AND. מכיוון ש-ClusterSelectors משתמשים בלוגיקה של AND, אובייקטים נבחרים רק אם הם תואמים לכל התוויות שאתם מגדירים.

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

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

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

הוספת תוויות לאשכול

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

כדי להחיל הגדרות על אשכול, הערך בשדה metadata.name של הגדרת האשכול צריך להיות זהה לערך בשדה clusterName של אובייקט ConfigManagement.

בדוגמה הבאה של הגדרת אשכול, מוצהר של-cluster-2 יש את התוויות environment: prod ו-location: central.

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central

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

יצירת ClusterSelector

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

ה-ClusterSelector הבא בוחר רק אשכולות עם התווית environment: prod.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod

ה-ClusterSelector הבא בוחר כל אשכול עם התוויות location: central או location: west.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-central-or-west
spec:
  selector:
    matchExpressions:
      - key: location
        operator: In
        values:
        - central
        - west 

ל-ClusterSelector אין השפעה עד שמפנים אליו בהגדרה אחרת.

הפניה ל-ClusterSelector

כדי להפנות ל-ClusterSelector בהגדרה אחרת, מגדירים את ההערה configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME.

ההגדרה הבאה יוצרת ClusterRole בשם namespace-reader שמגדיר קבוצת הרשאות לקריאת מרחבי שמות. ה-ClusterRole הזה מופעל רק באשכולות שתואמים ל-selector-env-prod ClusterSelector.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader
  annotations:
    configmanagement.gke.io/cluster-selector: selector-env-prod
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

הגבלת האשכולות שההגדרה בהיקף מרחב השמות משפיעה עליהם

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

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

הגדרת האשכול הבאה מוסיפה תווית location: france לאשכול שנקרא cluster-1:

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-1
  labels:
    location: france

יוצרים הגדרת ClusterSelector שמפנה לתוויות שרוצים לבחור. ההגדרה הבאה של ClusterConfig בוחרת את התווית location: france:

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-location-france
spec:
  selector:
    matchLabels:
      location: france

ל-ClusterSelector אין השפעה עד שמפנים אליו בהגדרה אחרת. ההגדרה הבאה של RoleBinding בוחרת רק אשכולות שתואמים ל-selector-location-france ClusterSelector. ההגדרה הזו יכולה להיות שימושית, למשל, אם הנחיית תאימות מאפשרת רק לחשבון שירות מסוים להציג מידע על אשכולות באזור הגיאוגרפי שמוגדר לו.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: viewers
  annotations:
    configmanagement.gke.io/cluster-selector: selector-location-france
subjects:
- kind: Group
  name: system:serviceaccounts:foo
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

אם מציבים את ההגדרה הזו במרחב שמות מופשט או בספריית מרחב שמות, כמו namespaces/eng, היא חלה על מרחבי השמות שמקבלים אותה בירושה, אבל רק באשכולות עם התווית location: france.

המאמרים הבאים