שינוי משאבים במהלך השחזור

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

במאמר שינוי משאבים במהלך שחזור מוסבר על כללי החלפה.

סקירה כללית

יכולות להיות כמה סיבות לכך שתרצו לשנות את משאבי Kubernetes כחלק מתהליך השחזור:

  • יכול להיות שתרצו ליצור PersistentVolumeClaim ‏(PVC) באמצעות מנהל הקצאות (provisioner) אחסון אחר. לדוגמה, אתם רוצים לעבור ממנהל ההתקן של Kubernetes in-tree למנהל ההתקן של CSI.

  • יכול להיות שתרצו לשחזר מרחב שמות בשם אחר.

  • יכול להיות שתרצו להוסיף, לשנות או למחוק את הערך שמשויך לתווית או למפתח ConfigMap.

  • יכול להיות שתרצו לשנות את מספר הרפליקות ב-Deployment או ב-StatefulSet.

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

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

  1. הכללים מאורגנים ברשימה ממוספרת.

  2. כל המשאבים – חוץ ממשאבי CustomResourceDefinition, שלא זמינות לגביהם טרנספורמציות – שרוצים לשחזר עוברים ברשימת הכללים הזו לפי הסדר.

  3. כל כלל מכיל תיאור קצר, קריטריונים להתאמה ועריכות של משאבים.

  4. אם משאב לא עומד בקריטריונים של כלל מסוים, הוא עובר לכלל הבא ברשימה ללא שינוי.

  5. אם משאב תואם לקריטריונים של כלל, השינויים של הכלל יחולו על המשאב לפני שהוא יעבור לכלל הבא ברשימה.

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

  7. הגרסה הסופית של המשאב, אחרי שכל העריכות של כלל ההתאמה יושמו, היא מה שנוצר באשכול.

פרמטרים של כללי טרנספורמציה

כדי ליצור כלל המרה, צריך לספק את הפרטים הבאים:

  • description: תיאור קצר של כלל השינוי.

  • resourceFilter: המסנן הזה משמש להתאמה למשאבים. אם לא מציינים resourceFilter, כל המשאבים תואמים לכלל הזה.

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

מסנן משאבים (resourceFilter)

כדי להגדיר מסנן משאבים, צריך לספק את הפרמטרים הבאים:

פרמטר חובה תיאור
namespaces אופציונלי זו רשימה של מרחבי שמות. כדי שמשאב יתאים לכלל הזה, הוא צריך להיות משאב עם מרחב שמות, וצריך להיות לו אחד ממרחבי השמות שצוינו. אם לא מספקים ערך לפרמטר הזה, כל המשאבים יתאימו (כל המשאבים עם מרחב שמות וכל המשאבים בהיקף האשכול).
groupKinds אופציונלי זו רשימה של טפלים של משאבי Kubernetes:‏ Group/Kind:
  • אם לא מציינים ערך לפרמטר הזה, כל המשאבים יתאימו ללא הגבלות על סמך Group/Kind.
  • אם מספקים ערך אחד או יותר של Group/Kind, המשאבים צריכים להתאים לאחד מהם כדי שהם יתאימו לכלל.
  • כדי להתאים למשאבי ליבה, משתמשים בקבוצה ריקה ("").
jsonPath אופציונלי זהו ביטוי JSONPath שמשמש להתאמה למשאבים.

‫JSONPath (jsonPath)

ביטוי JSONPath משמש להתאמה למשאבים. אם התוצאה של הביטוי לא ריקה ביחס למשאב, המשאב הזה נחשב כמשאב שתואם לביטוי.

בהתבסס על המשאב הבא:

YAML

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
  labels:
    app: mysql
    app.kubernetes.io/name: mysql
data:
  primary.cnf: |
    # Apply this config only on the primary.
    [mysqld]
    log-bin
  replica.cnf: |
    # Apply this config only on replicas.
    [mysqld]
    super-read-only

JSON

{
  "apiVersion": "v1",
  "kind": "ConfigMap",
  "metadata": {
    "name": "mysql-cm",
    "labels": {
      "app": "mysql",
      "app.kubernetes.io/name": "mysql"
    }
  },
  "data": {
    "primary.cnf": "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n",
    "replica.cnf": "# Apply this config only on replicas.\n[mysqld]\nsuper-read-only\n"
  }
}

דוגמה לשימוש בביטויי JSONPath:

Expression תיאור תוצאה
.metadata[?(@.name == 'mysql-cm')] האובייקט metadata מכיל את המפתח name והערך שלו הוא mysql-cm [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] ערך המחרוזת של המפתח app.kubernetes.io/name בקטע metadata.labels [
 "mysql"
]
.data['primary\.cnf'] ערך האובייקט של המפתח primary.cnf בקטע data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] האובייקט metadata מכיל את המפתח name והערך שלו תואם לביטוי הרגולרי '/^mysql-.*/i'.
הלוכסנים / משמשים לתיחום של תבנית הביטוי הרגולרי. הסימון i בסוף הביטוי הרגולרי הוא הדגל להתאמה לא תלוית-רישיות.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

