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 se diseñaron como una mejora con respecto a 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.
Te recomendamos que agregues, cambies o borres el valor asociado con una etiqueta o 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:
Las reglas se organizan en una lista ordenada.
Todos los recursos que se restaurarán, excepto los recursos
CustomResourceDefinition
, para los que no están disponibles las transformaciones, se mueven de forma secuencial a través de esta lista de reglas.Cada regla contiene una descripción breve, criterios de coincidencia y ediciones de recursos.
Si un recurso no coincide con los criterios de una regla, se pasa a la siguiente regla de la lista sin modificaciones.
Si un recurso coincide con los criterios de una regla, las ediciones de la regla se aplican al recurso antes de pasar a la siguiente regla de la lista.
Si se definen varias reglas, los criterios de coincidencia de cada regla se evalúan en función de la versión del recurso modificado por las reglas anteriores.
La versión final del recurso, después de aplicar las ediciones de 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, 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 proporcionaresourceFilter
, todos los recursos coinciden con esta regla.fieldActions
: Esta es una lista de ediciones que se deben realizar en los recursos que coinciden conresourceFilter
. Las ediciones se proporcionan como una lista ordenada de acciones. El orden es importante en este caso, ya que el resultado de una acción puede afectar a la siguiente en la lista. Si falla alguna acción, fallará todo el restablecimiento.
Filtro de recursos (resourceFilter
)
Para definir un filtro de recursos, proporciona 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 :
|
jsonPath |
opcional | Esta es una expresión JSONPath que se usa para buscar coincidencias con los 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 del 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”. |
[ |
.metadata.labels['app\.kubernetes\.io/name'] |
El valor de string de la clave “app.kubernetes.io/name” en metadata.labels |
[ |
.data['primary\.cnf'] |
El valor del objeto de la clave “primary.cnf” en data |
[ |
.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. El i al final de la expresión regular es la marca para la coincidencia que no distingue mayúsculas de minúsculas. |
[ |
Mientras 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
generan el mismo resultado de coincidencia, 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, se debe escapar .
(punto) con una \
(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 Compatibilidad con JSONPath para obtener más ejemplos.
Acción de campo (fieldActions
)
Las acciones de campo se modelan en función del parche JSON, que define una estructura de documento JSON para expresar una operación que se aplica 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 propiedades (claves) descienden a elementos secundarios también se separan con una/
(barra).op
: Es el tipo de operación que se realiza en los recursos. Se admiten cinco operaciones:add
inserta un objeto o valor nuevo en lapath
especificada, según a qué haga referenciapath
.remove
quita el valor de lapath
especificada.replace
reemplaza el valor en lapath
especificada por un valor nuevo.move
quita el valor de una ubicación y lo agrega a lapath
especificada.copy
copia el valor de una ubicación a lapath
especificada.
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"
]
}
]
}
}
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"
}
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
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
Con la siguiente acción, se agrega un valor a una etiqueta nueva app.kubernetes.io/name: nginx
al 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
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
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
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"
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
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
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
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"
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
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"
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
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 el StorageClass de las PVC
En este ejemplo, se cambia el 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 Alfa a Beta, lo que crea un nuevo espacio de nombres "beta"
y restablece 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 las 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
apremium-rwo
Cambia el recuento de réplicas del Deployment
nginx
a3
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 entrada nueva
"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 Service 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"
}
}