Перейти до вмісту

Модуль 4.2: Пакування застосунків

Складність: [MEDIUM] - Концепції інструментів

Час на виконання: 25-30 хвилин

Передумови: Модуль 4.1 (Основи CI/CD)


Що ви зможете робити

Розділ «Що ви зможете робити»

Після завершення цього модуля ви зможете:

  • Порівняти Helm та Kustomize як підходи до пакування застосунків Kubernetes
  • Пояснити структуру Helm chart: templates, values та життєвий цикл релізу
  • Визначити коли використовувати Helm charts або Kustomize overlays для різних сценаріїв керування
  • Оцінити стратегії пакування для розгортань у кількох середовищах (dev, staging, production)

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Сирі маніфести Kubernetes стають важкими в управлінні у масштабі. Helm, Kustomize та інші інструменти допомагають пакувати, налаштовувати та розгортати застосунки. KCNA перевіряє ваше розуміння цих підходів до пакування та коли їх використовувати.


Проблема сирих маніфестів

Розділ «Проблема сирих маніфестів»
┌─────────────────────────────────────────────────────────────┐
│ ПРОБЛЕМА МАНІФЕСТІВ │
├─────────────────────────────────────────────────────────────┤
│ │
│ Управління багатьма YAML файлами: │
│ ───────────────────────────────────────────────────────── │
│ │
│ my-app/ │
│ ├── deployment.yaml │
│ ├── service.yaml │
│ ├── configmap.yaml │
│ ├── secret.yaml │
│ ├── ingress.yaml │
│ └── pvc.yaml │
│ │
│ Проблеми: │
│ ───────────────────────────────────────────────────────── │
│ │
│ 1. ДУБЛЮВАННЯ │
│ Той самий застосунок для dev/staging/prod = 3x файлів │
│ Різниця лише: тег образу, репліки, ресурси │
│ │
│ 2. НЕМАЄ ШАБЛОНІЗАЦІЇ │
│ Не можна параметризувати значення │
│ Захардкоджено скрізь │
│ │
│ 3. НЕМАЄ ВЕРСІОНУВАННЯ │
│ Яка версія розгорнута? │
│ Як відкотити? │
│ │
│ 4. НЕМАЄ ЗАЛЕЖНОСТЕЙ │
│ Застосунку потрібен Redis → управляйте окремо │
│ │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ HELM │
├─────────────────────────────────────────────────────────────┤
│ │
│ "Менеджер пакетів для Kubernetes" │
│ CNCF Graduated проєкт │
│ │
│ Ключові концепції: │
│ ───────────────────────────────────────────────────────── │
│ │
│ CHART │
│ Пакет з ресурсами Kubernetes │
│ Шаблони + значення + метадані │
│ │
│ RELEASE │
│ Екземпляр chart у кластері │
│ Той самий chart може мати кілька release │
│ │
│ REPOSITORY │
│ Колекція chart (як npm реєстр) │
│ │
│ Структура chart: │
│ ───────────────────────────────────────────────────────── │
│ │
│ my-app/ │
│ ├── Chart.yaml # Метадані (назва, версія) │
│ ├── values.yaml # Типові значення │
│ ├── templates/ │
│ │ ├── deployment.yaml │
│ │ ├── service.yaml │
│ │ └── _helpers.tpl │
│ └── charts/ # Залежності │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ШАБЛОНІЗАЦІЯ HELM │
├─────────────────────────────────────────────────────────────┤
│ │
│ Шаблон (templates/deployment.yaml): │
│ ───────────────────────────────────────────────────────── │
│ │
│ apiVersion: apps/v1 │
│ kind: Deployment │
│ metadata: │
│ name: {{ .Release.Name }}-app │
│ spec: │
│ replicas: {{ .Values.replicas }} │
│ template: │
│ spec: │
│ containers: │
│ - name: app │
│ image: {{ .Values.image.repository }}:{{ │
│ .Values.image.tag }} │
│ resources: │
│ {{- toYaml .Values.resources | nindent 12 }} │
│ │
│ Значення (values.yaml): │
│ ───────────────────────────────────────────────────────── │
│ │
│ replicas: 3 │
│ image: │
│ repository: nginx │
│ tag: 1.25 │
│ resources: │
│ limits: │
│ cpu: 100m │
│ memory: 128Mi │
│ │
│ Перевизначення значень: │
│ ───────────────────────────────────────────────────────── │
│ helm install my-release ./my-app \ │
│ --set replicas=5 \ │
│ --set image.tag=1.26 │
│ │
│ Або через файл значень: │
│ helm install my-release ./my-app -f prod-values.yaml │
│ │
└─────────────────────────────────────────────────────────────┘
КомандаПризначення
helm installВстановити chart
helm upgradeОновити release
helm rollbackВідкотити до попередньої версії
helm uninstallВидалити release
helm listПерелік release
helm repo addДодати репозиторій chart
helm searchПошук chart

