Modifica le risorse durante il ripristino


Questa pagina descrive come apportare modifiche alle risorse Kubernetes durante il processo di ripristino tramite le regole di trasformazione. Le regole di trasformazione sono destinate come miglioramento rispetto a una precedente funzionalità chiamata regole di sostituzione. Poiché non sono compatibili con le versioni precedenti delle regole di sostituzione, l'interfaccia delle regole di sostituzione ritirata è ancora disponibile.

Per visualizzare la documentazione relativa alle regole di sostituzione, consulta Modificare le risorse durante il ripristino.

Panoramica

Esistono diversi motivi per cui potrebbe essere utile modificare le risorse Kubernetes parte del processo di ripristino:

  • Potresti voler creare un oggetto PersistentVolumeClaim (PVC) utilizzando un il provisioner dello spazio di archiviazione. Ad esempio, vuoi passare dalla struttura ad albero di Kubernetes il conducente al conducente CSI.

  • Potresti voler ripristinare uno spazio dei nomi con un nome diverso.

  • Potresti voler aggiungere, modificare o eliminare il valore associato a un'etichetta o a una chiave ConfigMap.

  • Potrebbe essere utile modificare il conteggio delle repliche in un oggetto Deployment o StatefulSet.

Backup per GKE fornisce un meccanismo per apportare queste modifiche chiamato regole di trasformazione, che puoi facoltativamente definire all'interno di un RestorePlan.

Durante il processo di ripristino, le regole di trasformazione funzionano nel seguente modo:

  1. Le regole sono organizzate in un elenco ordinato.

  2. Tutte le risorse, ad eccezione di CustomResourceDefinition, per le quali non sono disponibili trasformazioni, devono essere ripristinare e spostare in sequenza l'elenco di regole.

  3. Ogni regola contiene una breve descrizione, criteri di corrispondenza e modifiche alle risorse.

  4. Se una risorsa non corrisponde ai criteri di una regola, passa alla regola successiva nell'elenco senza alcuna modifica.

  5. Se una risorsa corrisponde ai criteri di una regola, le relative modifiche vengono applicate alla risorsa prima che questa passi alla regola successiva nell'elenco.

  6. Se sono definite più regole, i criteri di corrispondenza di ogni regola vengono valutati in base alla versione della risorsa modificata dalle regole precedenti.

  7. La versione finale della risorsa, dopo l'applicazione delle modifiche di una regola corrispondente, è quella che viene creata nel cluster.

Parametri delle regole di trasformazione

Per creare una regola di trasformazione, fornisci le seguenti informazioni:

  • description: questa è una breve descrizione della regola di trasformazione.

  • resourceFilter: questo filtro viene utilizzato per trovare corrispondenze con le risorse. Se non viene fornito alcun valore resourceFilter, tutte le risorse corrispondono a questa regola.

  • fieldActions: questo è un elenco di modifiche da apportare alle risorse corrispondenti al resourceFilter. Le modifiche vengono fornite sotto forma di elenco ordinato di azioni. L'ordine è importante perché il risultato di un'azione può influire sull'azione successiva nell'elenco. Se un'azione non va a buon fine, l'intero ripristino non va a buon fine.

Filtro risorse (resourceFilter)

Per definire un filtro delle risorse, fornisci i seguenti parametri:

Parametro Obbligatorio Descrizione
namespaces facoltativo Questo è un elenco di spazi dei nomi. Affinché una risorsa corrisponda a questa regola, deve essere una risorsa con spazio dei nomi e avere uno degli spazi dei nomi specificati. Se non viene fornito nulla per questo parametro, verranno trovate corrispondenze per tutte le risorse (tutte le risorse con spazio dei nomi e con ambito cluster).
groupKinds facoltativo Questo è un elenco delle tuple Group/Kind delle risorse Kubernetes:
  • Se non viene fornito nulla per questo parametro, tutte le risorse corrisponderanno senza restrizioni in base a Group/Kind.
  • Se vengono fornite una o più Group/Kind, le risorse devono corrispondere a uno di questi per ottenere una corrispondenza con la regola.
  • Per trovare una corrispondenza con le risorse principali, utilizza un gruppo ("") vuoto.
