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

Модуль 1.3: Helm — менеджер пакетів Kubernetes

Hands-On Lab Available
K8s Cluster intermediate 40 min
Launch Lab ↗

Opens in Killercoda in a new tab

Складність: [MEDIUM] — необхідна навичка для іспиту 2025

Час на виконання: 40-50 хвилин

Передумови: Модуль 0.1 (робочий кластер), базові знання YAML


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

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

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

  • Розгорнути застосунки за допомогою Helm charts (install, upgrade, rollback, uninstall)
  • Налаштувати Helm-релізи за допомогою файлів values та прапорця —set
  • Дебажити невдалий Helm-реліз, перевіряючи історію релізів та рендеринг шаблонів
  • Пояснити архітектуру Helm (charts, releases, repositories) та коли використовувати Helm замість чистих маніфестів

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

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

Helm — новий у навчальній програмі CKA 2025. Вас будуть тестувати з нього.

До Helm розгортання складного застосунку означало керування десятками YAML-файлів. Типовий вебзастосунок потребує Деплойментів, Сервісів, ConfigMap, Secret, Ingress, ServiceAccount, правил RBAC… усіх підтримуваних окремо, усіх потребуючих оновлення разом.

Helm пакує всі ці ресурси в один chart (чарт). Встановлення однією командою. Оновлення однією командою. Відкат однією командою. Ось чому Helm називають «менеджером пакетів для Kubernetes» — та сама концепція, що apt/yum/brew, але для ресурсів K8s.

Аналогія з магазином застосунків

Уявіть Helm як магазин застосунків. Замість того, щоб вручну завантажувати та налаштовувати програмне забезпечення по частинах, ви шукаєте те, що вам потрібно (nginx, prometheus, mysql), натискаєте «встановити», і все налаштовується правильно. Хочете кастомізувати? Змініть налаштування (values). Хочете оновити? Натисніть «оновити». Щось зламалося? Відкат до попередньої версії.


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

  • Встановлювати та керувати застосунками за допомогою Helm
  • Шукати та використовувати публічні чарти
  • Кастомізувати розгортання за допомогою values
  • Оновлювати та відкочувати релізи
  • Розуміти структуру чартів (для усунення несправностей)

Частина 1: Концепції Helm

Розділ «Частина 1: Концепції Helm»

1.1 Основна термінологія

Розділ «1.1 Основна термінологія»
ТермінВизначення
Chart (чарт)Пакет ресурсів Kubernetes (як .deb або .rpm)
Release (реліз)Екземпляр чарту, що працює у вашому кластері
Repository (репозиторій)Колекція чартів (як apt-репозиторій)
Values (значення)Параметри конфігурації для кастомізації чарту
┌────────────────────────────────────────────────────────────────┐
│ Архітектура Helm │
│ │
│ Ви │
│ │ │
│ │ helm install myapp bitnami/nginx │
│ ▼ │
│ ┌──────────┐ ┌─────────────┐ ┌────────────────────┐ │
│ │ Helm │────►│ Чарт │────►│ Kubernetes API │ │
│ │ CLI │ │ (шаблон) │ │ (створює ресурси) │ │
│ └──────────┘ └─────────────┘ └────────────────────┘ │
│ │ │
│ │ Values (кастомізація) │
│ │ --set replicas=3 │
│ │ -f myvalues.yaml │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Реліз зберігається як Secret у кластері │ │
│ │ (відстежує версію, values, маніфести для відкату) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘

Helm 3 (поточний) прибрав Tiller — серверний компонент, що працював у кластері. Тепер Helm спілкується безпосередньо з API Kubernetes, використовуючи ваш kubeconfig. Це простіше та безпечніше.

Terminal window
# Helm 3 (поточний) - Tiller не потрібен
helm install myapp ./mychart
# Helm 2 (застарілий) - потребував Tiller
# Більше не використовуйте це

Чи знали ви?

Інформація про релізи Helm зберігається як Secret у вашому кластері. Виконайте kubectl get secrets -l owner=helm, щоб їх побачити. Саме так Helm відстежує, що встановлено, і забезпечує можливість відкату.


Частина 2: Встановлення Helm

Розділ «Частина 2: Встановлення Helm»

2.1 Встановлення Helm CLI

Розділ «2.1 Встановлення Helm CLI»
Terminal window
# macOS
brew install helm
# Linux (скрипт)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Linux (менеджер пакетів)
# Debian/Ubuntu
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
# Перевірка встановлення
helm version

