Modifier des ressources pendant une restauration


Cette page explique comment modifier des ressources Kubernetes pendant le processus de restauration à l'aide de règles de transformation. Les règles de transformation visent à apporter une amélioration par rapport à une fonctionnalité précédente appelée règles de substitution. Comme elles ne sont pas rétrocompatibles avec les règles de substitution, l'interface des règles de substitution obsolètes est toujours disponible.

Pour afficher la documentation sur les règles de substitution, consultez la section Modifier des ressources lors de la restauration.

Présentation

Plusieurs raisons peuvent vous pousser à modifier des ressources Kubernetes dans le cadre du processus de restauration :

  • Vous pouvez créer un objet PersistentVolumeClaim (PVC) à l'aide d'un autre approvisionneur de stockage. Par exemple, vous souhaitez passer du pilote "in-tree" de Kubernetes au pilote CSI.

  • Vous souhaitez restaurer un espace de noms sous un autre nom.

  • Vous pouvez ajouter, modifier ou supprimer la valeur associée à une étiquette ou à une clé ConfigMap.

  • Vous souhaitez modifier le nombre d'instances répliquées dans une installation exécutée en tant que Deployment ou StatefulSet.

Sauvegarde pour GKE fournit un mécanisme permettant d'effectuer ces modifications, appelé règles de transformation, que vous pouvez éventuellement définir dans le cadre d'un RestorePlan.

Dans le processus de restauration, les règles de transformation fonctionnent comme suit :

  1. Les règles sont organisées sous forme de liste numérotée.

  2. Toutes les ressources, à l'exception des ressources CustomResourceDefinition pour lesquelles les transformations ne sont pas disponibles, peuvent être restaurées de manière séquentielle via cette liste de règles.

  3. Chaque règle contient une brève description, des critères de correspondance et des modifications de ressources.

  4. Si une ressource ne correspond pas aux critères d'une règle, elle passe à la règle suivante sans modification.

  5. Si une ressource correspond aux critères d'une règle, les modifications de la règle sont appliquées à la ressource avant de passer à la règle suivante de la liste.

  6. Si plusieurs règles sont définies, les critères de correspondance de chaque règle sont évalués en fonction de la version de la ressource modifiée par les règles précédentes.

  7. La version finale de la ressource, après application des modifications de la règle correspondante, est celle créée dans le cluster.

Paramètres d'une règle de transformation

Vous créez une règle de transformation en fournissant les informations suivantes :

  • description : courte description de la règle de transformation.

  • resourceFilter : ce filtre permet de mettre en correspondance les ressources. Si aucun resourceFilter n'est fourni, toutes les ressources correspondent à cette règle.

  • fieldActions : liste des modifications à apporter aux ressources correspondant au resourceFilter. Les modifications sont fournies sous la forme d'une liste numérotée d'actions. L'ordre est important, car le résultat d'une action peut affecter l'action suivante de la liste. Si une action échoue, l'intégralité de la restauration échoue.

Filtre de ressource (resourceFilter)

Pour définir un filtre de ressource, vous devez fournir les paramètres suivants :

Paramètre Obligatoire Description
namespaces facultatif Il s'agit d'une liste d'espaces de noms. Pour qu'une ressource corresponde à cette règle, il doit s'agir d'une ressource associée à un espace de noms, et celui-ci doit correspondre à l'un des espaces de noms donnés. Si rien n'est spécifié pour ce paramètre, toutes les ressources correspondent (toutes les ressources sont des ressources associées à un espace de noms et des ressources à l'échelle d'un cluster).
groupKinds facultatif Voici une liste de tuples de ressources Kubernetes Group/Kind :
  • Si rien n'est spécifié pour ce paramètre, toutes les ressources correspondent, sans restriction sur la base de Group/Kind.
  • Si un ou plusieurs Group/Kind sont spécifiés, les ressources doivent correspondre à l'un d'entre eux pour correspondre à la règle.
  • Pour mettre en correspondance les ressources principales, utilisez un groupe vide ("").
jsonPath facultatif Il s'agit d'une expression JSONPath utilisée pour mettre en correspondance des ressources.

JSONPath (jsonPath)

Une expression JSONPath permet de mettre en correspondance les ressources. Si le résultat de l'expression n'est pas vide par rapport à une ressource, cette ressource est considérée comme correspondante.

Compte tenu de la ressource suivante :

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

Exemple d'utilisation d'expressions JSONPath :

Expression Description Résultat
.metadata[?(@.name == 'mysql-cm')] L'objet metadata contient la clé name et sa valeur est "mysql-cm". [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] Valeur de chaîne de la clé "app.kubernetes.io/name" sous metadata.labels [
 "mysql"
]
.data['primary\.cnf'] Valeur d'objet de la clé "primary.cnf" sous data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] L'objet metadata contient la clé name et sa valeur correspond à l'expression régulière "/^mysql-.*/i".
Les barres obliques / permettent de délimiter le modèle d'expression régulière. La lettre i à la fin de l'expression régulière est l'option permettant de définir une correspondance non sensible à la casse.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

Tant que le résultat de l'expression JSONPath n'est pas vide, la ressource correspondante correspond à cette règle. Ainsi, .metadata[?(@.name == 'mysql-cm')] et .metadata[?(@.name == 'mysql-cm')].name génèrent le même résultat correspondant, qui correspond à la ressource dont le champ .metadata.name est défini sur "mysql-cm".

