Модуль 2.3: Kustomize
Складність:
[MEDIUM]— кастомізація Kubernetes без шаблонівЧас на виконання: 40–50 хвилин
Передумови: Модуль 2.1 (Деплойменти), базове розуміння YAML
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Побудувати оверлеї Kustomize, що кастомізують базові ресурси для різних середовищ
- Застосувати патчі та трансформації за допомогою
kubectl apply -kбез модифікації оригінального YAML - Порівняти Kustomize та Helm і обрати правильний інструмент для конкретного сценарію розгортання
- Діагностувати проблеми рендерингу Kustomize за допомогою
kubectl kustomizeдля попереднього перегляду результату
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Kustomize дозволяє кастомізувати ресурси Kubernetes без шаблонів. Замість змінних і логіки (як у Helm) Kustomize використовує оверлеї та патчі для модифікації базових конфігурацій. Він вбудований у kubectl (kubectl apply -k), що робить його зручним для іспиту.
CKAD тестує Kustomize для:
- Створення та застосування кастомізацій
- Використання оверлеїв для різних середовищ
- Патчінг ресурсів
- Керування ConfigMaps та Secrets
Аналогія з наклейками
Уявіть, що купуєте ноутбук. Базовий ноутбук (базові ресурси) однаковий для всіх. Але ви додаєте наклейки, скіни та аксесуари (оверлеї), щоб зробити його своїм. Ви не перебудовуєте ноутбук — ви його кастомізуєте. Kustomize працює так само: зберігайте базові ресурси Kubernetes чистими, а потім застосовуйте оверлеї для dev/staging/prod.
Основи Kustomize
Розділ «Основи Kustomize»Ключові концепції
Розділ «Ключові концепції»| Концепція | Опис |
|---|---|
| Base | Оригінальні, немодифіковані ресурси Kubernetes |
| Overlay | Кастомізації, що накладаються поверх бази |
| Patch | Модифікації конкретних полів |
| kustomization.yaml | Файл, що визначає, що кастомізувати |
Як працює Kustomize
Розділ «Як працює Kustomize»┌─────────────────────────────────────────────────────────┐│ Потік Kustomize │├─────────────────────────────────────────────────────────┤│ ││ База Оверлей ││ ┌─────────────┐ ┌─────────────┐ ││ │ deployment │───────▶│ + репліки │ ││ │ service │ │ + env vars │ ││ │ configmap │ │ + мітки │ ││ └─────────────┘ └─────────────┘ ││ │ │ ││ └─────────┬───────────┘ ││ ▼ ││ ┌─────────────┐ ││ │ Об'єднані │ ││ │ ресурси │ ││ └─────────────┘ ││ │ ││ ▼ ││ kubectl apply -k ./ ││ │└─────────────────────────────────────────────────────────┘Створення кастомізації
Розділ «Створення кастомізації»Базова структура
Розділ «Базова структура»my-app/├── kustomization.yaml├── deployment.yaml└── service.yamlkustomization.yaml
Розділ «kustomization.yaml»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml- service.yamlЗастосування через kubectl
Розділ «Застосування через kubectl»# Попередній перегляд того, що буде застосованоkubectl kustomize ./my-app/
# Застосувати кастомізаціюkubectl apply -k ./my-app/
# Видалити ресурсиkubectl delete -k ./my-app/Типові трансформації
Розділ «Типові трансформації»Додати мітки до всіх ресурсів
Розділ «Додати мітки до всіх ресурсів»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml- service.yaml
commonLabels: app: my-app environment: productionДодати анотації
Розділ «Додати анотації»commonAnnotations: owner: team-platform managed-by: kustomizeДодати префікс/суфікс до імені
Розділ «Додати префікс/суфікс до імені»namePrefix: prod-nameSuffix: -v1Результат: deployment стає prod-deployment-v1
Встановити простір імен
Розділ «Встановити простір імен»namespace: productionУсі ресурси будуть розгорнуті в цьому просторі імен.
ConfigMaps та Secrets
Розділ «ConfigMaps та Secrets»Генерація ConfigMap
Розділ «Генерація ConfigMap»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml
configMapGenerator:- name: app-config literals: - LOG_LEVEL=info - API_URL=http://api.example.comГенерація ConfigMap з файлів
Розділ «Генерація ConfigMap з файлів»configMapGenerator:- name: app-config files: - config.properties - settings.jsonГенерація Secrets
Розділ «Генерація Secrets»secretGenerator:- name: db-credentials literals: - username=admin - password=secret123
# Або з файлівsecretGenerator:- name: tls-certs files: - tls.crt - tls.key type: kubernetes.io/tlsПоведінка ConfigMap/Secret
Розділ «Поведінка ConfigMap/Secret»За замовчуванням Kustomize додає хеш-суфікс до згенерованих ConfigMaps/Secrets:
app-configстаєapp-config-abc123- Посилання оновлюються автоматично
Вимкнути:
generatorOptions: disableNameSuffixHash: trueОбрази
Розділ «Образи»Перевизначення тегів образів
Розділ «Перевизначення тегів образів»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml
images:- name: nginx newTag: "1.21"
- name: myapp newName: my-registry.com/myapp newTag: v2.0.0Патчі
Розділ «Патчі»Strategic Merge Patch
Розділ «Strategic Merge Patch»Додавання або модифікація полів:
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml
patches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 5Патч із файлу
Розділ «Патч із файлу»patches:- path: increase-replicas.yamlincrease-replicas.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: replicas: 5JSON Patch
Розділ «JSON Patch»Для точних модифікацій:
patches:- target: kind: Deployment name: my-app patch: |- - op: replace path: /spec/replicas value: 5 - op: add path: /metadata/labels/version value: v2Патч для всіх Деплойментів
Розділ «Патч для всіх Деплойментів»patches:- target: kind: Deployment patch: |- - op: add path: /spec/template/spec/containers/0/resources value: limits: memory: 256Mi cpu: 200mОверлеї
Розділ «Оверлеї»Структура каталогів
Розділ «Структура каталогів»my-app/├── base/│ ├── kustomization.yaml│ ├── deployment.yaml│ └── service.yaml├── overlays/│ ├── dev/│ │ └── kustomization.yaml│ ├── staging/│ │ └── kustomization.yaml│ └── prod/│ └── kustomization.yamlБазовий kustomization.yaml
Розділ «Базовий kustomization.yaml»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml- service.yamlDev-оверлей
Розділ «Dev-оверлей»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- ../../base
namePrefix: dev-namespace: development
patches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1
images:- name: my-app newTag: dev-latestProd-оверлей
Розділ «Prod-оверлей»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- ../../base
namePrefix: prod-namespace: production
patches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 5
images:- name: my-app newTag: v1.2.3
configMapGenerator:- name: app-config literals: - LOG_LEVEL=warn - ENABLE_DEBUG=falseЗастосування оверлеїв
Розділ «Застосування оверлеїв»# Застосувати devkubectl apply -k overlays/dev/
# Застосувати prodkubectl apply -k overlays/prod/
# Попередній переглядkubectl kustomize overlays/prod/Швидкий довідник для іспиту
Розділ «Швидкий довідник для іспиту»# Попередній перегляд кастомізаціїkubectl kustomize ./
# Застосувати кастомізаціюkubectl apply -k ./
# Видалити кастомізаціюkubectl delete -k ./
# Переглянути конкретний оверлейkubectl kustomize overlays/prod/Мінімальний kustomization.yaml
Розділ «Мінімальний kustomization.yaml»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlТипові кастомізації
Розділ «Типові кастомізації»apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- deployment.yaml- service.yaml
namespace: my-namespacenamePrefix: prod-
commonLabels: app: my-app
images:- name: nginx newTag: "1.21"
configMapGenerator:- name: config literals: - KEY=valueЧи знали ви?
Розділ «Чи знали ви?»-
Kustomize вбудований у kubectl починаючи з версії 1.14. Вам не потрібно встановлювати нічого додаткового — просто використовуйте
kubectl apply -k. -
Хеш-суфікси на ConfigMaps/Secrets забезпечують поширення оновлень. Коли вміст змінюється, хеш змінюється, створюючи новий ConfigMap. Деплойменти, що на нього посилаються, автоматично оновлюються.
-
Kustomize проти Helm: Kustomize простіший (без шаблонів, без змінних), тоді як Helm потужніший (умови, цикли, пакування). Використовуйте Kustomize для простих оверлеїв; Helm — для складних застосунків.
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
| Неправильний шлях до бази | Ресурси не знайдені | Використовуйте відносні шляхи (../../base) |
| Невідповідність імені цілі патчу | Патч не застосовується | Збігайте точне ім’я ресурсу |
Відсутній apiVersion у kustomization | Недійсний файл | Завжди вказуйте версію |
Забули секцію resources | Нічого не розгорнуто | Перелічіть усі файли ресурсів |
| Не переглянули перед застосуванням | Несподівані результати | Завжди спочатку виконуйте kubectl kustomize |
Тест
Розділ «Тест»-
Як застосувати каталог Kustomize?
Відповідь
`kubectl apply -k ./directory/`Прапорець
-kвказує kubectl обробити kustomization.yaml у цьому каталозі. -
Як додати префікс до всіх імен ресурсів?
Відповідь
Додайте `namePrefix: prefix-` до kustomization.yaml. Усі ресурси отримають цей префікс до своїх імен. -
Яка різниця між base та overlay?
Відповідь
Base містить оригінальні, немодифіковані ресурси. Overlay посилається на base та додає кастомізації (інша кількість реплік, простори імен, мітки) для конкретних середовищ, таких як dev/staging/prod. -
Як перевизначити тег образу?
Відповідь
```yaml images: - name: nginx newTag: "1.21" ``` Це змінює всі посилання на `nginx`, щоб використовувати тег `1.21`.
Практична вправа
Розділ «Практична вправа»Завдання: Створити повну конфігурацію Kustomize з базою та оверлеями.
Частина 1: Створення бази
mkdir -p /tmp/kustomize-demo/basecd /tmp/kustomize-demo
# Створити деплойментcat << 'EOF' > base/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: web-appspec: replicas: 1 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80EOF
# Створити сервісcat << 'EOF' > base/service.yamlapiVersion: v1kind: Servicemetadata: name: web-appspec: selector: app: web ports: - port: 80EOF
# Створити базову кастомізаціюcat << 'EOF' > base/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yaml- service.yamlEOFЧастина 2: Створення Dev-оверлею
mkdir -p overlays/dev
cat << 'EOF' > overlays/dev/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- ../../base
namePrefix: dev-namespace: development
images:- name: nginx newTag: "1.21"
configMapGenerator:- name: app-config literals: - ENV=development - DEBUG=trueEOFЧастина 3: Створення Prod-оверлею
mkdir -p overlays/prod
cat << 'EOF' > overlays/prod/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources:- ../../base
namePrefix: prod-namespace: production
patches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3
images:- name: nginx newTag: "1.22"
configMapGenerator:- name: app-config literals: - ENV=production - DEBUG=falseEOFЧастина 4: Попередній перегляд та застосування
# Попередній перегляд devkubectl kustomize overlays/dev/
# Попередній перегляд prodkubectl kustomize overlays/prod/
# Застосувати dev (спочатку створити простір імен)kubectl create ns developmentkubectl apply -k overlays/dev/
# Перевіритиkubectl get all -n development
# Очищенняkubectl delete -k overlays/dev/kubectl delete ns developmentПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Базова кастомізація (Ціль: 3 хвилини)
Розділ «Вправа 1: Базова кастомізація (Ціль: 3 хвилини)»mkdir -p /tmp/drill1 && cd /tmp/drill1
# Створити деплойментcat << 'EOF' > deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginxEOF
# Створити кастомізаціюcat << 'EOF' > kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlnamespace: defaultcommonLabels: environment: testEOF
# Попередній переглядkubectl kustomize ./
# Застосуватиkubectl apply -k ./
# Очищенняkubectl delete -k ./Вправа 2: Перевизначення образу (Ціль: 2 хвилини)
Розділ «Вправа 2: Перевизначення образу (Ціль: 2 хвилини)»mkdir -p /tmp/drill2 && cd /tmp/drill2
cat << 'EOF' > deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: appspec: selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: nginx:1.19EOF
cat << 'EOF' > kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlimages:- name: nginx newTag: "1.22"EOF
# Перевірити, що образ змінивсяkubectl kustomize ./ | grep image
# Очищенняcd /tmp && rm -rf drill2Вправа 3: Генератор ConfigMap (Ціль: 3 хвилини)
Розділ «Вправа 3: Генератор ConfigMap (Ціль: 3 хвилини)»mkdir -p /tmp/drill3 && cd /tmp/drill3
cat << 'EOF' > deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: appspec: selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: nginx envFrom: - configMapRef: name: app-configEOF
cat << 'EOF' > kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlconfigMapGenerator:- name: app-config literals: - DATABASE_URL=postgres://localhost - LOG_LEVEL=debugEOF
# Попередній перегляд — зверніть увагу на хеш-суфіксkubectl kustomize ./
# Очищенняcd /tmp && rm -rf drill3Вправа 4: Патчі (Ціль: 4 хвилини)
Розділ «Вправа 4: Патчі (Ціль: 4 хвилини)»mkdir -p /tmp/drill4 && cd /tmp/drill4
cat << 'EOF' > deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: webspec: replicas: 1 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginxEOF
cat << 'EOF' > kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlpatches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 template: spec: containers: - name: nginx resources: limits: memory: 128Mi cpu: 100mEOF
# Перевірити, що патч застосованоkubectl kustomize ./
# Очищенняcd /tmp && rm -rf drill4Вправа 5: Префікс імені та простір імен (Ціль: 2 хвилини)
Розділ «Вправа 5: Префікс імені та простір імен (Ціль: 2 хвилини)»mkdir -p /tmp/drill5 && cd /tmp/drill5
cat << 'EOF' > deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: appspec: selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: nginx image: nginxEOF
cat << 'EOF' > kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlnamePrefix: staging-namespace: stagingcommonLabels: env: stagingEOF
# Перевірити трансформаціїkubectl kustomize ./
# Очищенняcd /tmp && rm -rf drill5Вправа 6: Повний сценарій з оверлеями (Ціль: 6 хвилин)
Розділ «Вправа 6: Повний сценарій з оверлеями (Ціль: 6 хвилин)»mkdir -p /tmp/drill6/{base,overlays/dev,overlays/prod}cd /tmp/drill6
# Базаcat << 'EOF' > base/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: apispec: replicas: 1 selector: matchLabels: app: api template: metadata: labels: app: api spec: containers: - name: api image: my-api:latest ports: - containerPort: 8080EOF
cat << 'EOF' > base/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yamlEOF
# Dev-оверлейcat << 'EOF' > overlays/dev/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- ../../basenamePrefix: dev-namespace: devimages:- name: my-api newTag: dev-latestEOF
# Prod-оверлейcat << 'EOF' > overlays/prod/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- ../../basenamePrefix: prod-namespace: prodimages:- name: my-api newTag: v1.0.0patches:- patch: |- apiVersion: apps/v1 kind: Deployment metadata: name: api spec: replicas: 3EOF
# Порівняти виведенняecho "=== DEV ===" && kubectl kustomize overlays/dev/echo "=== PROD ===" && kubectl kustomize overlays/prod/
# Очищенняcd /tmp && rm -rf drill6Наступний модуль
Розділ «Наступний модуль»Модуль 2.4: Стратегії деплойменту — патерни blue/green, canary та ковзного розгортання.