Modificar recursos durante la restauración

En esta página se describe cómo modificar los recursos de Kubernetes durante el proceso de restauración mediante reglas de transformación. Las reglas de transformación se han diseñado para mejorar una función anterior llamada reglas de sustitución. Como no son compatibles con las reglas de sustitución, la interfaz de reglas de sustitución obsoleta sigue estando disponible.

Para ver la documentación sobre las reglas de sustitución, consulta Modificar recursos durante la restauración.

Información general

Hay varios motivos por los que puede que quieras modificar los recursos de Kubernetes como parte del proceso de restauración:

  • Puede que quieras crear un PersistentVolumeClaim (PVC) con otro aprovisionador de almacenamiento. Por ejemplo, quieres pasar del controlador de Kubernetes integrado al controlador de CSI.

  • Puede que quieras restaurar un espacio de nombres con otro nombre.

  • Puede que quieras añadir, cambiar o eliminar el valor asociado a una etiqueta o a una clave de ConfigMap.

  • Puede que quieras cambiar el número de réplicas de un Deployment o un StatefulSet.

Backup for GKE proporciona un mecanismo para hacer estos cambios llamado reglas de transformación, que puedes definir de forma opcional como parte de un RestorePlan.

Durante el proceso de restauración, las reglas de transformación funcionan de la siguiente manera:

  1. Las reglas se organizan en una lista ordenada.

  2. Todos los recursos, excepto los recursos CustomResourceDefinition, para los que no hay transformaciones disponibles, se restauran de forma secuencial a través de esta lista de reglas.

  3. Cada regla contiene una breve descripción, criterios de coincidencia y modificaciones de recursos.

  4. Si un recurso no cumple los criterios de una regla, se mueve a la siguiente regla de la lista sin modificaciones.

  5. Si un recurso cumple los criterios de una regla, las modificaciones de la regla se aplican al recurso antes de que pase a la siguiente regla de la lista.

  6. Si se definen varias reglas, los criterios de coincidencia de cada regla se evalúan en función de la versión del recurso modificada por las reglas anteriores.

  7. La versión final del recurso, una vez que se hayan aplicado los cambios de cualquier regla coincidente, es la que se crea en el clúster.

Parámetros de reglas de transformación

Para crear una regla de transformación, debe proporcionar la siguiente información:

  • description: se trata de una breve descripción de la regla de transformación.

  • resourceFilter: este filtro se usa para buscar coincidencias con los recursos. Si no se proporciona ningún resourceFilter, todos los recursos coinciden con esta regla.

  • fieldActions: esta es una lista de los cambios que se deben hacer en los recursos que coincidan con resourceFilter. Las ediciones se proporcionan como una lista ordenada de acciones. El orden es importante, ya que el resultado de una acción puede afectar a la siguiente de la lista. Si falla alguna acción, fallará toda la restauración.

Filtro de recursos (resourceFilter)

Para definir un filtro de recursos, debe proporcionar los siguientes parámetros:

Parámetro Obligatorio Descripción
namespaces opcional Se trata de una lista de espacios de nombres. Para que un recurso coincida con esta regla, debe ser un recurso con espacio de nombres y tener uno de los espacios de nombres indicados. Si no se proporciona ningún valor para este parámetro, se incluirán todos los recursos (todos los recursos con espacio de nombres y con ámbito de clúster).
groupKinds opcional Esta es una lista de tuplas de recursos de Kubernetes Group/Kind:
  • Si no se proporciona ningún valor para este parámetro, todos los recursos coincidirán sin restricciones basadas en Group/Kind.
  • Si se proporciona uno o varios Group/Kind, los recursos deben coincidir con uno de ellos para que se aplique la regla.
  • Para buscar coincidencias con recursos principales, usa un grupo vacío ("").
jsonPath opcional Es una expresión JSONPath que se usa para buscar recursos que coincidan.

JSONPath (jsonPath)

Se usa una expresión JSONPath para buscar coincidencias en los recursos. Si el resultado de la expresión no está vacío en relación con un recurso, se considera que este recurso coincide.

Teniendo en cuenta el siguiente recurso:

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

Ejemplo de uso de expresiones JSONPath:

Expresión Descripción Resultado
.metadata[?(@.name == 'mysql-cm')] El objeto metadata contiene la clave name y su valor es "mysql-cm". [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] El valor de cadena de la clave "app.kubernetes.io/name" en metadata.labels [
 "mysql"
]
.data['primary\.cnf'] El valor de objeto de la clave "primary.cnf" en data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] El objeto metadata contiene la clave name y su valor coincide con la expresión regular "/^mysql-.*/i".
Las barras diagonales / se usan para delimitar el patrón de la expresión regular. El i al final de la expresión regular es la marca para que no se tengan en cuenta las diferencias entre mayúsculas y minúsculas.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

Siempre que el resultado de la expresión JSONPath no esté vacío, el recurso correspondiente coincidirá con esta regla. Por lo tanto, .metadata[?(@.name == 'mysql-cm')] y .metadata[?(@.name == 'mysql-cm')].name dan como resultado la misma coincidencia, que es el recurso cuyo .metadata.name es "mysql-cm".

