Как хранить Helm-шаблоны (templates)?

«Как хранить Helm-шаблоны (templates)?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике Helm-чарты (включая их шаблоны в директории templates/) всегда хранятся в системах контроля версий, обычно Git. Способ организации зависит от зрелости процесса.

Основные подходы:

  1. Монорепозиторий (Monorepo):

    • Как: Все чарты проекта лежат в одном репозитории, например, в папке charts/.
    • Плюсы: Простота, атомарные коммиты, легче отслеживать зависимости между чартами.
    • Минусы: Может вырасти в размерах, сложнее разграничить права.
      infra-repo/
      ├── charts/
      │   ├── frontend-app/
      │   │   ├── Chart.yaml
      │   │   ├── values.yaml
      │   │   └── templates/          # <-- Шаблоны хранятся здесь
      │   │       ├── deployment.yaml
      │   │       └── service.yaml
      │   └── redis-cache/
      │       └── ...
      └── applications/
  2. Отдельный репозиторий на чарт:

    • Как: Каждый чарт (например, company/nginx-ingress) имеет свой собственный Git-репозиторий.
    • Плюсы: Чёткое разделение ответственности, независимый жизненный цикл и версионирование.
    • Минусы: Больше репозиториев, сложнее вносить кросс-чарт изменения.

Далее — публикация в реестр (Helm Repository): Просто хранить в Git недостаточно для использования в CI/CD. Собранные чарты (.tgz-пакеты) я публикую в реестр:

  • ChartMuseum / Harbor: Специализированные приватные реестры для Helm.
  • OCI-репозитории (современный стандарт с Helm 3.8+): Храню чарты как OCI-артефакты в том же реестре, что и образы контейнеров (например, AWS ECR, Google Artifact Registry, Harbor).
    # Упаковка и публикация в OCI-репозиторий
    helm package ./my-chart
    helm push my-chart-1.0.0.tgz oci://registry.my-company.com/charts

Мой workflow:

  1. Разрабатываю шаблоны в Git-репозитории.
  2. CI-пайплайн (например, GitHub Actions) на тег запускает helm lint, helm package, подписывает чарт (если нужно) и пушит артефакт в OCI-репозиторий.
  3. В пайплайне развёртывания приложения просто указываю helm upgrade --install my-app oci://registry.my-company.com/charts/my-chart --version 1.0.0.