Mengubah resource selama pemulihan


Halaman ini menjelaskan cara melakukan modifikasi pada resource Kubernetes selama proses pemulihan menggunakan aturan transformasi. Aturan transformasi dimaksudkan sebagai peningkatan dari fitur sebelumnya yang disebut aturan substitusi. Karena keduanya tidak kompatibel dengan aturan substitusi, antarmuka aturan substitusi yang tidak digunakan lagi masih tersedia.

Untuk melihat dokumentasi aturan penggantian, lihat Mengubah resource selama pemulihan.

Ringkasan

Ada beberapa alasan mengapa Anda perlu mengubah resource Kubernetes sebagai bagian dari proses pemulihan:

  • Anda mungkin ingin membuat PersistentVolumeClaim (PVC) menggunakan penyedia penyimpanan yang berbeda. Misalnya, Anda ingin beralih dari driver in-tree Kubernetes ke driver CSI.

  • Anda mungkin ingin memulihkan namespace dengan nama yang berbeda.

  • Anda mungkin ingin menambahkan, mengubah, atau menghapus nilai yang terkait dengan label atau kunci ConfigMap.

  • Anda dapat mengubah jumlah replika di Deployment atau StatefulSet.

Pencadangan untuk GKE menyediakan mekanisme untuk membuat perubahan ini yang disebut aturan transformasi, yang dapat Anda tentukan secara opsional sebagai bagian dari RestorePlan.

Dalam proses pemulihan, aturan transformasi berfungsi sebagai berikut:

  1. Aturan diatur ke dalam daftar yang diurutkan.

  2. Semua resource—kecuali resource CustomResourceDefinition, yang transformasinya tidak tersedia—akan dipulihkan dipindahkan secara berurutan melalui daftar aturan ini.

  3. Setiap aturan berisi deskripsi singkat, kriteria yang cocok, dan pengeditan referensi.

  4. Jika resource tidak cocok dengan kriteria aturan, resource tersebut akan dipindahkan ke aturan berikutnya dalam daftar tanpa modifikasi.

  5. Jika resource cocok dengan kriteria aturan, hasil edit aturan akan diterapkan ke resource sebelum berpindah ke aturan berikutnya dalam daftar.

  6. Jika beberapa aturan ditentukan, kriteria pencocokan setiap aturan dievaluasi terhadap versi resource yang dimodifikasi oleh aturan sebelumnya.

  7. Versi akhir resource, setelah pengeditan aturan yang cocok diterapkan, akan dibuat di cluster.

Parameter aturan transformasi

Anda membuat aturan transformasi dengan menyediakan informasi berikut:

  • description: Ini adalah deskripsi singkat dari aturan transformasi.

  • resourceFilter: Filter ini digunakan untuk mencocokkan dengan resource. Jika tidak ada resourceFilter yang disediakan, semua resource cocok dengan aturan ini.

  • fieldActions: Ini adalah daftar pengeditan yang akan dilakukan pada resource yang cocok dengan resourceFilter. Hasil edit diberikan sebagai daftar tindakan yang diurutkan. Urutan penting di sini karena hasil dari satu tindakan dapat memengaruhi tindakan berikutnya dalam daftar. Jika ada tindakan yang gagal, seluruh pemulihan akan gagal.

Filter resource (resourceFilter)

Untuk mendefinisikan filter resource, berikan parameter berikut:

Parameter Wajib Deskripsi
namespaces opsional Daftar ini merupakan daftar namespace. Agar cocok dengan aturan ini, resource harus berupa resource dengan namespace dan memiliki salah satu namespace yang ditentukan. Jika tidak ada yang disediakan untuk parameter ini, semua resource akan cocok (semua resource dengan namespace dan cakupan cluster).
groupKinds opsional Berikut adalah daftar tuple Group/Kind resource Kubernetes:
  • Jika tidak ada yang disediakan untuk parameter ini, semua resource akan cocok tanpa batasan berdasarkan Group/Kind.
  • Jika satu atau beberapa Group/Kind disediakan, resource harus cocok dengan salah satu resource tersebut agar cocok dengan aturan.
  • Untuk mencocokkan dengan resource inti, gunakan grup kosong ("").
jsonPath opsional Ini adalah ekspresi JSONPath yang digunakan untuk mencocokkan dengan resource.

JSONPath (jsonPath)

Ekspresi JSONPath digunakan untuk mencocokkan dengan resource. Jika hasil ekspresi tidak kosong terhadap sebuah resource, resource ini akan dianggap cocok.

Dengan resource berikut:

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

Contoh penggunaan ekspresi JSONPath:

Ekspresi Deskripsi Hasil
.metadata[?(@.name == 'mysql-cm')] Objek metadata berisi kunci name dan nilainya adalah "mysql-cm" [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] Nilai string kunci "app.kubernetes.io/name" di bagian metadata.labels [
 "mysql"
]
.data['primary\.cnf'] Nilai objek kunci "primary.cnf" di bawah data [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] Objek metadata berisi kunci name dan nilainya cocok dengan ekspresi reguler "/^mysql-.*/i".
Garis miring / digunakan untuk membatasi pola ekspresi reguler. i di akhir ekspresi reguler adalah tanda untuk pencocokan yang tidak peka huruf besar/kecil.
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

Selama output ekspresi JSONPath tidak kosong, resource yang sesuai akan cocok dengan aturan ini. Dengan demikian, .metadata[?(@.name == 'mysql-cm')] dan .metadata[?(@.name == 'mysql-cm')].name menghasilkan hasil pencocokan yang sama, yaitu cocok dengan resource yang .metadata.name-nya adalah "mysql-cm".