כל עוד הפלט של ביטוי JSONPath לא ריק, המשאב התואם יתאים לכלל הזה. לכן, .metadata[?(@.name == 'mysql-cm')] ו-.metadata[?(@.name == 'mysql-cm')].name יניבו את אותה תוצאת התאמה, שהיא התאמה למשאב שערך .metadata.name שלו הוא "mysql-cm".

כשמשתמשים במסנן ב-JSONPath כדי להתאים למפתח במפה במסוף Google Cloud , צריך להוסיף escape ל-. (נקודה) באמצעות \ (קו נטוי הפוך). אם JSONPath מסופק בהקשר של YAML באמצעות ה-CLI של gcloud או Terraform Language, צריך להשתמש ב-\\ (שני לוכסנים הפוכים). לדוגמה, .metadata.labels['app\.kubernetes\.io/name'] שווה ל-.metadata.labels['app\\.kubernetes\\.io/name'] ב-YAML או ב-Terraform.

מומלץ להשתמש בכלי להערכת JSONPath עם תמיכה בביטויים רגולריים כדי לבדוק את הביטוי לפני השימוש בו. אפשר גם להשתמש ב-kubectl כדי לאמת את התוצאה של ביטויי JSONPath. דוגמאות נוספות זמינות במאמר בנושא תמיכה ב-JSONPath.

פעולה בשדה (fieldActions)

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

  • path: ערך של JSON Pointer שמפנה למיקום במשאבי היעד שבו הפעולה מתבצעת. מצביעי JSON תמיד מתחילים ב-/ (קו נטוי), ושמות המאפיינים (המפתחות) יורדים לרכיבי צאצא שגם הם מופרדים ב-/ (קו נטוי).

  • op: זהו סוג הפעולה שבוצעה על משאבים. יש תמיכה בחמש פעולות:

    • add מוסיף אובייקט או ערך חדש ל-path שצוין, בהתאם למה ש-path מפנה אליו.
    • remove מסיר את הערך מהמאפיין path שצוין.
    • הפונקציה replace מחליפה את הערך בpath שצוין בערך חדש.
    • move מסיר את הערך ממיקום מסוים ומוסיף אותו ל-path שצוין.
    • הפונקציה copy מעתיקה את הערך ממיקום אל path שצוין.

אפשר למצוא דוגמאות לכל פעולה באמצעות הגדרת ה-Pod הבאה:

YAML

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

JSON

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx",
    "namespace": "ns",
    "labels": {
      "app": "nginx"
    }
  },
  "spec": {
    "containers": [
      {
        "name": "nginx",
        "image": "nginx:latest",
        "ports": [
          {
            "containerPort": 80
          }
        ],
        "env": [
          {
            "name": "PROTOCOL",
            "value": "https"
          }
        ],
        "resources": {
          "limits": {
            "cpu": "250m",
            "memory": "64Mi"
          }
        }
      }
    ],
    "initContainers": [
      {
        "name": "install",
        "image": "busybox:stable",
        "command": [
          "wget",
          "-O",
          "/tmp/index.html",
          "http://info.cern.ch"
        ]
      }
    ]
  }
}

הוספה

הפרמטר value נדרש תמיד לפעולות add, והוא חייב להיות רכיב JSON חוקי.

הפעולה הבאה מוסיפה משתנה סביבה חדש "PORT" עם הערך "80" למאגר התגים nginx.

op: add
path: "/spec/containers/0/env/0"
value: >
  {
    "name": "PORT",
    "value": "80"
  }

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    - name: PORT  # newly added
      value: "80"  # newly added
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הפעולה הבאה מוסיפה ערך לתווית חדשה app.kubernetes.io/name: nginx ל-Pod.

op: add
path: "/metadata/labels/app.kubernetes.io~1name"
value: "nginx"

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
    app.kubernetes.io/name: nginx  # newly added
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הפעולה הבאה מחליפה את התמונה של קונטיינר nginx כדי לשנות אותה מ-"nginx:latest" ל-"nginx:stable".

op: add
path: "/spec/containers/0/image"
value: nginx:stable

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:stable  # replaced
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הסרה

הפעולה הבאה מסירה את דרישות המשאבים של מאגר התגים nginx.

op: remove
path: "/spec/containers/0/resources"

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    # resource requirements are removed
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

החלפה

הפרמטר value נדרש לפעולה replace, והוא חייב להיות רכיב JSON.