jsonPath facoltativo Si tratta di un'espressione JSONPath utilizzata per la corrispondenza con le risorse.

JSONPath (jsonPath)

Un'espressione JSONPath viene utilizzata per trovare corrispondenze con le risorse. Se il risultato dell'espressione non è vuoto per una risorsa, questa risorsa è considerata corrispondente.

Data la seguente risorsa:

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

Esempio di utilizzo di espressioni JSONPath:

Espressione Descrizione Risultato
.metadata[?(@.name == 'mysql-cm')] L'oggetto metadata contiene la chiave name e il suo valore è "mysql-cm" [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] Il valore stringa della chiave "app.kubernetes.io/name" in metadata.labels [
 "mysql"
]
.data['primary\.cnf'] Il valore dell'oggetto della chiave "primary.cnf" in data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] L'oggetto metadata contiene la chiave name e il suo valore corrisponde all'espressione regolare "/^mysql-.*/i".
Le barre / vengono utilizzate per delimitare i normali di espressione di base. Il carattere i alla fine dell'espressione regolare è il flag per la corrispondenza senza distinzione tra maiuscole e minuscole.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

Finché l'output dell'espressione JSONPath non è vuoto, la risorsa corrispondente corrisponderà a questa regola. Pertanto, .metadata[?(@.name == 'mysql-cm')] e .metadata[?(@.name == 'mysql-cm')].name hanno lo stesso risultato di corrispondenza, ovvero corrispondono alla risorsa il cui .metadata.name è "mysql-cm".

Quando il filtro viene utilizzato in JSONPath per trovare una corrispondenza con una chiave in una mappa nella console Google Cloud, il punto . deve essere sfuggito utilizzando \ (barra). Se il JSONPath viene fornito nel contesto di YAML utilizzando gcloud CLI o Linguaggio Terraform, sono necessari \\ (doppie barre rovesciate). Ad esempio, .metadata.labels['app\.kubernetes\.io/name'] è equivalente a .metadata.labels['app\\.kubernetes\\.io/name'] in YAML o Terraform.

Ti consigliamo di utilizzare uno strumento di valutazione JSONPath con supporto per le espressioni regolari per testare l'espressione prima dell'uso. Puoi anche utilizzare kubectl per verificare il risultato delle espressioni JSONPath. Per altri esempi, consulta la pagina Assistenza JSONPath.

Azione campo (fieldActions)

Le azioni sui campi sono modellate in base a JSON Patch, che definisce una struttura del documento JSON per esprimere un'operazione da applicare a un documento JSON. Per definire un'azione sul campo: i seguenti parametri sono obbligatori:

  • path: si tratta di un valore del puntatore JSON che fa riferimento la località nelle risorse di destinazione in cui viene eseguita l'operazione. I puntatori JSON iniziano sempre con una / (barra), e i nomi delle proprietà (chiavi) scendono in elementi secondari sono anch'essi separati da una / (barra).

  • op: si tratta del tipo di operazione eseguita sulle risorse. Sono supportate cinque operazioni:

    • add inserisce un nuovo oggetto o valore nell'elemento path specificato, a seconda di ciò a cui fa riferimento path.
    • remove rimuove il valore dal valore path specificato.
    • replace sostituisce il valore in path specificato con un nuovo valore.
    • move rimuove il valore da una posizione e lo aggiunge a path specificato.
    • copy copia il valore da una posizione a path specificato.

Puoi trovare esempi di ogni operazione utilizzando la seguente definizione di 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"
        ]
      }
    ]
  }
}

Aggiungi

value è sempre obbligatorio per le operazioni add e deve essere un elemento JSON legale.

La seguente azione aggiunge una nuova variabile di ambiente "PORT" con valore "80" al contenitore nginx.