Saat filter digunakan di JSONPath untuk mencocokkan kunci dalam peta di Konsol Google Cloud, . (titik) harus di-escape menggunakan \ (garis miring terbalik). Jika JSONPath diberikan dalam konteks YAML menggunakan gcloud CLI atau Terraform Language, diperlukan \\ (garis miring terbalik ganda). Misalnya, .metadata.labels['app\.kubernetes\.io/name'] setara dengan .metadata.labels['app\\.kubernetes\\.io/name'] dalam YAML atau Terraform.

Sebaiknya gunakan alat evaluator JSONPath dengan dukungan ekspresi reguler untuk menguji ekspresi sebelum digunakan. Anda juga dapat menggunakan kubectl untuk memverifikasi hasil ekspresi JSONPath. Lihat Dukungan JSONPath untuk mengetahui contoh lainnya.

Tindakan kolom (fieldActions)

Tindakan kolom dimodelkan berdasarkan Patch JSON, yang menentukan struktur dokumen JSON untuk mengekspresikan operasi yang akan diterapkan ke dokumen JSON. Untuk menentukan tindakan kolom, parameter berikut diperlukan:

  • path: Ini adalah nilai Pointer JSON yang merujuk pada lokasi di resource target tempat operasi dijalankan. Pointer JSON selalu dimulai dengan / (garis miring), dan nama properti (kunci) yang menurun ke elemen turunan juga dipisahkan dengan / (garis miring).

  • op: Ini adalah jenis operasi yang dijalankan terhadap resource, lima operasi didukung:

    • add menyisipkan objek atau nilai baru ke path yang ditentukan, bergantung pada apa yang dirujuk path.
    • remove menghapus nilai dari path yang ditentukan.
    • replace mengganti nilai pada path yang ditentukan dengan nilai baru.
    • move menghapus nilai dari lokasi dan menambahkannya ke path yang ditentukan.
    • copy menyalin nilai dari lokasi ke path yang ditentukan.

Anda dapat menemukan contoh setiap operasi, menggunakan definisi Pod berikut:

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

Tambahkan

value selalu wajib untuk operasi add, dan harus berupa elemen JSON resmi.

Tindakan berikut ini menambahkan variabel lingkungan baru "PORT" dengan nilai "80" ke penampung nginx.

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

Asli

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

Ditransformasi

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

Tindakan berikut menambahkan nilai ke label baru app.kubernetes.io/name: nginx ke Pod.

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

Asli

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

Ditransformasi

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

Tindakan berikut menggantikan image penampung nginx untuk mengubahnya dari "nginx:latest" menjadi "nginx:stable".

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

Asli

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

Ditransformasi

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

Hapus

Tindakan berikut menghapus persyaratan resource untuk penampung nginx.

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

Asli

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

Ditransformasi

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

Ganti

value diperlukan untuk operasi replace, dan harus berupa elemen JSON.

Tindakan berikut mengganti image penampung nginx dari nginx:latest menjadi nginx:stable.

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

Asli

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

Ditransformasi

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

Pindahkan

fromPath diperlukan untuk operasi move.

Tindakan berikut menghapus variabel lingkungan dari penampung nginx dan menambahkannya ke penampung init install.

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

Asli

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

Ditransformasi

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

Salin

fromPath diperlukan untuk operasi copy.

Tindakan berikut menyalin variabel lingkungan dari penampung nginx ke penampung init install.

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

Asli

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

Ditransformasi

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

Untuk mempelajari lebih lanjut cara menentukan aturan transformasi di Konsol Google Cloud, lihat Merencanakan kumpulan pemulihan.

Untuk menentukan aturan transformasi melalui gcloud CLI, buat file yang berisi array YAML dari transformationRules dan sertakan parameter --transformation-rules-file= dalam perintah gcloud beta container backup-restore restore-plans create.

Contoh aturan transformasi

Contoh berikut disediakan dalam format YAML yang digunakan oleh gcloud CLI atau Terraform Configuration Language.

Ubah StorageClass PVC

Contoh ini mengubah StorageClass di semua resource PersistentVolumeClaim yang dipulihkan dari standard menjadi 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"
  }
}

Meng-clone Namespace

Contoh ini meng-clone namespace dari alfa ke beta—membuat "beta" namespace baru dan memulihkan semua resource dari "alpha" ke namespace "beta" baru. Contoh ini memerlukan dua aturan transformasi, yaitu satu untuk namespace itu sendiri dan satu untuk resource di dalam namespace.

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

Mengubah StorageClass PVC dan jumlah replika di namespace yang di-clone

Contoh ini meng-clone namespace, lalu menerapkan serangkaian perubahan pada resource dalam namespace baru:

  • Mengubah StorageClass pada PVC dari standard menjadi premium-rwo

  • Ubah jumlah replika Deployment nginx menjadi 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"
  }
}

Mengubah, menyisipkan, dan menghapus entri ConfigMap

Contoh ini mengubah ConfigMap yang berisi kunci label "app.kubernetes.io/name" dalam "mysql" namespace untuk:

  • Ubah nilai entri "endpoint" menjadi "192.0.2.127".

  • Masukkan entri baru "connection-timeout" dengan nilai "30s".

  • Hapus entri dengan kunci "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"
  }
}

Tambahkan label app.kubernetes.io/name ke resource yang namanya diawali dengan mysql-;

Contoh ini menambahkan label app.kubernetes.io/name dengan nilai mysql ke semua resource yang namanya diawali dengan 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"
  }
}

Menetapkan alamat IP statis untuk Service jenis LoadBalancer

Contoh ini menetapkan alamat IP statis untuk "nginx-svc" Layanan di "nginx" namespace:

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