┌─────────────────────────────────────────────────────────────┐
│ KUSTOMIZE │
├─────────────────────────────────────────────────────────────┤
│ │
│ "Нативне управління конфігурацією Kubernetes" │
│ Вбудований у kubectl (kubectl apply -k) │
│ │
│ Ключова відмінність від Helm: │
│ ───────────────────────────────────────────────────────── │
│ • НЕМАЄ шаблонізації │
│ • Використовує overlays та patches │
│ • Чистий Kubernetes YAML │
│ │
│ Структура: │
│ ───────────────────────────────────────────────────────── │
│ │
│ my-app/ │
│ ├── base/ # Спільні ресурси │
│ │ ├── kustomization.yaml │
│ │ ├── deployment.yaml │
│ │ └── service.yaml │
│ └── overlays/ │
│ ├── dev/ # Специфічне для dev │
│ │ ├── kustomization.yaml │
│ │ └── replica-patch.yaml │
│ └── prod/ # Специфічне для prod │
│ ├── kustomization.yaml │
│ └── replica-patch.yaml │
│ │
│ Як це працює: │
│ ───────────────────────────────────────────────────────── │
│ │
│ Base: Оригінальні ресурси │
│ Overlay: Модифікації, застосовані поверх base │
│ │
│ [Base] │
│ │ │
│ ┌─────┴─────┐ │
│ ▼ ▼ │
│ [Overlay: [Overlay: │
│ Dev] Prod] │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ПРИКЛАД KUSTOMIZE │
├─────────────────────────────────────────────────────────────┤
│ │
│ base/kustomization.yaml: │
│ ───────────────────────────────────────────────────────── │
│ apiVersion: kustomize.config.k8s.io/v1beta1 │
│ kind: Kustomization │
│ resources: │
│ - deployment.yaml │
│ - service.yaml │
│ │
│ overlays/prod/kustomization.yaml: │
│ ───────────────────────────────────────────────────────── │
│ apiVersion: kustomize.config.k8s.io/v1beta1 │
│ kind: Kustomization │
│ resources: │
│ - ../../base │
│ namePrefix: prod- │
│ replicas: │
│ - name: my-app │
│ count: 5 │
│ images: │
│ - name: nginx │
│ newTag: "1.26" │
│ │
│ Застосування: │
│ ───────────────────────────────────────────────────────── │
│ kubectl apply -k overlays/prod/ │
│ │
│ Можливості Kustomize: │
│ • namePrefix/nameSuffix: Додати префікс до усіх назв │
│ • namespace: Встановити простір імен для всіх ресурсів │
│ • images: Перевизначити теги образів │
│ • replicas: Перевизначити кількість реплік │
│ • patches: Модифікувати будь-яке поле │
│ • configMapGenerator: Створити ConfigMaps з файлів │
│ • secretGenerator: Створити Secrets з файлів │
│ │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ HELM vs KUSTOMIZE │
├─────────────────────────────────────────────────────────────┤
│ │
│ HELM: │
│ ───────────────────────────────────────────────────────── │
│ + Потужна шаблонізація │
│ + Версіонування пакетів │
│ + Управління залежностями │
│ + Велика екосистема (Artifact Hub) │
│ + Відстеження release │
│ - Складний синтаксис шаблонів │
│ - Потрібно вивчити Go шаблони │
│ │
│ KUSTOMIZE: │
│ ───────────────────────────────────────────────────────── │
│ + Без шаблонізації = чистий YAML │
│ + Вбудований в kubectl │
│ + Легкий для розуміння │
│ + Немає нового синтаксису │
│ - Обмежений порівняно з шаблонізацією │
│ - Немає версіонування пакетів │
│ - Немає управління залежностями │
│ │
│ Коли що використовувати: │
│ ───────────────────────────────────────────────────────── │
│ │
│ Helm: │
│ • Розповсюдження застосунків іншим │
│ • Складні потреби шаблонізації │
│ • Потрібне управління залежностями │
│ • Використання chart третіх сторін │
│ │
│ Kustomize: │
│ • Внутрішні застосунки з варіаціями середовищ │
│ • Прості overlays (dev/staging/prod) │
│ • Команди, незнайомі з шаблонізацією │
│ • GitOps робочі процеси │
│ │
│ Обидва разом: │
│ • Helm для базового chart │
│ • Kustomize для overlays середовищ │
│ │
└─────────────────────────────────────────────────────────────┘

Інші інструменти пакування

