[Book] GitOps Cookbook: 04. Kustomize


Делаю:
2025.11.26


Репо проекта:
https://github.com/gitops-cookbook/pacman-kikd-manifests


$ cd ~/tmp/
$ git clone git@github.com:gitops-cookbook/pacman-kikd-manifests.git


4.1 Using Kustomize to Deploy Kubernetes Resources


Задача:
Вы хотите задеплоить сразу несколько kubernetes русурсов одной командой.


$ cd ~/tmp/pacman-kikd-manifests/k8s/


// Prints the result of the kustomization run, without sending the result to the
cluster
$ kubectl apply --dry-run=client -o yaml -k ./

или

$ kustomize build .


4.2 Updating the Container Image in Kustomize


Задача:
Вы хотите с помощью kustomize, обновить в deployment container image


$ cd ~/tmp/pacman-kikd-manifests/k8s/


$ kustomize build . | grep image:
image: quay.io/gitops-cookbook/pacman-kikd:1.0.0


$ cat > ./kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- pacman-deployment.yaml
- pacman-namespace.yaml
- pacman-service.yaml

images:
- name: quay.io/gitops-cookbook/pacman-kikd
  newTag: 1.0.1
EOF


// Поменялся tag
// При этом, если поменять image name, то не поменяется
$ kustomize build . | grep image:
image: quay.io/gitops-cookbook/pacman-kikd:1.0.1


4.3 Updating Any Kubernetes Field in Kustomize


Задача:
Вы хотите с помощью kustomize обновить поле с количеством реплик


$ kubectl apply --dry-run=client -o yaml -k ./ | grep replicas
replicas: 1


$ cat > ./kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pacman-deployment.yaml
replicas:
- name: pacman-kikd
  count: 3
EOF


$ kubectl apply --dry-run=client -o yaml -k ./ | grep replicas
replicas: 3


$ cat > ./kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pacman-deployment.yaml
patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3
EOF


$ kubectl apply --dry-run=client -o yaml -k ./ | grep replicas
replicas: 3


4.4 Deploying to Multiple Environments


Задача:
Вы хотите с помощью kustomize задеплоить приложение в разные namespace


$ mkdir base
$ mv * ./base/


$ mkdir staging
$ mkdir production


$ cat > ./staging/kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
namespace: staging
images:
- name: quay.io/gitops-cookbook/pacman-kikd
  newTag: 1.2.0-beta
EOF


$ cat > ./production/kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
namespace: prod
images:
- name: quay.io/gitops-cookbook/pacman-kikd
  newTag: 1.1.0
EOF


$ kubectl apply --dry-run=client -o yaml -k ./staging
$ kubectl apply --dry-run=client -o yaml -k ./production


4.5 Generating ConfigMaps in Kustomize


Задача:
Вы хотите с помощью kustomize задеплоить приложение в разные namespace


pacman-deployment.yaml


Добавляю

volumes:
  - name: config
    configMap:
      name: pacman-configmap


$ cat > ./staging/kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
namespace: staging
configMapGenerator:
- name: pacman-configmap
  literals:
  - db-timeout=2000
  - db-username=Ada
EOF


$ kubectl apply --dry-run=client -o yaml -k ./staging


Имя configmap создалось с хешем. При выполнении еще и обновиться должно из-за изменений в deployment.


Пример с заменой свойства


$ cat > ./production/kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../staging
namespace: prod
configMapGenerator:
- name: pacman-configmap
  behavior: merge
  literals:
  - db-username=Alexandra
EOF


$ kubectl apply --dry-run=client -o yaml -k ./production


Пример с добавлением свойств из файла


$ cat > ./production/connection.properties << EOF
db-url=prod:4321/db
db-username=ada
EOF


$ cat > ./production/kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../staging
namespace: prod
configMapGenerator:
- name: pacman-configmap
  behavior: replace
  files:
  - ./connection.properties
EOF


$ kubectl apply --dry-run=client -o yaml -k ./production