Modifique recursos durante o restauro


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:

  1. As regras estão organizadas numa lista ordenada.

  2. 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.

  3. Cada regra contém uma breve descrição, critérios de correspondência e edições de recursos.

  4. Se um recurso não corresponder aos critérios de uma regra, passa para a regra seguinte na lista sem modificação.

  5. 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.

  6. 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.

  7. 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 nenhum resourceFilter, todos os recursos correspondem a esta regra.

  • fieldActions: esta é uma lista de edições a fazer aos recursos que correspondem ao resourceFilter. 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
  • Se não for fornecido nada para este parâmetro, todos os recursos vão corresponder sem restrições com base no Group/Kind.
  • Se forem fornecidos um ou mais Group/Kind, os recursos têm de corresponder a um deles para corresponderem à regra.
  • Para fazer a correspondência com recursos principais, use um grupo vazio ("").
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" [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] O valor da string da chave "app.kubernetes.io/name" em metadata.labels [
 "mysql"
]
.data['primary\.cnf'] O valor do objeto da chave "primary.cnf" em data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.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.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

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 no path especificado, consoante o que o path referencia.
    • remove remove o valor do path especificado.
    • replace substitui o valor no path especificado por um novo valor.
    • move remove o valor de uma localização e adiciona-o ao path especificado.
    • copy copia o valor de uma localização para o path 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 para premium-rwo

  • Altere a quantidade de réplicas da implementação nginx para 3

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"
  }
}