PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Helm-чарты для Kubernetes: пошаговый гайд по деплою

    Helm-чарты для Kubernetes: пошаговый гайд по деплою

    Аватар автора Helm-чарты для Kubernetes: пошаговый гайд по деплою

    Антон Ларичев

    Иконка календаря06 апреля 2026
    kubernetesdevopshelmmiddleИконка уровня middle
    Картинка поста Helm-чарты для Kubernetes: пошаговый гайд по деплою

    Введение

    Helm chart для Kubernetes — это стандартный способ упаковки и деплоя приложений в кластер. Вместо того чтобы вручную писать десятки YAML-манифестов для каждого окружения, вы описываете приложение один раз в виде чарта и разворачиваете его одной командой.

    Helm выступает пакетным менеджером для Kubernetes, как npm для Node.js или pip для Python. Он берет на себя шаблонизацию манифестов, управление зависимостями и версионирование релизов. В этой статье разберем создание Helm chart с нуля и пройдем весь путь от инициализации до деплоя приложения в Kubernetes.

    Структура Helm чарта и его компоненты

    Создание Helm chart начинается с команды, которая генерирует базовую структуру:

    # Создаем новый чарт для нашего приложения
    helm create myapp
    

    Команда создаст директорию со следующей структурой:

    myapp/
      Chart.yaml          # Метаданные чарта
      values.yaml         # Параметры по умолчанию
      templates/          # Шаблоны манифестов
        deployment.yaml
        service.yaml
        ingress.yaml
        _helpers.tpl      # Вспомогательные шаблоны
        NOTES.txt         # Сообщение после установки
      charts/             # Зависимости (субчарты)
    

    Файл Chart.yaml содержит метаданные чарта:

    apiVersion: v2
    name: myapp
    description: Helm chart для деплоя веб-приложения
    type: application
    version: 0.1.0        # Версия чарта
    appVersion: "1.0.0"   # Версия приложения
    

    Поле version обновляется при каждом изменении чарта, а appVersion отражает версию самого приложения. Это разделение позволяет обновлять конфигурацию деплоя независимо от кода приложения.

    Настройка values.yaml для параметризации деплоя

    Файл values.yaml — это центральное место для настройки параметров чарта. Все значения из этого файла доступны в шаблонах через объект .Values:

    # values.yaml — параметры по умолчанию
    replicaCount: 2
    
    image:
      repository: myregistry/myapp
      tag: "1.0.0"
      pullPolicy: IfNotPresent
    
    service:
      type: ClusterIP
      port: 80
      targetPort: 3000
    
    resources:
      limits:
        cpu: 500m
        memory: 256Mi
      requests:
        cpu: 100m
        memory: 128Mi
    
    env:
      NODE_ENV: production
      LOG_LEVEL: info
    
    ingress:
      enabled: true
      host: myapp.example.com
    

    Для разных окружений создаются отдельные файлы значений. Например, values-staging.yaml переопределяет только нужные параметры:

    # values-staging.yaml — переопределения для staging
    replicaCount: 1
    
    image:
      tag: "1.0.0-rc.1"
    
    env:
      NODE_ENV: staging
      LOG_LEVEL: debug
    
    ingress:
      host: staging.myapp.example.com
    

    Как создать шаблоны deployment и service

    Шаблоны в директории templates/ используют синтаксис Go templates. Файл deployment.yaml описывает основной ресурс:

    # templates/deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ include "myapp.fullname" . }}
      labels:
        {{- include "myapp.labels" . | nindent 4 }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          {{- include "myapp.selectorLabels" . | nindent 6 }}
      template:
        metadata:
          labels:
            {{- include "myapp.selectorLabels" . | nindent 8 }}
        spec:
          containers:
            - name: {{ .Chart.Name }}
              image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
              imagePullPolicy: {{ .Values.image.pullPolicy }}
              ports:
                - containerPort: {{ .Values.service.targetPort }}
              env:
                {{- range $key, $value := .Values.env }}
                - name: {{ $key }}
                  value: {{ $value | quote }}
                {{- end }}
              resources:
                {{- toYaml .Values.resources | nindent 12 }}
    

    Шаблон service связывает pod с сетью кластера:

    # templates/service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: {{ include "myapp.fullname" . }}
    spec:
      type: {{ .Values.service.type }}
      ports:
        - port: {{ .Values.service.port }}
          targetPort: {{ .Values.service.targetPort }}
          protocol: TCP
      selector:
        {{- include "myapp.selectorLabels" . | nindent 4 }}
    

    Обратите внимание на функцию include — она подставляет именованные шаблоны из _helpers.tpl, что избавляет от дублирования меток и имен.

    Деплой приложения в Kubernetes с Helm

    Перед установкой полезно проверить, какие манифесты сгенерирует Helm:

    # Рендерим шаблоны без установки
    helm template myapp ./myapp --values values-staging.yaml
    

    Проверяем валидность чарта:

    # Валидация чарта
    helm lint ./myapp
    

    Устанавливаем приложение в кластер:

    # Первый деплой приложения
    helm install myapp ./myapp \
      --namespace myapp-ns \
      --create-namespace \
      --values values-staging.yaml
    

    Для обновления существующего релиза используйте helm upgrade:

    # Обновление релиза с новыми параметрами
    helm upgrade myapp ./myapp \
      --namespace myapp-ns \
      --values values-staging.yaml \
      --set image.tag="1.1.0"
    

    Флаг --set позволяет переопределить отдельные значения без изменения файлов. Это удобно для CI/CD пайплайнов, где тег образа подставляется динамически.

    Как откатить неудачный релиз

    Helm хранит историю релизов, что позволяет быстро выполнить rollback:

    # Просмотр истории релизов
    helm history myapp --namespace myapp-ns
    
    # Откат к предыдущей версии
    helm rollback myapp 1 --namespace myapp-ns
    

    Частые ошибки при работе с Helm

    Первая ошибка — хардкод значений в шаблонах вместо использования values.yaml. Это лишает чарт гибкости и вынуждает менять шаблоны для каждого окружения.

    Вторая проблема — отсутствие ресурсных лимитов. Без указания resources.limits и resources.requests планировщик Kubernetes не может корректно распределить pod по нодам кластера.

    Третья ошибка — игнорирование команды helm lint перед деплоем. Линтер находит синтаксические ошибки в шаблонах до того, как они попадут в кластер.

    Четвертая проблема — хранение секретов в values.yaml. Пароли и токены должны передаваться через Kubernetes Secrets или внешние системы управления секретами, а не храниться в репозитории.

    Заключение

    Helm chart для Kubernetes значительно упрощает деплой приложений, превращая набор YAML-манифестов в переиспользуемый пакет с параметризацией. Создание чарта с правильной структурой, гибким values.yaml и чистыми шаблонами позволяет разворачивать приложение в любом окружении одной командой helm install. Используйте helm lint и helm template для проверки перед деплоем, а helm rollback — для быстрого отката при проблемах.

    Иконка глаза1 180

    Комментарии

    0

    Постройте личный план изучения Основы разработки до уровня Middle — бесплатно!

    Основы разработки — часть карты развития Frontend, Backend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы Git

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    HTML и CSS

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    CSS Flexbox

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    бесплатно
    Подробнее

    Похожие статьи

    Картинка поста Kubernetes простыми словами: первые шаги для разработчика
    Иконка аватараАнтон
    Иконка календаря04 июля 2026
    kubernetesdevopsdocker+ 3juniorИконка уровня junior

    Kubernetes простыми словами: первые шаги для разработчика

    Kubernetes — система оркестрации контейнеров, которая автоматизирует деплой и масштабирование приложений. Разбираем ключевые концепции на практических примерах.

    Иконка чипа0
    Иконка глаза579
    Иконка комментариев0
    Картинка поста Docker для разработчиков: с чего начать и как применять
    Иконка аватараАнтон
    Иконка календаря21 июля 2026
    dockerdevopsконтейнеры+ 3juniorИконка уровня junior

    Docker для разработчиков: с чего начать и как применять

    Docker — инструмент контейнеризации, который решает проблему «у меня работает». Установка, первый контейнер, Dockerfile и docker-compose с нуля.

    Иконка чипа+1
    Иконка глаза1 059
    Иконка комментариев0
    Картинка поста PostgreSQL vs MySQL: что выбрать для проекта
    Иконка аватараАнтон
    Иконка календаря13 августа 2026
    PostgreSQLMySQLбазы данных+ 3middleИконка уровня middle

    PostgreSQL vs MySQL: что выбрать для проекта

    PostgreSQL vs MySQL — сравниваем архитектуру, производительность, типы данных и транзакции, чтобы выбрать подходящую БД для вашего проекта.

    Иконка чипа0
    Иконка глаза188
    Иконка комментариев0
    Иконка чипа0