op: add
path: "/spec/containers/0/env/0"
value: >
  {
    "name": "PORT",
    "value": "80"
  }

Originale

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

Trasformati

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 seguente azione aggiunge valore a una nuova etichetta app.kubernetes.io/name: nginx al pod.

op: add
path: "/metadata/labels/app.kubernetes.io~1name"
value: "nginx"

Originale

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

Trasformati

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 seguente azione sostituisce l'immagine del contenitore nginx per cambiarla da "nginx:latest" a "nginx:stable".

op: add
path: "/spec/containers/0/image"
value: nginx:stable

Originale

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

Trasformati

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

Rimuovi

La seguente azione rimuove i requisiti delle risorse per il contenitore nginx.

op: remove
path: "/spec/containers/0/resources"

Originale

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

Trasformati

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

Sostituisci

value è obbligatorio per le operazioni replace e deve essere un elemento JSON.

La seguente azione sostituisce l'immagine del contenitore nginx da nginx:latest a nginx:stable.

op: replace
path: "/spec/containers/0/image"
value: nginx:stable

Originale

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

Trasformati

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

Sposta

fromPath è obbligatorio per l'operazione move.

L'azione seguente rimuove le variabili di ambiente dal contenitore nginx e aggiunge nel container di inizializzazione install.

op: move
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

Originale

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

Trasformati

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

Copia

fromPath è obbligatorio per le operazioni copy.

La seguente azione copia le variabili di ambiente dal contenitore nginx al contenitore init install.

op: copy
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

Originale

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

Trasformati

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

Per scoprire di più sulla definizione delle regole di trasformazione nella console Google Cloud, consulta Pianificare un insieme di ripristini.

Per definire le regole di trasformazione tramite gcloud CLI, crea un file contenente un array YAML di transformationRules e includi il parametro --transformation-rules-file= nel comando gcloud beta container backup-restore restore-plans create.

Esempi di regole di trasformazione

I seguenti esempi sono forniti nel formato YAML utilizzato dall'interfaccia a riga di comando gcloud o dal linguaggio di configurazione Terraform.

Modifica StorageClass delle PVC

Questo esempio modifica la classe StorageClass in tutte le risorse PersistentVolumeClaim ripristinate da 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"
  }
}

Clonare uno spazio dei nomi

Questo esempio clona uno spazio dei nomi da alpha a beta, creando un nuovo spazio dei nomi "beta" e ripristinando tutte le risorse da "alpha" nel nuovo "beta". Questo esempio richiede due regole di trasformazione: una per lo spazio dei nomi stesso e una per le risorse all'interno dello spazio dei nomi.

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

Modifica StorageClass di PVC e numero di repliche in uno spazio dei nomi clonato

Questo esempio clona uno spazio dei nomi e poi applica un insieme di modifiche a risorse nel nuovo spazio dei nomi:

  • Modifica StorageClass sui PVC da standard a premium-rwo

  • Modifica il numero di repliche del deployment nginx in 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"
  }
}

Modifica, inserisci e rimuovi voci ConfigMap

Questo esempio modifica ConfigMap che contiene la chiave dell'etichetta "app.kubernetes.io/name" nello spazio dei nomi "mysql" in modo da:

  • Modifica il valore della voce "endpoint" in "192.0.2.127".

  • Inserisci una nuova voce "connection-timeout" con il valore "30s".

  • Rimuovi la voce con la chiave "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"
  }
}

Aggiungi un'etichetta app.kubernetes.io/name alle risorse il cui nome inizia con mysql-;

Questo esempio aggiunge un'etichetta app.kubernetes.io/name con il valore mysql a tutte le risorse il cui nome inizia 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"
  }
}

Assegna un indirizzo IP statico per un servizio di tipo LoadBalancer

Questo esempio assegna un indirizzo IP statico per il servizio "nginx-svc" in lo spazio dei nomi "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"
  }
}