Ressourcen während der Wiederherstellung ändern


Auf dieser Seite wird beschrieben, wie Sie während der Wiederherstellung mithilfe von Transformationsregeln Änderungen an Kubernetes-Ressourcen vornehmen. Transformationsregeln sind als Verbesserung gegenüber einem früheren Feature, die Substitutionsregeln genannt werden, gedacht. Da sie nicht mit Substitutionsregeln kompatibel sind, ist die Schnittstelle der verworfenen Substitutionsregeln weiterhin verfügbar.

Die Dokumentation zu Substitutionsregeln finden Sie unter Ressourcen während der Wiederherstellung ändern.

Übersicht

Es gibt mehrere Gründe, warum Kubernetes-Ressourcen im Rahmen der Wiederherstellung geändert werden können:

  • Sie möchten einen PersistentVolumeClaim (PVC) mit einem anderen Speicherbereitsteller erstellen. Sie können beispielsweise vom integrierten Kubernetes-Treiber zum CSI-Treiber wechseln.

  • Sie können einen Namespace unter einem anderen Namen wiederherstellen.

  • Sie können den mit einem Label oder ConfigMap-Schlüssel verknüpften Wert hinzufügen, ändern oder löschen.

  • Sie können die Anzahl der Replikate in einem Deployment oder StatefulSet ändern.

Backup for GKE bietet einen Mechanismus zum Ausführen dieser Änderungen, die als Transformationsregeln bezeichnet werden und die Sie optional als Teil eines RestorePlan definieren können.

Im Wiederherstellungsprozess funktionieren Transformationsregeln so:

  1. Regeln sind in einer sortierten Liste organisiert.

  2. Alle Ressourcen außer CustomResourceDefinition-Ressourcen, für die keine Transformationen verfügbar sind, werden nacheinander in dieser Liste von Regeln verschoben.

  3. Jede Regel enthält eine kurze Beschreibung, Übereinstimmungskriterien und Ressourcenänderungen.

  4. Wenn eine Ressource nicht den Kriterien einer Regel entspricht, wird sie ohne Änderung zur nächsten Regel in der Liste verschoben.

  5. Wenn eine Ressource mit den Kriterien einer Regel übereinstimmt, werden die Änderungen der Regel auf die Ressource angewendet, bevor sie zur nächsten Regel in der Liste verschoben wird.

  6. Wenn mehrere Regeln definiert sind, werden die Abgleichskriterien jeder Regel anhand der Version der Ressource ausgewertet, die durch vorherige Regeln geändert wurde.

  7. Die endgültige Version der Ressource wird nach Anwendung der Änderungen für die übereinstimmende Regel im Cluster erstellt.

Parameter für Transformationsregeln

Zum Erstellen einer Transformationsregel geben Sie die folgenden Informationen an:

  • description: Dies ist eine kurze Beschreibung der Transformationsregel.

  • resourceFilter: Dieser Filter wird für den Abgleich mit Ressourcen verwendet. Wenn kein resourceFilter angegeben ist, entsprechen alle Ressourcen dieser Regel.

  • fieldActions: Dies ist eine Liste von Änderungen, die an den Ressourcen vorgenommen werden sollen, die dem resourceFilter entsprechen. Die Änderungen werden als sortierte Liste von Aktionen bereitgestellt. Die Reihenfolge ist hier wichtig, da sich das Ergebnis einer Aktion auf die nächste Aktion in der Liste auswirken kann. Wenn eine Aktion fehlschlägt, schlägt die gesamte Wiederherstellung fehl.

Ressourcenfilter (resourceFilter)

Geben Sie die folgenden Parameter an, um einen Ressourcenfilter zu definieren:

Parameter Erforderlich Beschreibung
namespaces optional Dies ist eine Liste von Namespaces. Damit eine Ressource dieser Regel entspricht, muss es sich um eine Namespace-Ressource handeln und einen der angegebenen Namespaces haben. Wenn für diesen Parameter nichts angegeben ist, stimmen alle Ressourcen überein (alle Namespace- und clusterbezogenen Ressourcen).
groupKinds optional Dies ist eine Liste von Tupeln der Group/Kind-Ressource von Kubernetes:
  • Wenn für diesen Parameter nichts angegeben ist, werden alle Ressourcen ohne Einschränkungen auf der Grundlage von Group/Kind abgeglichen.
  • Wenn eine oder mehrere Group/Kind angegeben werden, müssen Ressourcen mit einer von diesen übereinstimmen.
  • Verwenden Sie eine leere Gruppe („“), um einen Abgleich mit den Kernressourcen durchzuführen.
