Helm (в Kubernetes)

⌘K

Helm (в Kubernetes)

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

Helm chart — это набор файлов, в которых описаны все необходимые ресурсы Kubernetes: Deployment, Service, ConfigMap, Ingress, PVC и т. д. Чарты позволяют описывать целое приложение (или компонент микросервисной архитектуры) как единый, переносимый и настраиваемый блок.

Основные возможности Helm:

  • шаблонизация манифестов с переменными (values),
  • установка приложений одной командой (helm install),
  • обновление уже установленных релизов (helm upgrade),
  • откат до предыдущей версии (helm rollback),
  • хранение и публикация чартов в репозиториях (helm repo),
  • предварительный просмотр манифестов без установки (helm template).

Примеры команд:

  • helm install my-app ./chart — установка приложения из локального чарта;
  • helm upgrade my-app ./chart — обновление установленного релиза;
  • helm pull stable/postgresql — загрузка чарта из репозитория;
  • helm list — просмотр установленных релизов в кластере.

Helm особенно ценен при работе с микросервисами, где каждый сервис имеет свою инфраструктуру. Используя чарты, можно стандартизировать развёртывание, централизованно управлять параметрами и встроить установку в CI/CD пайплайны.

В командах DevOps Helm стал де-факто стандартом для доставки приложений в Kubernetes, поскольку он упрощает конфигурацию, повышает повторяемость и сокращает количество ручных ошибок при релизах. Его активно применяют как для внутренних сервисов, так и для развертывания стороннего ПО (например, базы данных, мониторинг, ingress-контроллеры и др.).


Структура Helm Chart

Helm chart — это директория с определённой структурой. В ней находятся все необходимые файлы и шаблоны для развертывания приложения в Kubernetes.

Пример базовой структуры:

my-chart/
├── Chart.yaml
├── values.yaml
├── charts/
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── _helpers.tpl
└── README.md

Компоненты:

  • Chart.yaml
    Основной файл метаданных чарта. Здесь указываются имя, версия, описание, зависимости и другие параметры.
    Пример: apiVersion: v2 name: my-app description: A sample Helm chart version: 0.1.0
  • values.yaml
    Конфигурационный файл с переменными, которые подставляются в шаблоны. Это позволяет гибко управлять параметрами без изменения самих манифестов.
    Пример: replicaCount: 2 image: repository: nginx tag: "1.25"
  • templates/
    Каталог с шаблонами YAML-файлов Kubernetes. Здесь описываются все ресурсы: Deployments, Services, Ingress, ConfigMaps и т.д. Поддерживает Go-шаблоны и переменные из values.yaml.
  • _helpers.tpl
    Файл с вспомогательными функциями и шаблонами, которые можно переиспользовать внутри других шаблонов.
  • charts/
    Каталог для зависимых чартов (subcharts). Если приложение зависит от других сервисов (например, Redis, PostgreSQL), они могут быть подключены сюда.
  • README.md
    Необязательный файл, содержащий описание чарта, переменных, примеры установки и настройки.

Пример Helm-шаблона: templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-app.fullname" . }}
  labels:
    app: {{ include "my-app.name" . }}
    chart: {{ include "my-app.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "my-app.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "my-app.name" . }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.port }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Пример values.yaml к этому шаблону:

replicaCount: 3

image:
  repository: nginx
  tag: "1.25"
  pullPolicy: IfNotPresent

service:
  port: 80

resources:
  limits:
    cpu: "500m"
    memory: "256Mi"
  requests:
    cpu: "250m"
    memory: "128Mi"

Как это работает:

  • {{ .Values.* }} — обращение к значениям, заданным в values.yaml.
  • include — подключение шаблонов из _helpers.tpl, например для генерации имени.
  • toYaml и nindent — форматирование вложенных YAML-блоков (для ресурсов, env и т.п.).
  • Всё шаблонируется на этапе установки или генерации с помощью команды helm template.