Cuando se usa el filtro en JSONPath para buscar una clave en un mapa de la Google Cloud consola, . (punto) debe incluirse con \ (barra invertida). Si se proporciona JSONPath en el contexto de YAML mediante gcloud CLI o lenguaje Terraform, se necesitan \\ (doble barra invertida). Por ejemplo, .metadata.labels['app\.kubernetes\.io/name'] equivale a .metadata.labels['app\\.kubernetes\\.io/name'] en YAML o Terraform.

Te recomendamos que uses una herramienta de evaluación de JSONPath con compatibilidad con expresiones regulares para probar la expresión antes de usarla. También puedes usar kubectl para verificar el resultado de las expresiones JSONPath. Consulta más ejemplos en la sección Compatibilidad con JSONPath.

Acción de campo (fieldActions)

Las acciones de campo se modelan en función de JSON Patch, que define una estructura de documento JSON para expresar una operación que se va a aplicar a un documento JSON. Para definir una acción de campo, se necesitan los siguientes parámetros:

  • path: es un valor de puntero JSON que hace referencia a la ubicación de los recursos de destino en la que se realiza la operación. Los punteros JSON siempre empiezan con una / (barra) y los nombres de las propiedades (claves) que se encuentran en los elementos secundarios también están separados por una / (barra).

  • op: es el tipo de operación que se realiza en los recursos. Se admiten cinco operaciones:

    • add inserta un nuevo objeto o valor en el path especificado, en función de a qué haga referencia el path.
    • remove elimina el valor del path especificado.
    • replace sustituye el valor de path especificado por un nuevo valor.
    • move elimina el valor de una ubicación y lo añade al path especificado.
    • copy copia el valor de una ubicación en el path especificado.

Puedes encontrar ejemplos de cada operación con la siguiente definición de 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"
        ]
      }
    ]
  }
}

Añadir

value siempre es obligatorio para las operaciones add y debe ser un elemento JSON válido.

La siguiente acción añade una nueva variable de entorno "PORT" con el valor "80" al contenedor nginx.

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

Transformado

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

La siguiente acción añade el valor app.kubernetes.io/name: nginx a una etiqueta nueva del pod.

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

Transformado

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

La siguiente acción sustituye la imagen del contenedor nginx para cambiarla de "nginx:latest" a "nginx:stable".

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

Transformado

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

Quitar

La siguiente acción elimina los requisitos de recursos del contenedor nginx.

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

Transformado

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

Sustituir

value es obligatorio para la operación replace y debe ser un elemento JSON.

La siguiente acción sustituye la imagen del contenedor nginx de nginx:latest a nginx:stable.

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

Transformado

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

Mover

fromPath es obligatorio para la operación move.

La siguiente acción elimina las variables de entorno del contenedor nginx y las añade al contenedor init install.

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

Transformado

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

Copiar

fromPath es obligatorio para la operación copy.

La siguiente acción copia las variables de entorno del contenedor nginx al contenedor init install.

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

Transformado

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

Para obtener más información sobre cómo definir reglas de transformación en la consola de Google Cloud , consulta Planificar un conjunto de restauraciones.

Para definir reglas de transformación mediante la CLI de gcloud, crea un archivo que contenga una matriz YAML de transformationRules e incluye el parámetro --transformation-rules-file= en el comando gcloud beta container backup-restore restore-plans create.

Ejemplos de reglas de transformación

Los siguientes ejemplos se proporcionan en el formato YAML que usa la CLI de gcloud o el lenguaje de configuración de Terraform.

Cambiar la clase de almacenamiento de los PVCs

En este ejemplo, se cambia la StorageClass de todos los recursos PersistentVolumeClaim restaurados de standard a 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"
  }
}

Clonar un espacio de nombres

En este ejemplo, se clona un espacio de nombres de alfa a beta, se crea un nuevo espacio de nombres "beta" y se restauran todos los recursos de "alpha" en el nuevo espacio de nombres "beta". Este ejemplo requiere dos reglas de transformación: una para el propio espacio de nombres y otra para los recursos del espacio de nombres.

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

Cambiar la StorageClass de los PVCs y el número de réplicas en un espacio de nombres clonado

En este ejemplo se clona un espacio de nombres y, a continuación, se aplica un conjunto de cambios a los recursos del nuevo espacio de nombres:

  • Cambiar el StorageClass de los PVCs de standard a premium-rwo

  • Cambia el número de réplicas del Deployment nginx a 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"
  }
}

Cambiar, insertar y quitar entradas de ConfigMap

En este ejemplo se modifica el ConfigMap que contiene la clave de etiqueta "app.kubernetes.io/name" en el espacio de nombres "mysql" para que sea:

  • Cambia el valor de la entrada "endpoint" a "192.0.2.127".

  • Inserta una nueva entrada "connection-timeout" con el valor "30s".

  • Elimina la entrada con la clave "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"
  }
}

Añade la etiqueta app.kubernetes.io/name a los recursos cuyo nombre empiece por mysql-.

En este ejemplo se añade una etiqueta app.kubernetes.io/name con el valor mysql a todos los recursos cuyo nombre empieza por 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"
  }
}

Asignar una dirección IP estática a un servicio de tipo LoadBalancer

En este ejemplo se asigna una dirección IP estática al servicio "nginx-svc" en el espacio de nombres "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"
  }
}