Gymterview
middle

Что такое Helm?

Helm — пакетный менеджер для Kubernetes, аналог apt/yum для Linux или Maven для Java. Позволяет описывать, устанавливать и обновлять приложения в Kubernetes как единый пакет.

Основные понятия

Понятие Описание Аналогия
Chart Пакет Helm с шаблонами K8s-ресурсов Maven-артефакт
Values Файл параметров (values.yaml) для шаблонов application.properties
Release Конкретная установка Chart’а в кластер Запущенное приложение
Repository Хранилище Chart’ов Maven Repository

Структура Chart’а

Пример
my-spring-app/
  Chart.yaml          # Метаданные (имя, версия, описание)
  values.yaml         # Значения по умолчанию
  templates/          # Шаблоны Kubernetes-ресурсов
    deployment.yaml
    service.yaml
    ingress.yaml
    configmap.yaml
    hpa.yaml
    _helpers.tpl      # Вспомогательные шаблонные функции
  charts/             # Зависимости (sub-charts)
Пример templates/deployment.yaml и values.yaml

templates/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-app.fullname" . }}
  labels:
    {{- include "my-app.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "my-app.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-app.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.targetPort }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

values.yaml:

replicaCount: 3

image:
  repository: my-registry/my-spring-app
  tag: "1.0.0"
  pullPolicy: Always

service:
  type: ClusterIP
  port: 80
  targetPort: 8080

ingress:
  enabled: true
  host: api.example.com

resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "1Gi"
    cpu: "1000m"

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilization: 70

Основные команды Helm

Пример
# Добавить репозиторий
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# Установить Chart
helm install my-release my-spring-app/ -f values-prod.yaml -n production

# Обновить Release
helm upgrade my-release my-spring-app/ -f values-prod.yaml -n production

# Установить или обновить
helm upgrade --install my-release my-spring-app/ -f values-prod.yaml

# Откатить к предыдущей версии
helm rollback my-release 1

# Список установленных Release
helm list -n production

# Посмотреть сгенерированные манифесты без установки
helm template my-release my-spring-app/ -f values-prod.yaml

Зачем Helm Java-разработчику

  • Один Chart для всех окружений (dev, staging, prod) — разные values.yaml
  • Управление зависимостями (PostgreSQL, Redis, Kafka — готовые Chart’ы из публичных репозиториев)
  • Версионирование и откат деплоев
  • Стандартизация инфраструктуры в команде

На собеседовании: достаточно объяснить концепцию Chart + Values + Release и привести пример, зачем это нужно (один Chart, разные окружения). Частая ошибка — путать Helm с kubectl apply и не понимать, что Helm добавляет шаблонизацию и управление релизами поверх обычных манифестов.