2.2 Додавання репозиторію

Розділ «2.2 Додавання репозиторію»
Terminal window
# Додати репозиторій Bitnami (популярні, добре підтримувані чарти)
helm repo add bitnami https://charts.bitnami.com/bitnami
# Додати інші поширені репозиторії
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# Оновити індекс репозиторію
helm repo update
# Показати налаштовані репозиторії
helm repo list

Частина 3: Робота з чартами

Розділ «Частина 3: Робота з чартами»
Terminal window
# Пошук в Artifact Hub (онлайн-реєстр)
helm search hub nginx
# Пошук у ваших доданих репозиторіях
helm search repo nginx
# Показати всі версії чарту
helm search repo bitnami/nginx --versions
# Отримати інформацію про конкретний чарт
helm show chart bitnami/nginx
helm show readme bitnami/nginx
helm show values bitnami/nginx # Побачити всі параметри, що налаштовуються

3.2 Встановлення чарту

Розділ «3.2 Встановлення чарту»
Terminal window
# Базове встановлення
helm install my-nginx bitnami/nginx
# ^^^^^^^^ ^^^^^^^^^^^^^
# назва назва чарту
# релізу
# Встановлення в конкретний простір імен
helm install my-nginx bitnami/nginx -n web --create-namespace
# Встановлення з кастомними значеннями
helm install my-nginx bitnami/nginx --set replicaCount=3
# Встановлення з файлом значень
helm install my-nginx bitnami/nginx -f myvalues.yaml
# Встановлення конкретної версії
helm install my-nginx bitnami/nginx --version 15.0.0
# Пробний запуск (подивитися, що буде створено)
helm install my-nginx bitnami/nginx --dry-run
# Згенерувати лише маніфести (без встановлення)
helm template my-nginx bitnami/nginx > manifests.yaml

3.3 Перегляд та інспекція релізів

Розділ «3.3 Перегляд та інспекція релізів»
Terminal window
# Показати всі релізи
helm list
# Показати в усіх просторах імен
helm list -A
# Показати включно з невдалими релізами
helm list --all
# Отримати статус релізу
helm status my-nginx
# Отримати values, використані для релізу
helm get values my-nginx
# Отримати всі values (включно зі значеннями за замовчуванням)
helm get values my-nginx --all
# Отримати маніфести, що були встановлені
helm get manifest my-nginx

Підступність: простір імен має значення

Релізи Helm прив’язані до простору імен. Якщо ви встановили в простір імен web, ви маєте вказувати -n web для всіх наступних команд, інакше отримаєте «release not found».


Частина 4: Кастомізація за допомогою Values

Розділ «Частина 4: Кастомізація за допомогою Values»

Values можна задавати кількома способами. Пріоритет (від найвищого до найнижчого):

  1. Прапорці --set у командному рядку
  2. Файли values через -f (пізніші файли перевизначають попередні)
  3. Значення за замовчуванням у values.yaml чарту
Terminal window
# Приклад: Кілька способів задати кількість реплік
helm install my-nginx bitnami/nginx \
-f base-values.yaml \
-f production-values.yaml \
--set replicaCount=5 # Цей виграє

4.2 Використання —set

Розділ «4.2 Використання —set»
Terminal window
# Просте значення
helm install my-nginx bitnami/nginx --set replicaCount=3
# Вкладене значення
helm install my-nginx bitnami/nginx --set service.type=NodePort
# Кілька значень
helm install my-nginx bitnami/nginx \
--set replicaCount=3 \
--set service.type=NodePort \
--set service.nodePorts.http=30080
# Значення масиву
helm install my-app ./mychart --set 'ingress.hosts[0]=example.com'
# Рядок, що виглядає як число (використовуйте лапки)
helm install my-app ./mychart --set 'version="1.0"'

4.3 Використання файлів Values

Розділ «4.3 Використання файлів Values»
myvalues.yaml
replicaCount: 3
service:
type: NodePort
nodePorts:
http: 30080
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
ingress:
enabled: true
hostname: myapp.example.com
Terminal window
# Використати файл values
helm install my-nginx bitnami/nginx -f myvalues.yaml

4.4 Перегляд значень за замовчуванням

Розділ «4.4 Перегляд значень за замовчуванням»
Terminal window
# Побачити всі параметри, що налаштовуються
helm show values bitnami/nginx
# Зберегти у файл для довідки
helm show values bitnami/nginx > nginx-defaults.yaml

Порада до іспиту

