[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