|
All checks were successful
Publish Helm Chart to Forgejo / publish (push) Successful in 19s
|
||
|---|---|---|
| .forgejo/workflows | ||
| templates | ||
| .gitignore | ||
| Chart.lock | ||
| Chart.yaml | ||
| README.md | ||
| values.yaml | ||
Standard Helm Chart
Стандартный универсальный Helm чарт для развертывания приложений в Kubernetes с поддержкой PostgreSQL и расширенной настройкой переменных окружения.
Описание
Этот чарт предназначен для развертывания приложений с расширенной функциональностью:
- Развертывание приложения с настраиваемым количеством реплик
- Поддержка Service для доступа к приложению
- Настройка Ingress для внешнего доступа с поддержкой TLS через cert-manager
- Интеграция с PostgreSQL через зависимость (опционально)
- Подключение существующих ConfigMaps и Secrets через envFrom
- Поддержка предустановочных задач через scriptJob (migrations, init scripts)
- Настройка ресурсов (CPU, память) для контейнеров
- Поддержка приватных Docker registry через imagePullSecrets
Установка
# Базовая установка
helm install my-app .
# Установка с кастомными значениями
helm install my-app . -f values.yaml
# Установка с переопределением значений через командную строку
helm install my-app . \
--set image.repository=my-app \
--set image.tag=latest \
--set service.port=8080
Конфигурация
Основные параметры
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
replicaCount |
Количество реплик приложения | 1 |
image.repository |
Docker образ приложения | "" (заполняется CI) |
image.tag |
Тег Docker образа | "" (заполняется CI) |
image.pullPolicy |
Политика загрузки образа | IfNotPresent |
container.port |
Порт контейнера | 9000 |
Service
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
service.type |
Тип сервиса | ClusterIP |
service.port |
Порт сервиса | 9000 |
Ingress
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
ingress.enabled |
Включить Ingress | false |
ingress.className |
Ingress Controller класс | nginx |
ingress.host |
Хост для Ingress | "" |
ingress.proxyBodySize |
Максимальный размер тела запроса | 20m |
ingress.tls.enabled |
Включить TLS | false |
ingress.tls.clusterIssuer |
ClusterIssuer для cert-manager | letsencrypt-prod |
ingress.tls.secretName |
Имя Secret для TLS | "" (автогенерируется) |
Переменные окружения (envFrom)
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
includeVariables.enabled |
Включить подключение существующих ConfigMaps и Secrets | false |
includeVariables.secrets |
Список существующих Secrets для подключения через envFrom | [] |
includeVariables.configMaps |
Список существующих ConfigMaps для подключения через envFrom | [] |
Примечание: Чарт подключает существующие ConfigMaps и Secrets через envFrom. Убедитесь, что эти ресурсы созданы в кластере перед установкой чарта.
Script Job
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
scriptJob.enabled |
Включить предустановочный Job | false |
scriptJob.command |
Команда для выполнения | ["/bin/sh", "-c", "echo 'Script job completed'"] |
scriptJob.resources |
Ресурсы для Job | См. values.yaml |
scriptJob.backoffLimit |
Максимальное количество повторных попыток | 3 |
scriptJob.activeDeadlineSeconds |
Максимальное время выполнения (сек) | 600 |
PostgreSQL
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
postgres.enabled |
Включить PostgreSQL (как зависимость) | false |
postgres.auth.username |
Имя пользователя БД | app |
postgres.auth.password |
Пароль пользователя | app |
postgres.auth.database |
Имя базы данных | app |
postgres.primary.persistence.enabled |
Включить постоянное хранилище | true |
postgres.primary.persistence.size |
Размер хранилища | 8Gi |
Дополнительные параметры
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
registry.pullSecretName |
Имя Secret для доступа к registry | gitlab-registry-ro |
resources |
Ограничения ресурсов для контейнера (requests/limits для CPU и памяти) | {} |
Примеры использования
Простое веб-приложение
# values.yaml
replicaCount: 2
image:
repository: registry.example.com/myapp
tag: "v1.0.0"
pullPolicy: IfNotPresent
container:
port: 8080
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
host: myapp.example.com
proxyBodySize: "20m"
tls:
enabled: true
clusterIssuer: letsencrypt-prod
# Опционально: настройка ресурсов
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
Приложение с PostgreSQL и переменными окружения
# values.yaml
replicaCount: 2
image:
repository: registry.example.com/myapp
tag: "v1.0.0"
container:
port: 9000
service:
port: 9000
# Подключение существующих ConfigMaps и Secrets
includeVariables:
enabled: true
secrets:
- app-secrets
- postgres-credentials
configMaps:
- app-config
# Настройка ресурсов
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
postgres:
enabled: true
auth:
username: app
password: "secure-password"
database: myappdb
primary:
persistence:
enabled: true
size: 10Gi
scriptJob:
enabled: true
command:
- "/bin/sh"
- "-c"
- "python manage.py migrate"
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
Создание ConfigMap и Secret перед установкой:
# Создание ConfigMap
kubectl create configmap app-config \
--from-literal=NODE_ENV=production \
--from-literal=API_URL=https://api.example.com \
--from-literal=LOG_LEVEL=info
# Создание Secret
kubectl create secret generic app-secrets \
--from-literal=DATABASE_URL=postgresql://app:password@postgres-service:5432/myappdb \
--from-literal=JWT_SECRET=your-secret-key-here
С подключением существующих Secrets и ConfigMaps
# values.yaml
image:
repository: registry.example.com/myapp
tag: "v1.0.0"
# Подключение существующих ресурсов через envFrom
includeVariables:
enabled: true
secrets:
- shared-secrets
- postgres-credentials
configMaps:
- shared-config
- app-config
# Настройка ресурсов для контейнера
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
Установка с подключением существующих ресурсов
# Сначала создайте ConfigMap и Secret в кластере
kubectl create configmap app-config \
--from-literal=NODE_ENV=production \
--from-literal=API_URL=https://api.example.com
kubectl create secret generic app-secrets \
--from-literal=DATABASE_URL=postgresql://... \
--from-literal=JWT_SECRET=secret-value
# Установка с подключением существующих ресурсов
helm install my-app . \
--set image.repository=registry.example.com/myapp \
--set image.tag=v1.0.0 \
--set includeVariables.enabled=true \
--set includeVariables.secrets[0]=app-secrets \
--set includeVariables.configMaps[0]=app-config \
--set ingress.enabled=true \
--set ingress.host=myapp.example.com \
--set ingress.tls.enabled=true
Управление релизом
# Проверка статуса
helm status my-app
# Просмотр истории релизов
helm history my-app
# Обновление релиза
helm upgrade my-app . -f values.yaml
# Откат к предыдущей версии
helm rollback my-app 1
# Удаление релиза
helm uninstall my-app
Отладка
# Рендер шаблонов без установки
helm template my-app . -f values.yaml
# Проверка корректности чарта
helm lint .
# Dry-run установки
helm install my-app . --dry-run --debug
Особенности
ScriptJob для миграций и предустановочных задач
ScriptJob выполняется перед установкой/обновлением через Helm hooks и предназначен для:
- Выполнения миграций базы данных
- Инициализационных скриптов
- Предварительной настройки приложения
Job автоматически удаляется после успешного выполнения благодаря hook-delete-policy.
Поддержка приватных Docker registry
Чарт автоматически добавляет imagePullSecrets для доступа к приватным реестрам Docker (например, GitLab Registry). По умолчанию используется gitlab-registry-ro. ImagePullSecrets также применяются к scriptJob для доступа к образам из приватных реестров.
Настройка ресурсов
Чарт поддерживает настройку ограничений ресурсов (CPU и память) для основного контейнера приложения через параметр resources. Это позволяет контролировать использование ресурсов и обеспечивать стабильную работу приложения в кластере.
Требования
- Kubernetes 1.19+
- Helm 3.0+
- При использовании Ingress: установленный Ingress Controller (nginx)
- При использовании TLS: установленный cert-manager с настроенным ClusterIssuer
- При использовании PostgreSQL: зависимость postgresql устанавливается автоматически при
postgres.enabled=true - Доступ к приватному Docker registry (если используется): создан Secret для imagePullSecrets
- При использовании
includeVariables: ConfigMaps и Secrets должны быть созданы в кластере перед установкой чарта
Поддержка
Для вопросов и предложений создавайте issues в репозитории.