Skip to content

Kustomize Patches - inna metoda zmiany parametrów manifestów z Kustomize

Patches umożliwiają bardziej szczegółowy rodzaj zmiany parametrów w overlayach w stosunku do oryginalnych szablonów bazowych z użyciem Kustomize.

Trzy parametry muszą być podane podczas tworzenia Patch'a: - Rodzaj operacji (add/remove/replace) - Co będzie zmieniane: - Kind - Version - Group - Name - Namespace - labelSelector - annotationSelector - Wartość (Value) - Jaka nowa wartość będzie ustawiona (przy operacji add/replace)

Dwa rodzaje Patch'y: - Json 6902 Patch

patches:
    - target:
          kind: <rodzaj_zasobu,np.Deployment>
          name: <nazwa_zasobu, np. nginx-deployment>
      patch: | -
          - op: <operacja-add/replace/delete>
            path: <ścieżka_w_manifeście,np./spec/replicas>
            value: <nowa_wartość_atrybutu>

  • Strategic Merge Patch Polega to na tym, że po prostu podajemy część zasobu (manifestu), która ma być zmieniona w danym Patchu.

Po prostu wrzucamy część manifestu, np. Deployment, plik kustomization.yaml:

patches:
    - patch: | -
        apiVersion: apps/v1
        kind: Deployment
        metadata:
            name: nginx-deployment
        spec:
            replicas: 1

lub z użyciem oddzielnego pliku: plik kustomize.yaml:

resources:
  - nginx-service.yaml

patches:
  - path: nginx-deployment-patch.yaml

i nginx-deployment-patch.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  template:
    spec:
      containers:
        - name: web
          image: nginx:latest

Dodajemy tylko potrzebne pola - do zdefiniowania w tym przypadku Deploymentu, zmieniony został obraz kontenera w Podzie.

Przykład użycia

Zmiana wartości replicas w Deployment z użyciem Json 6902 Patch

Przykładowy Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 1
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Patch w Kustomize, plik kustomization.yaml:

patches:
    - target:
          kind: Deployment
          name: nginx-deployment
      patch: | -
          - op: replace
            path: /spec/replicas # lokalizacja w manifeście, patrz na manifest (spec.replicas)
            value: 4

Deployment po zmianie:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Zmiana parametru - operacja na liście list

Deployment przed zmianami:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Patch w Kustomize (kustomization.yaml):

patches:
    - target:
          kind: Deployment
          name: nginx-deployment
      patch: | -
          - op: replace
            path: /spec/template/spec/containers/0 # obiekt w słowniku, który z kolei
            value:
                name: grafana
                image: grafana

Deployment po zmianach:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: grafana
                  image: grafana

Dodawanie parametru - operacja na liście list

Deployment przed zmianami:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Patch w Kustomize (kustomization.yaml):

patches:
    - target:
          kind: Deployment
          name: nginx-deployment
      patch: | -
          - op: replace
            path: /spec/template/spec/containers/- # specjalnie "-" jako koniec listy
            value:
                name: grafana
                image: grafana

Deployment po zmianach:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: grafana
                  image: grafana
                - name: grafana
                  image: grafana

Usuwanie parametru - operacja na słowniku (dict)

Zrobimy to na przykładzie pola spec.metadata.labels.

Deployment przed zmianami:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
                type: frontend
        spec:
            containers:
                - name: nginx
                  image: nginx

Plik kustomization.yaml

patches:
    - target:
        kind: Deployment
        name: nginx-deployment
      patch: | -
          - op: remove
            path: /spec/template/metadata/labels/type

Deployment po zmianach:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Usuwanie parametru - operacja na liście (list)

Deployment przed zmianami:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx
                - name: sidecar
                  image: fluent-bit 

Patch w Kustomize (kustomization.yaml):

patches:
    - target:
          kind: Deployment
          name: nginx-deployment
      patch: | -
          - op: remove
            path: /spec/template/spec/containers/1

Deployment po zmianach:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 4
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx

Usuwanie parametru (z użyciem) Strategic Merge Patch

Usuwanie kontenera z listy kontenerów wewnątrz Poda

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: api
  template:
    metadata:
      labels:
        component: api
    spec:
      containers:
        - $patch: delete
          name: memcached

Kontener o nazwie memcached zostanie usunięty.