jsonPath optional Dies ist ein JSONPath, mit dem Ressourcen abgeglichen werden.

JSONPath (jsonPath)

Ein JSONPath-Ausdruck wird zum Abgleich mit Ressourcen verwendet. Wenn das Ergebnis des Ausdrucks nicht für eine Ressource leer ist, wird diese Ressource als abgeglichen betrachtet.

Betrachten Sie diese Ressource:

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"
  }
}

Beispiel für die Verwendung von JSONPath-Ausdrücken:

Expression Beschreibung Ergebnis
.metadata[?(@.name == 'mysql-cm')] Das Objekt metadata enthält den Schlüssel name und der Wert ist "mysql-cm". [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] Der Stringwert des Schlüssels "app.kubernetes.io/name" unter metadata.labels [
 "mysql"
]
.data['primary\.cnf'] Der Objektwert des Schlüssels "primary.cnf" unter data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] Das metadata-Objekt enthält den Schlüssel name und dessen Wert entspricht dem regulären Ausdruck "/^mysql-.*/i".
Die Schrägstriche / werden verwendet, um das Muster des regulären Ausdrucks zu trennen. Das i am Ende des regulären Ausdrucks ist das Flag für den Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

Solange die Ausgabe des JSONPath-Ausdrucks nicht leer ist, entspricht die entsprechende Ressource dieser Regel. Daher führen .metadata[?(@.name == 'mysql-cm')] und .metadata[?(@.name == 'mysql-cm')].name zum selben übereinstimmenden Ergebnis, das mit der Ressource übereinstimmt, deren .metadata.name "mysql-cm" ist.

Wenn der Filter in JSONPath für den Abgleich eines Schlüssels in einer Zuordnung in der Google Cloud Console verwendet wird, muss . (Punkt) mit einem \ (umgekehrter Schrägstrich) maskiert werden. Wenn der JSONPath im Kontext der YAML mit der gcloud CLI oder der Terraform Language bereitgestellt wird, sind \\ (doppelte Schrägstriche) erforderlich. .metadata.labels['app\.kubernetes\.io/name'] entspricht beispielsweise .metadata.labels['app\\.kubernetes\\.io/name'] in YAML oder Terraform.

Wir empfehlen die Verwendung eines JSONPath-Bewertungstools mit Unterstützung für reguläre Ausdrücke, um den Ausdruck vor der Verwendung zu testen. Sie können auch kubectl verwenden, um das Ergebnis von JSONPath-Ausdrücken zu prüfen. Weitere Beispiele finden Sie unter JSONPath-Unterstützung.

Feldaktion (fieldActions)

Feldaktionen werden auf der Grundlage von JSON Patch modelliert. Dieser Wert definiert eine JSON-Dokumentstruktur zur Darstellung eines Vorgangs, der auf ein JSON-Dokument angewendet werden soll. Zum Definieren einer Feldaktion sind die folgenden Parameter erforderlich:

  • path: Dies ist ein JSON-Pointer-Wert, der auf den Standort in Zielressourcen verweist, in dem der Vorgang ausgeführt wird. JSON-Zeiger beginnen immer mit einem / (Schrägstrich) und die Attributnamen (Schlüssel) werden von untergeordneten Elementen ebenfalls durch einen / (Schrägstrich) getrennt.

  • op: Dies ist der Typ des Vorgangs, der für Ressourcen ausgeführt wird. Fünf Vorgänge werden unterstützt:

    • add fügt ein neues Objekt oder einen neuen Wert in den angegebenen path ein, je nachdem, worauf der path verweist.
    • remove entfernt den Wert aus dem angegebenen path.
    • replace ersetzt den Wert am angegebenen path durch einen neuen Wert.
    • move entfernt den Wert aus einem Standort und fügt ihn dem angegebenen path hinzu.
    • copy kopiert den Wert von einem Standort in den angegebenen path.