Розділ «Інші інструменти пакування»
┌─────────────────────────────────────────────────────────────┐
│ ІНШІ ІНСТРУМЕНТИ │
├─────────────────────────────────────────────────────────────┤
│ │
│ JSONNET / TANKA │
│ ───────────────────────────────────────────────────────── │
│ • Мова шаблонізації даних │
│ • Програмна генерація JSON/YAML │
│ • Використовується Grafana Labs │
│ │
│ CUE │
│ ───────────────────────────────────────────────────────── │
│ • Мова конфігурації │
│ • Сильна типізація та валідація │
│ • Конфігурації що зливаються │
│ │
│ CARVEL (раніше k14s) │
│ ───────────────────────────────────────────────────────── │
│ • ytt: YAML шаблонізація │
│ • kbld: Збірка/розвʼязання образів │
│ • kapp: Інструмент розгортання │
│ • Проєкт CNCF sandbox │
│ │
│ ОПЕРАТОРИ │
│ ───────────────────────────────────────────────────────── │
│ • Для складних stateful застосунків │
│ • Власні контролери │
│ • Виходять за межі простого пакування │
│ │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ ARTIFACT HUB │
├─────────────────────────────────────────────────────────────┤
│ │
│ artifacthub.io │
│ Проєкт CNCF │
│ │
│ Центральний репозиторій для: │
│ ───────────────────────────────────────────────────────── │
│ • Helm charts │
│ • Політик OPA │
│ • Правил Falco │
│ • OLM операторів │
│ • І більше... │
│ │
│ Використовуйте для: │
│ • Пошуку chart для популярних застосунків │
│ • Пошуку альтернатив │
│ • Перевірки якості/безпеки chart │
│ │
│ Приклад: Потрібен PostgreSQL? │
│ → Шукайте "postgresql" на Artifact Hub │
│ → Знайдіть Bitnami chart │
│ → helm repo add bitnami https://charts.bitnami.com/... │
│ → helm install my-postgres bitnami/postgresql │
│ │
└─────────────────────────────────────────────────────────────┘

  • Helm v3 видалив Tiller — Helm v2 вимагав серверний компонент (Tiller) у кластері. Helm v3 видалив його для кращої безпеки.

  • Kustomize вбудований у kubectl — З Kubernetes 1.14 можна використовувати kubectl apply -k без окремого встановлення Kustomize.

  • Helm використовує Go шаблони — Якщо ви знаєте пакет text/template Go, шаблонізація Helm буде знайомою.

  • Charts можуть мати залежності — Chart може залежати від інших chart, які автоматично встановлюються разом (як npm пакети).


ПомилкаЧому це шкодитьПравильне розуміння
Дублювання маніфестів для середовищВажко підтримуватиВикористовуйте Helm values або Kustomize overlays
Складні шаблони HelmВажко налагоджуватиТримайте шаблони простими
Без версіонування chartНе можна відстежити зміниВикористовуйте семантичне версіонування
Захардкоджені секретиРизик безпекиВикористовуйте зовнішнє управління секретами

  1. Що таке Helm chart?

    Відповідь Пакет з ресурсами Kubernetes (шаблони), типовими значеннями та метаданими. Це як пакет у npm або apt, але для застосунків Kubernetes. Charts можна версіонувати, ділитися ними та мати залежності.
  2. Чим Kustomize відрізняється від Helm?

    Відповідь Kustomize використовує overlays та patches на чистому YAML — без шаблонізації. Helm використовує Go шаблонізацію для генерації YAML. Kustomize простіший, але менш потужний. Kustomize вбудований у kubectl; Helm — окремий інструмент.
  3. Що таке Helm release?

    Відповідь Екземпляр chart, встановлений у кластері. Той самий chart може бути встановлений кілька разів з різними назвами release. Helm відстежує історію release для оновлень та відкатів.
  4. Що таке Artifact Hub?

    Відповідь Проєкт CNCF, що служить центральним репозиторієм для пошуку та обміну хмарними нативними артефактами, включаючи Helm charts, політики OPA, правила Falco та оператори. Це як пошуковий рушій для пакетів Kubernetes.
  5. Коли б ви використали Kustomize замість Helm?

    Відповідь Для внутрішніх застосунків з простими варіаціями середовищ (dev/staging/prod), коли команди надають перевагу чистому YAML замість шаблонізації, або для GitOps робочих процесів. Kustomize також вбудований у kubectl, що не вимагає додаткового інструментарію.

Проблема:

  • Сирі маніфести не масштабуються
  • Дублювання, без параметризації
  • Без версіонування або залежностей

Helm:

  • Менеджер пакетів для Kubernetes
  • Шаблони + значення + charts
  • Потужний, але складний

Kustomize:

  • Overlays та patches
  • Без шаблонізації
  • Вбудований у kubectl

Коли використовувати:

  • Helm: Розповсюдження застосунків, складна шаблонізація, залежності
  • Kustomize: Внутрішні застосунки, прості overlays середовищ
  • Обидва: Helm chart + Kustomize overlays

Artifact Hub:

  • Пошук Helm charts та інших артефактів
  • Центральний репозиторій CNCF

Навчальна програма KCNA завершена!

Розділ «Навчальна програма KCNA завершена!»

Вітаємо! Ви завершили всю навчальну програму KCNA, що охоплює:

ЧастинаТемаВага
Частина 1Основи Kubernetes44%
Частина 2Оркестрація контейнерів28%
Частина 3Хмарна нативна архітектура (включ. Спостережуваність)12%
Частина 4Доставка застосунків16%

Оновлено листопад 2025: Спостережуваність обʼєднано з Хмарною нативною архітектурою

Наступні кроки:

  1. Перегляньте слабкі місця
  2. Пройдіть практичні тести
  3. Вивчіть ландшафт CNCF
  4. Заплануйте свій іспит!

Бажаємо успіхів з сертифікацією KCNA!