Модуль 1.3: Helm — менеджер пакетів Kubernetes
Складність:
[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 (значення) | Параметри конфігурації для кастомізації чарту |
1.2 Як працює Helm
Розділ «1.2 Як працює Helm»┌────────────────────────────────────────────────────────────────┐│ Архітектура Helm ││ ││ Ви ││ │ ││ │ helm install myapp bitnami/nginx ││ ▼ ││ ┌──────────┐ ┌─────────────┐ ┌────────────────────┐ ││ │ Helm │────►│ Чарт │────►│ Kubernetes API │ ││ │ CLI │ │ (шаблон) │ │ (створює ресурси) │ ││ └──────────┘ └─────────────┘ └────────────────────┘ ││ │ ││ │ Values (кастомізація) ││ │ --set replicas=3 ││ │ -f myvalues.yaml ││ ▼ ││ ┌──────────────────────────────────────────────────────────┐ ││ │ Реліз зберігається як Secret у кластері │ ││ │ (відстежує версію, values, маніфести для відкату) │ ││ └──────────────────────────────────────────────────────────┘ ││ │└────────────────────────────────────────────────────────────────┘1.3 Helm 3 проти Helm 2
Розділ «1.3 Helm 3 проти Helm 2»Helm 3 (поточний) прибрав Tiller — серверний компонент, що працював у кластері. Тепер Helm спілкується безпосередньо з API Kubernetes, використовуючи ваш kubeconfig. Це простіше та безпечніше.
# 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»# macOSbrew install helm
# Linux (скрипт)curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Linux (менеджер пакетів)# Debian/Ubuntucurl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/nullecho "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.listsudo apt-get updatesudo apt-get install helm
# Перевірка встановленняhelm version2.2 Додавання репозиторію
Розділ «2.2 Додавання репозиторію»# Додати репозиторій Bitnami (популярні, добре підтримувані чарти)helm repo add bitnami https://charts.bitnami.com/bitnami
# Додати інші поширені репозиторіїhelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# Оновити індекс репозиторіюhelm repo update
# Показати налаштовані репозиторіїhelm repo listЧастина 3: Робота з чартами
Розділ «Частина 3: Робота з чартами»3.1 Пошук чартів
Розділ «3.1 Пошук чартів»# Пошук в Artifact Hub (онлайн-реєстр)helm search hub nginx
# Пошук у ваших доданих репозиторіяхhelm search repo nginx
# Показати всі версії чартуhelm search repo bitnami/nginx --versions
# Отримати інформацію про конкретний чартhelm show chart bitnami/nginxhelm show readme bitnami/nginxhelm show values bitnami/nginx # Побачити всі параметри, що налаштовуються3.2 Встановлення чарту
Розділ «3.2 Встановлення чарту»# Базове встановлення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.yaml3.3 Перегляд та інспекція релізів
Розділ «3.3 Перегляд та інспекція релізів»# Показати всі релізи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»4.1 Ієрархія Values
Розділ «4.1 Ієрархія Values»Values можна задавати кількома способами. Пріоритет (від найвищого до найнижчого):
- Прапорці
--setу командному рядку - Файли values через
-f(пізніші файли перевизначають попередні) - Значення за замовчуванням у
values.yamlчарту
# Приклад: Кілька способів задати кількість реплікhelm install my-nginx bitnami/nginx \ -f base-values.yaml \ -f production-values.yaml \ --set replicaCount=5 # Цей виграє4.2 Використання —set
Розділ «4.2 Використання —set»# Просте значення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»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# Використати файл valueshelm install my-nginx bitnami/nginx -f myvalues.yaml4.4 Перегляд значень за замовчуванням
Розділ «4.4 Перегляд значень за замовчуванням»# Побачити всі параметри, що налаштовуютьсяhelm show values bitnami/nginx
# Зберегти у файл для довідкиhelm show values bitnami/nginx > nginx-defaults.yamlПорада до іспиту
Під час іспиту CKA використовуйте
helm show values <chart>, щоб швидко побачити, що можна кастомізувати. Не запам’ятовуйте значення чартів — навчіться їх знаходити.
Частина 5: Оновлення та відкат
Розділ «Частина 5: Оновлення та відкат»5.1 Оновлення релізу
Розділ «5.1 Оновлення релізу»# Оновлення з новими значеннями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=55.2 Історія релізів
Розділ «5.2 Історія релізів»# Переглянути історію оновлень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 complete5.3 Відкат
Розділ «5.3 Відкат»# Відкат до попередньої ревізії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: Видалення»# Видалити реліз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/v1kind: Deploymentmetadata: name: {{ .Release.Name }}-nginxspec: replicas: {{ .Values.replicaCount }} template: spec: containers: - name: nginx image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"Значення з values.yaml або --set замінюють плейсхолдери {{ }}.
7.2 Налагодження шаблонів
Розділ «7.2 Налагодження шаблонів»# Побачити, який 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 Встановлення застосунку»# Завдання: Встановити nginx з 3 репліками, доступний через NodePort 30080
# Рішення:helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update
helm install web bitnami/nginx \ --set replicaCount=3 \ --set service.type=NodePort \ --set service.nodePorts.http=300808.2 Оновлення з новою конфігурацією
Розділ «8.2 Оновлення з новою конфігурацією»# Завдання: Оновити існуючий реліз nginx до 5 реплік
# Рішення:helm upgrade web bitnami/nginx --reuse-values --set replicaCount=5
# Перевірка:kubectl get deployment8.3 Відкат після невдалого оновлення
Розділ «8.3 Відкат після невдалого оновлення»# Завдання: Відкотити до попередньої робочої версії
# Рішення:helm history webhelm rollback web
# Перевірка:helm status webЧи знали ви?
Розділ «Чи знали ви?»-
Helm hooks дозволяють запускати завдання до/після встановлення, оновлення або видалення. Чарти використовують це для міграцій баз даних, генерації сертифікатів тощо.
-
Helm використовує шаблони Go. Синтаксис
{{ }}— це мова шаблонів Go. Розуміння базового шаблонування Go допомагає при налагодженні складних чартів. -
ChartMuseum — це сервер репозиторіїв Helm з відкритим вихідним кодом. Організації використовують його для розміщення приватних чартів.
Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
Забули -n namespace | Реліз не знайдено | Завжди вказуйте простір імен |
Не використали --reuse-values | Values скидаються при оновленні | Використовуйте --reuse-values або вказуйте всі значення |
| Неправильний URL репозиторію | Чарт не знайдено | Перевірте helm repo list, helm repo update |
| Ігнорування dry-run | Створено неочікувані ресурси | Завжди --dry-run спочатку для складних змін |
| Не перевірили helm status | Не знаєте, чи вдалося встановлення | Виконайте helm status <release> після встановлення |
Тест
Розділ «Тест»-
Яка команда показує всі параметри, що налаштовуються, для чарту?
Відповідь
`helm show values` відображає всі значення, які можна кастомізувати. Приклад: `helm show values bitnami/nginx` -
Ви встановили реліз у простір імен «production», але
helm listнічого не показує. Чому?Відповідь
Релізи Helm прив'язані до простору імен. Вам потрібно вказати простір імен: `helm list -n production`. Або використати `helm list -A`, щоб побачити всі простори імен. -
Як оновити реліз, зберігаючи існуючі values, змінюючи лише кількість реплік?
Відповідь
`helm upgrade my-release chart-name --reuse-values --set replicaCount=5`Прапорець
--reuse-valuesзберігає всі раніше встановлені значення, а--setперевизначає лише вказане значення. -
Яка різниця між
helm templateтаhelm install --dry-run?Відповідь
`helm template` рендерить шаблони локально без підключення до кластера — він не може перевірити, чи ресурси вже існують, або чи типи API є дійсними.helm install --dry-runпідключається до кластера, виконує валідацію, але не створює ресурси. Це точніший тест.
Практична вправа
Розділ «Практична вправа»Завдання: Розгорнути та керувати застосунком nginx за допомогою Helm.
Кроки:
- Додайте репозиторій Bitnami:
helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update- Знайдіть чарти nginx:
helm search repo nginx- Перегляньте значення за замовчуванням:
helm show values bitnami/nginx | head -50- Встановіть nginx з кастомними значеннями:
helm install my-web bitnami/nginx \ --set replicaCount=2 \ --set service.type=ClusterIP \ -n helm-demo --create-namespace- Перевірте встановлення:
helm list -n helm-demohelm status my-web -n helm-demokubectl get all -n helm-demo- Оновіть до 3 реплік:
helm upgrade my-web bitnami/nginx \ --reuse-values \ --set replicaCount=3 \ -n helm-demo- Перевірте історію:
helm history my-web -n helm-demo- Відкотіть до ревізії 1:
helm rollback my-web 1 -n helm-demokubectl get pods -n helm-demo # Має показати 2 поди- Отримайте використані values:
helm get values my-web -n helm-demohelm get values my-web -n helm-demo --all- Очищення:
helm uninstall my-web -n helm-demokubectl delete namespace helm-demoКритерії успіху:
- Вмієте додавати репозиторії та шукати чарти
- Вмієте встановлювати чарти з кастомними значеннями
- Вмієте оновлювати релізи
- Вмієте переглядати історію та робити відкат
- Розумієте зв’язок між релізами та ресурсами Kubernetes
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Тест швидкості Helm (Ціль: 3 хвилини)
Розділ «Вправа 1: Тест швидкості Helm (Ціль: 3 хвилини)»Виконайте ці завдання якомога швидше:
# 1. Додати репозиторій bitnami (якщо не додано)helm repo add bitnami https://charts.bitnami.com/bitnami
# 2. Знайти redishelm search repo redis
# 3. Показати доступні values для redishelm 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 хвилин)»# Створити файл valuescat << 'EOF' > nginx-values.yamlreplicaCount: 3service: type: NodePort nodePorts: http: 30080resources: requests: memory: "64Mi" cpu: "50m" limits: memory: "128Mi" cpu: "100m"EOF
# Встановити з файлом valueshelm install web bitnami/nginx -f nginx-values.yaml
# Перевірити, що values застосованіkubectl get pods # Має показати 3 реплікиkubectl get svc # Має показати NodePort 30080
# Отримати використані valueshelm get values web
# Очищенняhelm uninstall webrm nginx-values.yamlВправа 3: Гонка оновлення та відкату (Ціль: 5 хвилин)
Розділ «Вправа 3: Гонка оновлення та відкату (Ціль: 5 хвилин)»# Встановити початкову версію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
# Відкотити до ревізії 1helm rollback rollback-test 1
# Перевірити відкатkubectl get pods | grep rollback-test | wc -l # Має бути 2
# Очищенняhelm uninstall rollback-testВправа 4: Усунення несправностей — неправильні Values (Ціль: 5 хвилин)
Розділ «Вправа 4: Усунення несправностей — неправильні Values (Ціль: 5 хвилин)»# Підготовка: Встановити з «зламаними» valueshelm install broken-nginx bitnami/nginx --set image.tag=nonexistent-tag
# Спостерігати проблемуkubectl get pods # ImagePullBackOff
# ВАШЕ ЗАВДАННЯ: Виправити, оновивши з правильним тегом образуРішення
# Перевірити поточні valueshelm 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 хвилини)»# Побачити, що буде створено, без створенняhelm install dry-test bitnami/nginx --dry-run
# Згенерувати лише YAML (для інспекції або GitOps)helm template my-nginx bitnami/nginx > nginx-manifests.yamlcat nginx-manifests.yaml | head -100
# Валідація YAMLkubectl apply -f nginx-manifests.yaml --dry-run=client
# Очищенняrm nginx-manifests.yamlВправа 6: Керування кількома релізами (Ціль: 5 хвилин)
Розділ «Вправа 6: Керування кількома релізами (Ціль: 5 хвилин)»# Встановити кілька релізівhelm install prod-web bitnami/nginx --set replicaCount=3 -n production --create-namespacehelm install dev-web bitnami/nginx --set replicaCount=1 -n development --create-namespacehelm 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 productionhelm uninstall dev-web -n developmenthelm uninstall staging-web -n stagingkubectl delete ns production development stagingВправа 7: Виклик — встановлення без документації
Розділ «Вправа 7: Виклик — встановлення без документації»Без перегляду документації виконайте це завдання:
Завдання: Встановити PostgreSQL з:
- Назва бази даних: myapp
- Ім’я користувача: appuser
- Пароль: secret123
- Сховище: 5Gi
# Підказка: Використовуйте helm show values, щоб знайти правильні параметриhelm show values bitnami/postgresql | grep -A5 -i "auth\|primary\|persistence"Рішення
helm install mydb bitnami/postgresql \ --set auth.database=myapp \ --set auth.username=appuser \ --set auth.password=secret123 \ --set primary.persistence.size=5Gi
# Перевіритиkubectl get podskubectl get pvc
# Очищенняhelm uninstall mydbНаступний модуль
Розділ «Наступний модуль»Модуль 1.4: Kustomize — керування конфігурацією без шаблонів, нативна кастомізація Kubernetes.