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:
Las reglas están organizadas en una lista ordenada.
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.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 que pase a la siguiente regla de la lista.
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.
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 unresourceFilter
, todos los recursos coinciden con esta regla.fieldActions
: Esta es una lista de ediciones para realizar en los recursos que coinciden conresourceFilter
. 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 :
|
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” |
[ |
.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 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 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. |
[ |
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 elpath
especificado, según lo que haga referencia apath
.remove
quita el valor delpath
especificado.replace
reemplaza el valor en elpath
especificado por un valor nuevo.move
quita el valor de una ubicación y lo agrega alpath
especificado.copy
copia el valor de una ubicación en elpath
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
apremium-rwo
Cambia el recuento de réplicas del
nginx
de la implementación 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 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"
}
}