Modifica recursos durante el restablecimiento


En esta página se describe cómo realizar modificaciones en los recursos de Kubernetes durante el proceso de restablecimiento mediante reglas de transformación. Las reglas de transformación están diseñadas como una mejora en comparación con una función anterior llamada reglas de sustitución. Debido a que no son retrocompatibles con reglas de sustitución, la interfaz de reglas de sustitución obsoleta aun está disponible.

Para ver la documentación de las reglas de sustitución, consulta Modifica los recursos durante el restablecimiento.

Descripción general

Hay varias razones por las que tal vez quieras modificar los recursos de Kubernetes como parte del proceso de restablecimiento:

  • Se recomienda crear una PersistentVolumeClaim (PVC) con un aprovisionador de almacenamiento diferente. Por ejemplo, deseas pasar del controlador en árbol de Kubernetes al controlador de CSI.

  • Es posible que quieras restablecer un espacio de nombres con un nombre diferente.

  • Es posible que quieras agregar, cambiar o borrar el valor asociado con una etiqueta o una clave de ConfigMap.

  • Quizá quieras cambiar un recuento de réplicas en una implementación o un StatefulSet.

La copia de seguridad para GKE proporciona un mecanismo para realizar estos cambios, llamados reglas de transformación, que puedes definir como parte de una RestorePlan.

En el proceso de restablecimiento, las reglas de transformación funcionan de la siguiente manera:

  1. Las reglas están organizadas en una lista ordenada.

  2. Todos los recursos, excepto los recursos CustomResourceDefinition, para los que las transformaciones no están disponibles, se restablecerán de forma secuencial a través de esta lista de reglas.

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

  4. Si un recurso no coincide con los criterios de una regla, se pasa a la siguiente regla de la lista sin modificaciones.

  5. Si un recurso coincide con los criterios de una regla, las ediciones 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 con respecto a la versión del recurso modificada por las reglas anteriores.

  7. Después de aplicar las ediciones de una regla coincidente, la versión final del recurso es la que se crea en el clúster.

Parámetros de reglas de transformación

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

  • description: esta es una descripción breve de la regla de transformación.

  • resourceFilter: Este filtro se usa para hacer coincidir los recursos. Si no se proporciona un resourceFilter, todos los recursos coinciden con esta regla.

  • fieldActions: Esta es una lista de ediciones para realizar en los recursos que coinciden con resourceFilter. Las ediciones se proporcionan como una lista ordenada de acciones. El orden es importante aquí, ya que el resultado de una acción puede afectar la siguiente acción en la lista. Si alguna acción falla, todo el restablecimiento fallará.

Filtro de recursos (resourceFilter)

Para definir un filtro de recurso, debes proporcionar los siguientes parámetros:

Parámetro Obligatorio Descripción
namespaces opcional Esta es 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 dados. Si no se proporciona nada para este parámetro, todos los recursos coincidirán (todos los recursos con espacio de nombres y con permisos de clúster).
groupKinds opcional Esta es una lista de tuplas de recursos de Kubernetes Group/Kind:
  • Si no se proporciona nada para este parámetro, todos los recursos coincidirán sin restricciones basadas en Group/Kind.
  • Si se proporcionan uno o más Group/Kind, los recursos deben coincidir con uno de ellos para que coincida con la regla.
  • Para que coincidan con los recursos principales, usa un grupo vacío (“”).
jsonPath opcional Esta es una expresión JSONPath que se usa para establecer coincidencias con recursos.

JSONPath (jsonPath)

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

Dado 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 string 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 expresión regular. La i al final de la expresión regular es la marca para la coincidencia que no distingue 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 el mismo resultado que coincide, que coincide con el recurso cuyo .metadata.name es "mysql-cm".

Cuando el filtro se usa en JSONPath para hacer coincidir una clave en un mapa en la consola de Google Cloud, . (punto) se debe escapar con un \ (barra inversa). Si se proporciona la JSONPath en el contexto de YAML con la gcloud CLI o Terraform Language, se necesitan \\ (barras inversas dobles). Por ejemplo, .metadata.labels['app\.kubernetes\.io/name'] es equivalente a .metadata.labels['app\\.kubernetes\\.io/name'] en YAML o Terraform.

Recomendamos usar una herramienta de evaluador 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 la compatibilidad con JSONPath para obtener más ejemplos.

Acción de campo (fieldActions)

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

  • path: Este es un valor puntero de JSON que hace referencia a la ubicación en los recursos de destino donde se realiza la operación. Los punteros JSON siempre comienzan con una / (barra), y los nombres de las propiedades (claves) descienden a elementos secundarios también se separan con una / (barra).

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

    • add inserta un objeto o valor nuevo para el path especificado, según lo que haga referencia a path.
    • remove quita el valor del path especificado.
    • replace reemplaza el valor en el path especificado por un valor nuevo.
    • move quita el valor de una ubicación y lo agrega al path especificado.
    • copy copia el valor de una ubicación en el path especificado.

Puedes encontrar ejemplos de cada operación mediante 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"
        ]
      }
    ]
  }
}

Agregar

value siempre es obligatorio para las operaciones add y debe ser un elemento JSON legal.

En esta acción se agrega 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"
  }

Datos

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

Transformados

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 agrega valor a una etiqueta nueva app.kubernetes.io/name: nginx al pod.

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

Datos

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

Transformados

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 reemplaza la imagen del contenedor nginx para cambiarla de "nginx:latest" a "nginx:stable".

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

Datos

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

Transformados

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 quita los requisitos de recursos para el contenedor nginx.

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

Datos

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

Transformados

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

Reemplazar

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

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

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

Datos

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

Transformados

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

Se requiere fromPath para la operación move.

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

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

Datos

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

Transformados

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

Se requiere fromPath para la operación copy.

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

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

Datos

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

Transformados

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 sustitución en la consola de Google Cloud, consulta Planifica un conjunto de restablecimientos.

Para definir reglas de transformación a través de gcloud CLI, crea un archivo que contenga una matriz de YAML de transformationRules y, luego, 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 gcloud CLI o el lenguaje de configuración de Terraform.

Cambia la StorageClass de PVC

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

Clona un espacio de nombres

En este ejemplo, se clona un espacio de nombres de la versión Alfa a la versión Beta: se crea un espacio de nombres nuevo "beta" y se restablecen todos los recursos de "alpha" al nuevo espacio de nombres "beta". En este ejemplo se requieren dos reglas de transformación: una para el espacio de nombres y otra para los recursos dentro 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"
  }
}

Cambia la StorageClass de los PVC y el recuento de réplicas en un espacio de nombres clonado

En este ejemplo se clona un espacio de nombres y, luego, se aplica un conjunto de cambios a los recursos en el espacio de nombres nuevo:

  • Cambia el StorageClass en PVC de standard a premium-rwo

  • Cambia el recuento de réplicas del nginx de la implementación 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"
  }
}

Cambia, inserta y quita 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" a lo siguiente:

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

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

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

Agrega una etiqueta app.kubernetes.io/name a los recursos cuyo nombre comience con mysql-;

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

Asigna una dirección IP estática para un servicio de tipo LoadBalancer

En este ejemplo, se asigna una dirección IP estática para el 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"
  }
}