Під час іспиту CKA використовуйте helm show values <chart>, щоб швидко побачити, що можна кастомізувати. Не запам’ятовуйте значення чартів — навчіться їх знаходити.


Частина 5: Оновлення та відкат

Розділ «Частина 5: Оновлення та відкат»

5.1 Оновлення релізу

Розділ «5.1 Оновлення релізу»
Terminal window
# Оновлення з новими значеннями
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
# Оновлення з файлом значень
helm upgrade my-nginx bitnami/nginx -f newvalues.yaml
# Оновлення до нової версії чарту
helm upgrade my-nginx bitnami/nginx --version 16.0.0
# Оновити або встановити, якщо не існує
helm upgrade --install my-nginx bitnami/nginx
# Повторно використати values з попереднього релізу + нові значення
helm upgrade my-nginx bitnami/nginx --reuse-values --set replicaCount=5
Terminal window
# Переглянути історію оновлень
helm history my-nginx
# Вивід:
# REVISION STATUS CHART DESCRIPTION
# 1 superseded nginx-15.0.0 Install complete
# 2 superseded nginx-15.0.0 Upgrade complete
# 3 deployed nginx-15.0.1 Upgrade complete
Terminal window
# Відкат до попередньої ревізії
helm rollback my-nginx
# Відкат до конкретної ревізії
helm rollback my-nginx 1
# Пробний запуск відкату
helm rollback my-nginx 1 --dry-run

Бойова історія: Випадкове оновлення

Один інженер виконав helm upgrade my-app ./chart без вказівки values, випадково скинувши все до значень за замовчуванням. Облікові дані бази даних для продакшну? Зникли. Кастомні ліміти ресурсів? Зникли. Виправлення — helm rollback my-app 1, але знадобилося 20 хвилин, щоб зрозуміти, що сталося. Урок: завжди використовуйте --reuse-values або явно вказуйте всі значення при оновленні.


Частина 6: Видалення

Розділ «Частина 6: Видалення»
Terminal window
# Видалити реліз
helm uninstall my-nginx
# Видалити, але зберегти історію (дозволяє відкат)
helm uninstall my-nginx --keep-history
# Видалити в конкретному просторі імен
helm uninstall my-nginx -n web

Частина 7: Структура чарту (для розуміння)

Розділ «Частина 7: Структура чарту (для розуміння)»

Вам не потрібно створювати чарти для CKA, але розуміння структури допомагає в усуненні несправностей.

mychart/
├── Chart.yaml # Метадані (назва, версія, опис)
├── values.yaml # Конфігурація за замовчуванням
├── charts/ # Залежності (підчарти)
├── templates/ # Шаблони маніфестів Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # Допоміжні шаблони
│ └── NOTES.txt # Повідомлення після встановлення
└── README.md # Документація

7.1 Як працюють шаблони

Розділ «7.1 Як працюють шаблони»
# templates/deployment.yaml (спрощено)
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-nginx
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

Значення з values.yaml або --set замінюють плейсхолдери {{ }}.

7.2 Налагодження шаблонів

Розділ «7.2 Налагодження шаблонів»
Terminal window
# Побачити, який YAML буде згенеровано
helm template my-nginx bitnami/nginx -f myvalues.yaml
# Встановити з інформацією для налагодження
helm install my-nginx bitnami/nginx --debug --dry-run

Частина 8: Типові сценарії на іспиті

Розділ «Частина 8: Типові сценарії на іспиті»

8.1 Встановлення застосунку

Розділ «8.1 Встановлення застосунку»
Terminal window
# Завдання: Встановити nginx з 3 репліками, доступний через NodePort 30080
# Рішення:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install web bitnami/nginx \
--set replicaCount=3 \
--set service.type=NodePort \
--set service.nodePorts.http=30080

8.2 Оновлення з новою конфігурацією

Розділ «8.2 Оновлення з новою конфігурацією»
Terminal window
# Завдання: Оновити існуючий реліз nginx до 5 реплік
# Рішення:
helm upgrade web bitnami/nginx --reuse-values --set replicaCount=5
# Перевірка:
kubectl get deployment

8.3 Відкат після невдалого оновлення

Розділ «8.3 Відкат після невдалого оновлення»
Terminal window
# Завдання: Відкотити до попередньої робочої версії
# Рішення:
helm history web
helm rollback web
# Перевірка:
helm status web

  • Helm hooks дозволяють запускати завдання до/після встановлення, оновлення або видалення. Чарти використовують це для міграцій баз даних, генерації сертифікатів тощо.

  • Helm використовує шаблони Go. Синтаксис {{ }} — це мова шаблонів Go. Розуміння базового шаблонування Go допомагає при налагодженні складних чартів.

  • ChartMuseum — це сервер репозиторіїв Helm з відкритим вихідним кодом. Організації використовують його для розміщення приватних чартів.