הפעולה הבאה מחליפה את התמונה של קונטיינר nginx מ-nginx:latest ל-nginx:stable.

op: replace
path: "/spec/containers/0/image"
value: nginx:stable

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:stable  # replaced
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

העברה

נדרש fromPath כדי להפעיל את move.

הפעולה הבאה מסירה משתני סביבה מהקונטיינר nginx ומוסיפה אותם לקונטיינר install init.

op: move
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    #  "env" is moved to "install" container
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch
    env:  # moved "from" nginx container
    - name: PROTOCOL
      value: https

העתקה

נדרש fromPath כדי להפעיל את copy.

הפעולה הבאה מעתיקה משתני סביבה מהקונטיינר nginx לקונטיינר install של init.

op: copy
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

מקורי

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

הומר

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch
    env:  # copy from "nginx" container
    - name: PROTOCOL
      value: https

מידע נוסף על הגדרת כללי טרנספורמציה ב Google Cloud מסוף זמין במאמר תכנון של סדרת שחזורים.

כדי להגדיר כללי טרנספורמציה באמצעות ה-CLI של gcloud, יוצרים קובץ שמכיל מערך YAML של transformationRules וכוללים את הפרמטר --transformation-rules-file= בפקודה gcloud beta container backup-restore restore-plans create.

דוגמאות לכללי שינוי

הדוגמאות הבאות מוצגות בפורמט YAML שמשמש את ה-CLI של gcloud או את שפת ההגדרות של Terraform.

שינוי StorageClass של PVC

בדוגמה הזו, המערכת משנה את StorageClass בכל משאבי PersistentVolumeClaim ששוחזרו מ-standard ל-premium-rwo:

YAML

transformationRules:
- description: Change StorageClass in PVC from standard to premium-rwo
  resourceFilter:
    namespaces: []
    jsonPath: ".spec[?(@.storageClassName == 'standard')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: PersistentVolumeClaim
  fieldActions:
  - op: REPLACE
    path: "/spec/storageClassName"
    value: "premium-rwo"

Terraform

transformation_rules {
  description = "Change StorageClass in PVC from standard to premium-rwo"
  resource_filter {
    json_path = ".spec[?(@.storageClassName == 'standard')]"
    group_kinds {
      resource_kind = "PersistentVolumeClaim"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/storageClassName"
    value = "premium-rwo"
  }
}

שכפול מרחב שמות

בדוגמה הזו משכפלים מרחב שמות מ-alpha ל-beta – יוצרים מרחב שמות חדש "beta" ומשחזרים את כל המשאבים מ-"alpha" למרחב השמות החדש "beta". בדוגמה הזו נדרשים שני כללי טרנספורמציה – אחד למרחב השמות עצמו ואחד למשאבים בתוך מרחב השמות.

YAML

transformationRules:
- description: Rename namespace name from alpha to beta
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name == 'alpha')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Namespace
  fieldActions:
  - op: REPLACE
    path: "/metadata/name"
    value: "beta"
- description: Clone all resources from namespace alpha to beta
  resourceFilter:
    namespaces: ["alpha"]
  fieldActions:
  - op: REPLACE
    path: "/metadata/namespace"
    value: "beta"

Terraform

transformation_rules {
  description = "Rename namespace name from alpha to beta"
  resource_filter {
    json_path = ".metadata[?(@.name == 'alpha')]"
    group_kinds {
      resource_kind = "Namespace"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/name"
    value = "beta"
  }
}
transformation_rules {
  description = "Clone all resources from namespace alpha to beta"
  resource_filter {
    namespaces = ["alpha"]
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/namespace"
    value = "beta"
  }
}

שינוי StorageClass של PVCs ומספר העותקים המשוכפלים במרחב שמות משוכפל

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

  • שינוי ה-StorageClass ב-PVC מ-standard ל-premium-rwo

  • שינוי מספר העותקים של הפריסה nginx ל-3

YAML

transformationRules:
- description: Rename the namespace from alpha to beta
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name == 'alpha')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Namespace
  fieldActions:
  - op: REPLACE
    path: "/metadata/name"
    value: "beta"
- description: Change all resources from namespace alpha to beta
  resourceFilter:
    namespaces: ["alpha"]
  fieldActions:
  - op: REPLACE
    path: "/metadata/namespace"
    value: "beta"
- description: Change the StorageClass on PVCs from standard to premium-rwo
  resourceFilter:
    namespaces: ["beta"]
    jsonPath: ".spec[?(@.storageClassName == 'standard')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: PersistentVolumeClaim
  fieldActions:
  - op: REPLACE
    path: "/spec/storageClassName"
    value: "premium-rwo"
