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 na mesma 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 Google Cloud consola, o .
(ponto) tem de
ser evitado 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 Apoio técnico 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:add
insere um novo objeto ou valor nopath
especificado, consoante o que opath
referencia.remove
remove o valor dopath
especificado.replace
substitui o valor nopath
especificado por um novo valor.move
remove o valor de uma localização e adiciona-o aopath
especificado.copy
copia o valor de uma localização para opath
especificado.
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 ação seguinte copia as variáveis de ambiente do contentor nginx
para o contentor install
init.
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
standard
parapremium-rwo
Altere a quantidade de réplicas da implementação
nginx
para3
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"
}
}