ПомилкаПроблемаРішення
Забули -n namespaceРеліз не знайденоЗавжди вказуйте простір імен
Не використали --reuse-valuesValues скидаються при оновленніВикористовуйте --reuse-values або вказуйте всі значення
Неправильний URL репозиторіюЧарт не знайденоПеревірте helm repo list, helm repo update
Ігнорування dry-runСтворено неочікувані ресурсиЗавжди --dry-run спочатку для складних змін
Не перевірили helm statusНе знаєте, чи вдалося встановленняВиконайте helm status <release> після встановлення

  1. Яка команда показує всі параметри, що налаштовуються, для чарту?

    Відповідь `helm show values ` відображає всі значення, які можна кастомізувати. Приклад: `helm show values bitnami/nginx`
  2. Ви встановили реліз у простір імен «production», але helm list нічого не показує. Чому?

    Відповідь Релізи Helm прив'язані до простору імен. Вам потрібно вказати простір імен: `helm list -n production`. Або використати `helm list -A`, щоб побачити всі простори імен.
  3. Як оновити реліз, зберігаючи існуючі values, змінюючи лише кількість реплік?

    Відповідь `helm upgrade my-release chart-name --reuse-values --set replicaCount=5`

    Прапорець --reuse-values зберігає всі раніше встановлені значення, а --set перевизначає лише вказане значення.

  4. Яка різниця між helm template та helm install --dry-run?

    Відповідь `helm template` рендерить шаблони локально без підключення до кластера — він не може перевірити, чи ресурси вже існують, або чи типи API є дійсними.

    helm install --dry-run підключається до кластера, виконує валідацію, але не створює ресурси. Це точніший тест.


Завдання: Розгорнути та керувати застосунком nginx за допомогою Helm.

Кроки:

  1. Додайте репозиторій Bitnami:
Terminal window
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
  1. Знайдіть чарти nginx:
Terminal window
helm search repo nginx
  1. Перегляньте значення за замовчуванням:
Terminal window
helm show values bitnami/nginx | head -50
  1. Встановіть nginx з кастомними значеннями:
Terminal window
helm install my-web bitnami/nginx \
--set replicaCount=2 \
--set service.type=ClusterIP \
-n helm-demo --create-namespace
  1. Перевірте встановлення:
Terminal window
helm list -n helm-demo
helm status my-web -n helm-demo
kubectl get all -n helm-demo
  1. Оновіть до 3 реплік:
Terminal window
helm upgrade my-web bitnami/nginx \
--reuse-values \
--set replicaCount=3 \
-n helm-demo
  1. Перевірте історію:
Terminal window
helm history my-web -n helm-demo
  1. Відкотіть до ревізії 1:
Terminal window
helm rollback my-web 1 -n helm-demo
kubectl get pods -n helm-demo # Має показати 2 поди
  1. Отримайте використані values:
Terminal window
helm get values my-web -n helm-demo
helm get values my-web -n helm-demo --all
  1. Очищення:
Terminal window
helm uninstall my-web -n helm-demo
kubectl delete namespace helm-demo

Критерії успіху:

  • Вмієте додавати репозиторії та шукати чарти
  • Вмієте встановлювати чарти з кастомними значеннями
  • Вмієте оновлювати релізи
  • Вмієте переглядати історію та робити відкат
  • Розумієте зв’язок між релізами та ресурсами Kubernetes

Вправа 1: Тест швидкості Helm (Ціль: 3 хвилини)

Розділ «Вправа 1: Тест швидкості Helm (Ціль: 3 хвилини)»

Виконайте ці завдання якомога швидше:

Terminal window
# 1. Додати репозиторій bitnami (якщо не додано)
helm repo add bitnami https://charts.bitnami.com/bitnami
# 2. Знайти redis
helm search repo redis
# 3. Показати доступні values для redis
helm show values bitnami/redis | head -50
# 4. Встановити redis з кастомною кількістю реплік
helm install my-redis bitnami/redis --set replica.replicaCount=2 --set auth.enabled=false
# 5. Показати релізи
helm list
# 6. Видалити
helm uninstall my-redis

Вправа 2: Практика з файлом Values (Ціль: 5 хвилин)

