Esta página descreve como fazer modificações aos recursos do Kubernetes durante o processo de restauro através de regras de transformação. As regras de transformação destinam-se a ser uma melhoria em relação a uma funcionalidade anterior denominada regras de substituição. Uma vez que não são retrocompatíveis com as regras de substituição, a interface de regras de substituição descontinuada continua disponível.
Para ver a documentação sobre as regras de substituição, consulte o artigo Modifique recursos durante o restauro.
Vista geral
Existem vários motivos pelos quais pode querer modificar os recursos do Kubernetes como parte do processo de restauro:
Pode querer criar um PersistentVolumeClaim (PVC) com um aprovisionador de armazenamento diferente. Por exemplo, quer mudar do controlador in-tree do Kubernetes para o controlador CSI.
Pode querer restaurar um espaço de nomes com um nome diferente.
Pode querer adicionar, alterar ou eliminar o valor associado a uma etiqueta ou a uma chave ConfigMap.
Pode querer alterar a quantidade de réplicas numa implementação ou num StatefulSet.
A cópia de segurança para o GKE oferece um mecanismo para fazer estas alterações denominado regras de transformação, que pode definir opcionalmente como parte de uma RestorePlan.
No processo de restauro, as regras de transformação funcionam da seguinte forma:
As regras estão organizadas numa lista ordenada.
Todos os recursos, exceto os recursos
CustomResourceDefinition, para os quais as transformações não estão disponíveis, são movidos sequencialmente através desta lista de regras.Cada regra contém uma breve descrição, critérios de correspondência e edições de recursos.
Se um recurso não corresponder aos critérios de uma regra, passa para a regra seguinte na lista sem modificação.
Se um recurso corresponder aos critérios de uma regra, as edições da regra são aplicadas ao recurso antes de passar para a regra seguinte na lista.
Se forem definidas várias regras, os critérios de correspondência de cada regra são avaliados em função da versão do recurso modificada pelas regras anteriores.
A versão final do recurso, depois de aplicar as edições de qualquer regra de correspondência, é o que é criado no cluster.
Parâmetros das regras de transformação
Cria uma regra de transformação fornecendo as seguintes informações:
description: esta é uma breve descrição da regra de transformação.resourceFilter: este filtro é usado para fazer a correspondência com recursos. Se não for fornecido nenhumresourceFilter, todos os recursos correspondem a esta regra.fieldActions: esta é uma lista de edições a fazer aos recursos que correspondem aoresourceFilter. As edições são fornecidas como uma lista ordenada de ações. A ordem é importante aqui porque o resultado de uma ação pode afetar a ação seguinte na lista. Se alguma ação falhar, toda a restauração falha.
Filtro de recursos (resourceFilter)
Para definir um filtro de recursos, fornece os seguintes parâmetros:
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
namespaces |
opcional | Esta é uma lista de espaços de nomes. Para que um recurso corresponda a esta regra, tem de ser um recurso com espaço de nomes e ter um dos espaços de nomes indicados. Se não for fornecido nada para este parâmetro, todos os recursos vão corresponder (todos os recursos com espaço de nomes e âmbito de cluster). |
groupKinds |
opcional |
Esta é uma lista de tuplos de recursos do Kubernetes: Group/Kind
|
jsonPath |
opcional | Esta é uma expressão JSONPath que é usada para corresponder a recursos. |
JSONPath (jsonPath)
É usada uma expressão JSONPath para fazer a correspondência com os recursos. Se o resultado da expressão não estiver vazio em relação a um recurso, considera-se que este recurso tem correspondência.
Considerando o seguinte 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"
}
}
Exemplo de utilização de expressões JSONPath:
| Expressão | Descrição | Resultado |
|---|---|---|
.metadata[?(@.name == 'mysql-cm')] |
O objeto metadata contém a chave name e o respetivo valor é "mysql-cm" |
[ |
.metadata.labels['app\.kubernetes\.io/name'] |
O valor da string da chave "app.kubernetes.io/name" em metadata.labels |
[ |
.data['primary\.cnf'] |
O valor do objeto da chave "primary.cnf" em data |
[ |
.metadata[?(@.name =~ /^mysql-.*/i)] |
O objeto metadata contém a chave name e o respetivo
valor corresponde à expressão regular "/^mysql-.*/i".As barras invertidas / são usadas para delimitar o padrão de
expressão regular. O i no final da expressão regular
é o indicador para a correspondência não sensível a maiúsculas e minúsculas. |
[ |
Desde que o resultado da expressão JSONPath não esteja vazio, o recurso correspondente vai corresponder a esta regra.
Assim, .metadata[?(@.name == 'mysql-cm')] e .metadata[?(@.name == 'mysql-cm')].name resultam no mesmo resultado de correspondência, que é a correspondência do recurso cujo .metadata.name é "mysql-cm".
Quando o filtro é usado no JSONPath para corresponder a uma chave num mapa na consola Google Cloud , o . (ponto) tem de
ser escapado com um \ (barra invertida). Se o JSONPath for fornecido no contexto do YAML através da CLI gcloud
ou da linguagem Terraform, são necessários \\ (duplos carateres de barra invertida).
Por exemplo, .metadata.labels['app\.kubernetes\.io/name'] é equivalente a .metadata.labels['app\\.kubernetes\\.io/name'] em YAML ou Terraform.
Recomendamos que use uma ferramenta de avaliação JSONPath com suporte de expressões regulares para testar a expressão antes da utilização.
Também pode usar o kubectl para validar o resultado das expressões JSONPath.
Consulte o artigo Suporte do JSONPath para ver mais exemplos.
Ação de campo (fieldActions)
As ações de campo são modeladas com base no JSON Patch, que define uma estrutura de documento JSON para expressar uma operação a aplicar a um documento JSON. Para definir uma ação de campo, são necessários os seguintes parâmetros:
path: este é um valor de ponteiro JSON que faz referência à localização nos recursos de destino onde a operação é realizada. Os ponteiros JSON começam sempre com uma/(barra) e os nomes das propriedades (chaves) que descem para os elementos secundários também são separados por uma/(barra).op: este é o tipo de operação realizada em recursos. São suportadas cinco operações:addinsere um novo objeto ou valor nopathespecificado, consoante o que opathreferencia.removeremove o valor dopathespecificado.replacesubstitui o valor nopathespecificado por um novo valor.moveremove o valor de uma localização e adiciona-o aopathespecificado.copycopia o valor de uma localização para opathespecificado.
Pode encontrar exemplos de cada operação através da seguinte definição 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"
]
}
]
}
}
Adicionar
value é sempre necessário para operações add e tem de ser um elemento JSON legal.
A ação seguinte adiciona uma nova variável de ambiente "PORT" com o valor "80" ao contentor 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
A ação seguinte adiciona valor a uma nova etiqueta app.kubernetes.io/name: nginx ao podcast.
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
A ação seguinte substitui a imagem do contentor nginx para a alterar
de "nginx:latest" para "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
Remover
A ação seguinte remove os requisitos de recursos para o contentor 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
Substituir
O elemento value é obrigatório para a operação replace e tem de ser um elemento JSON.
A ação seguinte substitui a imagem do contentor nginx de nginx:latest para 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
O campo fromPath é obrigatório para a operação move.
A ação seguinte remove as variáveis de ambiente do contentor nginx e adiciona-as ao contentor de inicialização 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
O campo fromPath é obrigatório para a operação copy.
A seguinte ação copia as variáveis de ambiente do contentor nginx para o contentor de inicialização 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 saber como definir regras de transformação na Google Cloud consola, consulte o artigo Planeie um conjunto de restauros.
Para definir regras de transformação através da CLI gcloud, crie um ficheiro que contenha uma matriz YAML de transformationRules e inclua o parâmetro --transformation-rules-file= no comando gcloud beta container backup-restore restore-plans create.
Exemplos de regras de transformação
Os exemplos seguintes são fornecidos no formato YAML usado pela CLI gcloud ou pela linguagem de configuração do Terraform.
Altere a StorageClass dos PVCs
Este exemplo altera a StorageClass em todos os recursos PersistentVolumeClaim restaurados de
standard para 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"
}
}
Clone um espaço de nomes
Este exemplo clona um espaço de nomes de alfa para beta, criando um novo espaço de nomes "beta" e restaurando todos os recursos de "alpha" para o novo espaço de nomes "beta". Este exemplo requer duas regras de transformação: uma para o próprio espaço de nomes e outra para os recursos no espaço de nomes.
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"
}
}
Altere a StorageClass dos PVCs e a contagem de réplicas num espaço de nomes clonado
Este exemplo clona um espaço de nomes e, em seguida, aplica um conjunto de alterações aos recursos no novo espaço de nomes:
Altere a StorageClass nos PVCs de
standardparapremium-rwoAltere a quantidade de réplicas da implementação
nginxpara3
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"
}
}
Altere, insira e remova entradas ConfigMap
Este exemplo modifica o ConfigMap que contém a chave da etiqueta "app.kubernetes.io/name"
no espaço de nomes "mysql" para:
Altere o valor da entrada
"endpoint"para"192.0.2.127".Inserir uma nova entrada
"connection-timeout"com o valor"30s".Remova a entrada com a chave
"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"
}
}
Adicione uma etiqueta app.kubernetes.io/name aos recursos cujo nome comece por mysql-;
Este exemplo adiciona uma etiqueta app.kubernetes.io/name com o valor mysql a todos os recursos cujo nome começa 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"
}
}
Atribua um endereço IP estático a um serviço do tipo LoadBalancer
Este exemplo atribui um endereço IP estático para o serviço "nginx-svc" no espaço de nomes "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"
}
}