בדף הזה מוסבר איך לבצע שינויים במשאבי Kubernetes במהלך תהליך השחזור באמצעות כללי טרנספורמציה. כללי ההמרה נועדו לשפר את התכונה הקודמת שנקראה כללי החלפה. ממשק כללי ההחלפה שהוצא משימוש עדיין זמין, כי הוא לא תואם לאחור לכללי ההחלפה.
במאמר שינוי משאבים במהלך שחזור מוסבר על כללי החלפה.
סקירה כללית
יכולות להיות כמה סיבות לכך שתרצו לשנות את משאבי Kubernetes כחלק מתהליך השחזור:
יכול להיות שתרצו ליצור PersistentVolumeClaim (PVC) באמצעות מנהל הקצאות (provisioner) אחסון אחר. לדוגמה, אתם רוצים לעבור ממנהל ההתקן של Kubernetes in-tree למנהל ההתקן של CSI.
יכול להיות שתרצו לשחזר מרחב שמות בשם אחר.
יכול להיות שתרצו להוסיף, לשנות או למחוק את הערך שמשויך לתווית או למפתח ConfigMap.
יכול להיות שתרצו לשנות את מספר הרפליקות ב-Deployment או ב-StatefulSet.
ב-Backup for GKE יש מנגנון לביצוע השינויים האלה שנקרא כללי טרנספורמציה, שאפשר להגדיר אותם כחלק מRestorePlan.
בתהליך השחזור, כללי הטרנספורמציה פועלים באופן הבא:
הכללים מאורגנים ברשימה ממוספרת.
כל המשאבים – חוץ ממשאבי
CustomResourceDefinition, שלא זמינות לגביהם טרנספורמציות – שרוצים לשחזר עוברים ברשימת הכללים הזו לפי הסדר.כל כלל מכיל תיאור קצר, קריטריונים להתאמה ועריכות של משאבים.
אם משאב לא עומד בקריטריונים של כלל מסוים, הוא עובר לכלל הבא ברשימה ללא שינוי.
אם משאב תואם לקריטריונים של כלל, השינויים של הכלל יחולו על המשאב לפני שהוא יעבור לכלל הבא ברשימה.
אם מוגדרים כמה כללים, הקריטריונים להתאמה של כל כלל נבדקים מול הגרסה של המשאב ששונתה על ידי כללים קודמים.
הגרסה הסופית של המשאב, אחרי שכל העריכות של כלל ההתאמה יושמו, היא מה שנוצר באשכול.
פרמטרים של כללי טרנספורמציה
כדי ליצור כלל המרה, צריך לספק את הפרטים הבאים:
description: תיאור קצר של כלל השינוי.
resourceFilter: המסנן הזה משמש להתאמה למשאבים. אם לא מצייניםresourceFilter, כל המשאבים תואמים לכלל הזה.
fieldActions: רשימה של עריכות שצריך לבצע במשאבים שתואמים ל-resourceFilter. העריכות מוצגות כרשימה מסודרת של פעולות. הסדר חשוב כאן כי התוצאה של פעולה אחת יכולה להשפיע על הפעולה הבאה ברשימה. אם פעולה כלשהי נכשלת, כל השחזור ייכשל.
מסנן משאבים (resourceFilter)
כדי להגדיר מסנן משאבים, צריך לספק את הפרמטרים הבאים:
| פרמטר | חובה | תיאור |
|---|---|---|
namespaces |
אופציונלי | זו רשימה של מרחבי שמות. כדי שמשאב יתאים לכלל הזה, הוא צריך להיות משאב עם מרחב שמות, וצריך להיות לו אחד ממרחבי השמות שצוינו. אם לא מספקים ערך לפרמטר הזה, כל המשאבים יתאימו (כל המשאבים עם מרחב שמות וכל המשאבים בהיקף האשכול). |
groupKinds |
אופציונלי |
זו רשימה של טפלים של משאבי Kubernetes: 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 |
[ |
.metadata.labels['app\.kubernetes\.io/name'] |
ערך המחרוזת של המפתח app.kubernetes.io/name בקטע metadata.labels |
[ |
.data['primary\.cnf'] |
ערך האובייקט של המפתח primary.cnf בקטע data |
[ |
.metadata[?(@.name =~ /^mysql-.*/i)] |
האובייקט metadata מכיל את המפתח name והערך שלו תואם לביטוי הרגולרי '/^mysql-.*/i'.הלוכסנים / משמשים לתיחום של תבנית הביטוי הרגולרי. הסימון i בסוף הביטוי הרגולרי
הוא הדגל להתאמה לא תלוית-רישיות. |
[ |
כל עוד הפלט של ביטוי 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"
}
}