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:
Las reglas se organizan en una lista ordenada.
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.Cada regla contiene una breve descripción, criterios de coincidencia y modificaciones de recursos.
Si un recurso no cumple los criterios de una regla, se mueve a la siguiente regla de la lista sin modificaciones.
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.
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.
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únresourceFilter
, todos los recursos coinciden con esta regla.fieldActions
: esta es una lista de los cambios que se deben hacer en los recursos que coincidan conresourceFilter
. 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 :
|
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". |
[ |
.metadata.labels['app\.kubernetes\.io/name'] |
El valor de cadena de la clave "app.kubernetes.io/name" en metadata.labels |
[ |
.data['primary\.cnf'] |
El valor de 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 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. |
[ |
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 elpath
especificado, en función de a qué haga referencia elpath
.remove
elimina el valor delpath
especificado.replace
sustituye el valor depath
especificado por un nuevo valor.move
elimina el valor de una ubicación y lo añade alpath
especificado.copy
copia el valor de una ubicación en elpath
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
apremium-rwo
Cambia el número 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"
}
}
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"
}
}