Beispiele für jeden Vorgang finden Sie in der folgenden Pod-Definition:

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"
        ]
      }
    ]
  }
}

Hinzufügen

value ist immer für add-Vorgänge erforderlich und muss ein gültiges JSON-Element sein.

Durch die folgende Aktion wird dem Container nginx die neue Umgebungsvariable "PORT" mit dem Wert "80" hinzugefügt.

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

Original

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

Umgewandelt

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

Die folgende Aktion fügt dem Pod den Wert eines neuen Labels app.kubernetes.io/name: nginx hinzu.

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

Original

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

Umgewandelt

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

Mit der folgenden Aktion wird das Image des Containers nginx von "nginx:latest" in "nginx:stable" geändert.

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

Original

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

Umgewandelt

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

Entfernen

Mit der folgenden Aktion werden die Ressourcenanforderungen für den Container nginx entfernt.

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

Original

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

Umgewandelt

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

Ersetzen

value ist für den replace-Vorgang erforderlich und muss ein JSON-Element sein.

Durch die folgende Aktion wird das Image des Containers nginx von nginx:latest durch nginx:stable ersetzt.

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

Original

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

Umgewandelt

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

Verschieben

fromPath ist für den move-Vorgang erforderlich.

Mit der folgenden Aktion werden Umgebungsvariablen aus dem Container nginx entfernt und dem install-init-Container hinzugefügt.

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

Original

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

Umgewandelt

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

Kopieren

fromPath ist für den copy-Vorgang erforderlich.

Mit der folgenden Aktion werden Umgebungsvariablen aus dem Container nginx in den Init-Container install kopiert.

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

Original

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

Umgewandelt

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

Weitere Informationen zum Definieren von Transformationsregeln in der Google Cloud Console finden Sie unter Eine Reihe von Wiederherstellungen planen.

Zum Definieren von Transformationsregeln über die gcloud CLI erstellen Sie eine Datei mit einem YAML-Array von transformationRules und fügen den Parameter --transformation-rules-file= in den Befehl gcloud beta container backup-restore restore-plans create ein.

Beispiele für Transformationsregeln

Die folgenden Beispiele finden Sie im YAML-Format, das von der gcloud CLI oder der Terraform-Konfigurationssprache verwendet wird.

StorageClass von PVCs ändern

In diesem Beispiel wird die StorageClass in allen wiederhergestellten PersistentVolumeClaim-Ressourcen von standard in premium-rwo geändert:

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"
  }
}

Namespace klonen

In diesem Beispiel wird ein Namespace von Alpha auf Beta geklont. Dabei wird ein neuer Namespace "beta" erstellt und alle Ressourcen von "alpha" werden im neuen Namespace "beta" wiederhergestellt. In diesem Beispiel sind zwei Transformationsregeln erforderlich – eine für den Namespace selbst und eine für die Ressourcen innerhalb des Namespace.

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 von PVCs und Replikatanzahl in einem geklonten Namespace ändern

In diesem Beispiel wird ein Namespace geklont und dann eine Reihe von Änderungen auf Ressourcen im neuen Namespace angewendet:

  • StorageClass für PVCs von standard in premium-rwo ändern

  • Ändern Sie die Replikatanzahl der Bereitstellung nginx in 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-Einträge ändern, einfügen und entfernen

In diesem Beispiel wird ConfigMap, das den Labelschlüssel "app.kubernetes.io/name" im Namespace "mysql" enthält, so geändert:

  • Ändern Sie den Wert des Eintrags "endpoint" in "192.0.2.127".

  • Fügen Sie einen neuen Eintrag "connection-timeout" mit dem Wert "30s" ein.

  • Entfernen Sie den Eintrag mit dem Schlüssel "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"
  }
}

Fügen Sie Ressourcen das Label app.kubernetes.io/name hinzu, deren Name mit mysql- beginnt.

In diesem Beispiel wird allen Ressourcen, deren Name mit mysql- beginnt, das Label app.kubernetes.io/name mit dem Wert mysql hinzugefügt:

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"
  }
}

Statische IP-Adresse für einen Dienst des Typs LoadBalancer zuweisen

In diesem Beispiel wird dem Dienst "nginx-svc" im Namespace "nginx" eine statische IP-Adresse zugewiesen:

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"
  }
}