Lorsque le filtre est utilisé dans JSONPath pour correspondre à une clé d'un mappage dans la console Google Cloud, . (point) doit être échappé à l'aide d'une \ (barre oblique inverse). Si le chemin JSONPath est fourni dans le contexte de YAML à l'aide de gcloud CLI ou du langage Terraform, des barres obliques inverses (\\) sont nécessaires. Par exemple, .metadata.labels['app\.kubernetes\.io/name'] correspond à .metadata.labels['app\\.kubernetes\\.io/name'] dans YAML ou Terraform.

Nous vous recommandons d'utiliser un outil d'évaluation JSONPath compatible avec les expressions régulières pour tester l'expression avant toute utilisation. Vous pouvez également utiliser kubectl pour vérifier le résultat des expressions JSONPath. Pour plus d'exemples, consultez la page Assistance JSONPath.

Action de champ (fieldActions)

Les actions de champ sont modélisées en fonction d'un correctif JSON, qui définit une structure de documents JSON permettant d'exprimer une opération à appliquer à un document JSON. Pour définir une action de champ, les paramètres suivants sont requis :

  • path : valeur de pointeur JSON faisant référence à l'emplacement dans les ressources cibles où l'opération est effectuée. Les valeurs de pointeur JSON commencent toujours par une barre oblique (/), et les noms de propriété (clés) descendent dans les éléments enfants, séparés par une barre oblique (/).

  • op : correspond au type d'opération effectuée sur les ressources. Cinq opérations sont acceptées :

    • add insère un nouvel objet ou une nouvelle valeur dans le path spécifié, en fonction des valeur référencées par le path.
    • remove supprime la valeur du path spécifié.
    • replace remplace la valeur du path spécifié par une nouvelle valeur.
    • move supprime la valeur d'un emplacement et l'ajoute au path spécifié.
    • copy copie la valeur d'un emplacement dans le path spécifié.

Vous pouvez trouver des exemples de chaque opération en utilisant la définition de pod suivante :

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

Ajouter

value est toujours requis pour les opérations add et doit être un élément JSON légal.

Cette action ajoute une variable d'environnement "PORT" avec la valeur "80" au conteneur nginx.

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

Données

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

Transformé

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

L'action suivante ajoute une valeur à une nouvelle étiquette app.kubernetes.io/name: nginx au pod.

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

Données

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

Transformé

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

L'action suivante remplace l'image du conteneur nginx pour la faire passer de "nginx:latest" à "nginx:stable".

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

Données

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

Transformé

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

Supprimer

L'action suivante supprime les ressources nécessaires du conteneur nginx.

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

Données

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

Transformé

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

Remplacer

value est requis pour l'opération replace. Il doit s'agir d'un élément JSON.

L'action suivante remplace l'image du conteneur nginx nginx:latest par nginx:stable.

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

Données

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

Transformé

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

Déplacer

fromPath est requis pour l'opération move.

L'action suivante supprime les variables d'environnement du conteneur nginx et les ajoute au conteneur d'initialisation install.

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

Données

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

Transformé

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

Copier

fromPath est requis pour l'opération copy.

L'action suivante copie les variables d'environnement du conteneur nginx vers le conteneur d'initialisation install.

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

Données

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

Transformé

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

Pour en savoir plus sur la définition des règles de substitution dans la console Google Cloud, consultez la page Planifier un ensemble de restaurations.

Pour définir des règles de transformation via gcloud CLI, créez un fichier contenant un tableau YAML de transformationRules et incluez le paramètre --transformation-rules-file= dans la commande gcloud beta container backup-restore restore-plans create.

Exemples de règles de transformation

Les exemples suivants sont fournis au format YAML utilisé par gcloud CLI ou le langage de configuration Terraform.

Modifier la StorageClass des PVC

Cet exemple modifie la StorageClass dans toutes les ressources PersistentVolumeClaim restaurées pour la faire passer de standard à 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"
  }
}

Cloner un espace de noms

Cet exemple clone un espace de noms de la version alpha à la version bêta. Pour ce faire, créez un espace de noms "beta" et restaurez toutes les ressources de "alpha" dans le nouvel espace de noms "beta". Cet exemple nécessite deux règles de transformation : une pour l'espace de noms lui-même et une pour les ressources qu'il contient.

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

Modifier la StorageClass des PVC et le nombre d'instances répliquées dans un espace de noms cloné

Cet exemple clone un espace de noms, puis applique un ensemble de modifications aux ressources dans le nouvel espace de noms :

  • Modifiez la ressource StorageClass sur les PVC de standard en premium-rwo.

  • Remplacez le nombre d'instances répliquées du déploiement nginx par 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"
  }
}

Modifier, insérer et supprimer des entrées ConfigMap

Cet exemple modifie le fichier ConfigMap contenant la clé d'étiquette "app.kubernetes.io/name" dans l'espace de noms "mysql" pour :

  • Remplacer la valeur de l'entrée "endpoint" par "192.0.2.127".

  • Insérer une nouvelle entrée "connection-timeout" avec la valeur "30s".

  • Supprimer l'entrée contenant la clé "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"
  }
}

Ajouter une étiquette app.kubernetes.io/name aux ressources dont le nom commence par mysql-

Cet exemple ajoute une étiquette app.kubernetes.io/name avec la valeur mysql à toutes les ressources dont le nom commence par 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"
  }
}

Attribuer une adresse IP statique pour un service de type LoadBalancer

Cet exemple attribue une adresse IP statique au service "nginx-svc" dans l'espace de noms "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"
  }
}