- description: Change the replica count of the Deployment nginx from 7 to 3
  resourceFilter:
    namespaces: ["beta"]
    jsonPath: ".metadata[?(@.name == 'nginx')]"
    groupKinds:
    - resourceGroup: apps
      resourceKind: Deployment
  fieldActions:
  - op: REPLACE
    path: "/spec/replicas"
    value: "3"

Terraform

transformation_rules {
  description = "Rename the namespace from alpha to beta"
  resource_filter {
    json_path = ".metadata[?(@.name == 'alpha')]"
    group_kinds {
      resource_kind = "Namespace"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/name"
    value = "beta"
  }
}
transformation_rules {
  description = "Change all resources from namespace alpha to beta"
  resource_filter {
    namespaces = ["alpha"]
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/namespace"
    value = "beta"
  }
}
transformation_rules {
  description = "Change the StorageClass on PVCs from standard to premium-rwo"
  resource_filter {
    namespaces = ["beta"]
    json_path = ".spec[?(@.storageClassName == 'standard')]"
    group_kinds {
      resource_kind = "PersistentVolumeClaim"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/storageClassName"
    value = "premium-rwo"
  }
}
transformation_rules {
  description = "Change the replica count of the Deployment nginx from 7 to 3"
  resource_filter {
    namespaces = ["beta"]
    json_path = ".metadata[?(@.name == 'nginx')]"
    group_kinds {
      resource_group = "apps"
      resource_kind = "Deployment"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/replicas"
    value = "3"
  }
}

שינוי, הוספה והסרה של רשומות ConfigMap

בדוגמה הזו משנים את ConfigMap שמכיל את מפתח התווית "app.kubernetes.io/name" במרחב השמות "mysql" ל:

  • משנים את הערך של הרשומה "endpoint" ל-"192.0.2.127".

  • הוספה של רשומה חדשה "connection-timeout" עם הערך "30s".

  • הסרת הרשומה עם המפתח "read-timeout".

YAML

transformationRules:
- description: Change, insert, remove `ConfigMap` entres
  resourceFilter:
    namespaces: ["mysql"]
    jsonPath: ".metadata.labels['app\\.kubernetes\\.io/name']"
    groupKinds:
    - resourceGroup: ""
      resourceKind: ConfigMap
  fieldActions:
  - op: REPLACE
    path: "/data/endpoint"
    value: "192.0.2.127"
  - op: ADD
    path: "/data/connection-timeout"
    value: "30s"
  - op: REMOVE
    path: "/data/read-timeout"

Terraform

transformation_rules {
  description = "Change, insert, remove `ConfigMap` entres"
  resource_filter {
    namespaces = ["mysql"]
    json_path = ".metadata.labels['app\\.kubernetes\\.io/name']"
    group_kinds {
      resource_kind = "ConfigMap"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/data/endpoint"
    value = "192.0.2.127"
  }
  field_actions {
    op = "ADD"
    path = "/data/connection-timeout"
    value = "30s"
  }
  field_actions {
    op = "REMOVE"
    path = "/data/read-timeout"
  }
}

הוספת התווית app.kubernetes.io/name למשאבים ששמם מתחיל ב-mysql-;

בדוגמה הזו נוספת התווית app.kubernetes.io/name עם הערך mysql לכל המשאבים ששמם מתחיל ב-mysql-:

YAML

transformationRules:
- description: Add a label to resources whose name starts with
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name =~ /^mysql-.*/i)]"
  fieldActions:
  - op: ADD
    path: "/metadata/labels/app.kubernetes.io~1name"
    value: "mysql"

Terraform

transformation_rules {
  description = "Add a label to resources whose name starts with"
  resource_filter {
    json_path = ".metadata[?(@.name =~ /^mysql-.*/i)]"
  }
  field_actions {
    op = "ADD"
    path = "/metadata/labels/app.kubernetes.io~1name"
    value = "mysql"
  }
}

הקצאת כתובת IP סטטית לשירות מסוג LoadBalancer

בדוגמה הזו מוקצית כתובת IP סטטית לשירות "nginx-svc" במרחב השמות "nginx":

YAML

transformationRules:
- description: Assign a static IP to Service nginx-svc
  resourceFilter:
    namespaces: ["nginx"]
    jsonPath: ".metadata[?(@.name == 'nginx-svc')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Service
  fieldActions:
  - op: ADD
    path: "/spec/loadBalancerIP"
    value: "192.0.2.127"

Terraform

transformation_rules {
  description = "Assign a static IP to Service nginx-svc"
  resource_filter {
    namespaces = ["nginx"]
    json_path = ".metadata[?(@.name == 'nginx-svc')]"
    group_kinds {
      resource_kind = "Service"
    }
  }
  field_actions {
    op = "ADD"
    path = "/spec/loadBalancerIP"
    value = "192.0.2.127"
  }
}