Розділ «Вправа 2: Практика з файлом Values (Ціль: 5 хвилин)»
Terminal window
# Створити файл values
cat << 'EOF' > nginx-values.yaml
replicaCount: 3
service:
type: NodePort
nodePorts:
http: 30080
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
EOF
# Встановити з файлом values
helm install web bitnami/nginx -f nginx-values.yaml
# Перевірити, що values застосовані
kubectl get pods # Має показати 3 репліки
kubectl get svc # Має показати NodePort 30080
# Отримати використані values
helm get values web
# Очищення
helm uninstall web
rm nginx-values.yaml

Вправа 3: Гонка оновлення та відкату (Ціль: 5 хвилин)

Розділ «Вправа 3: Гонка оновлення та відкату (Ціль: 5 хвилин)»
Terminal window
# Встановити початкову версію
helm install rollback-test bitnami/nginx --set replicaCount=2
# Оновити до 3 реплік
helm upgrade rollback-test bitnami/nginx --reuse-values --set replicaCount=3
# Перевірити
kubectl get pods | grep rollback-test | wc -l # Має бути 3
# Перевірити історію
helm history rollback-test
# Відкотити до ревізії 1
helm rollback rollback-test 1
# Перевірити відкат
kubectl get pods | grep rollback-test | wc -l # Має бути 2
# Очищення
helm uninstall rollback-test

Вправа 4: Усунення несправностей — неправильні Values (Ціль: 5 хвилин)

Розділ «Вправа 4: Усунення несправностей — неправильні Values (Ціль: 5 хвилин)»
Terminal window
# Підготовка: Встановити з «зламаними» values
helm install broken-nginx bitnami/nginx --set image.tag=nonexistent-tag
# Спостерігати проблему
kubectl get pods # ImagePullBackOff
# ВАШЕ ЗАВДАННЯ: Виправити, оновивши з правильним тегом образу
Рішення
Terminal window
# Перевірити поточні values
helm get values broken-nginx
# Виправити оновленням
helm upgrade broken-nginx bitnami/nginx --reuse-values --set image.tag=1.25
# Перевірити
kubectl get pods # Running!
# Очищення
helm uninstall broken-nginx

Вправа 5: Dry Run та Template (Ціль: 3 хвилини)

Розділ «Вправа 5: Dry Run та Template (Ціль: 3 хвилини)»
Terminal window
# Побачити, що буде створено, без створення
helm install dry-test bitnami/nginx --dry-run
# Згенерувати лише YAML (для інспекції або GitOps)
helm template my-nginx bitnami/nginx > nginx-manifests.yaml
cat nginx-manifests.yaml | head -100
# Валідація YAML
kubectl apply -f nginx-manifests.yaml --dry-run=client
# Очищення
rm nginx-manifests.yaml

Вправа 6: Керування кількома релізами (Ціль: 5 хвилин)

Розділ «Вправа 6: Керування кількома релізами (Ціль: 5 хвилин)»
Terminal window
# Встановити кілька релізів
helm install prod-web bitnami/nginx --set replicaCount=3 -n production --create-namespace
helm install dev-web bitnami/nginx --set replicaCount=1 -n development --create-namespace
helm install staging-web bitnami/nginx --set replicaCount=2 -n staging --create-namespace
# Показати всі релізи в усіх просторах імен
helm list -A
# Отримати статус конкретного релізу
helm status prod-web -n production
# Очистити все
helm uninstall prod-web -n production
helm uninstall dev-web -n development
helm uninstall staging-web -n staging
kubectl delete ns production development staging

Вправа 7: Виклик — встановлення без документації

Розділ «Вправа 7: Виклик — встановлення без документації»

Без перегляду документації виконайте це завдання:

Завдання: Встановити PostgreSQL з:

  • Назва бази даних: myapp
  • Ім’я користувача: appuser
  • Пароль: secret123
  • Сховище: 5Gi
Terminal window
# Підказка: Використовуйте helm show values, щоб знайти правильні параметри
helm show values bitnami/postgresql | grep -A5 -i "auth\|primary\|persistence"
Рішення
Terminal window
helm install mydb bitnami/postgresql \
--set auth.database=myapp \
--set auth.username=appuser \
--set auth.password=secret123 \
--set primary.persistence.size=5Gi
# Перевірити
kubectl get pods
kubectl get pvc
# Очищення
helm uninstall mydb

Модуль 1.4: Kustomize — керування конфігурацією без шаблонів, нативна кастомізація Kubernetes.