Helm-чарты позволяют упаковать Kubernetes-приложения в удобный пакет, включающий все необходимые ресурсы для их развертывания и управления. Чарты используются для автоматизации создания, обновления и удаления приложений в Kubernetes, что делает управление ими более простым и гибким.
Для создания нового чарта используйте команду:
helm create <имя_чарта>
Helm автоматически сгенерирует базовую структуру директорий и файлов, которые содержат необходимые шаблоны и конфигурации для развертывания приложения в Kubernetes.
Chart.yaml
Главный файл чарта, содержащий метаданные: название, версия, описание и версия приложения. Также может включать информацию о зависимостях, если приложение зависит от других чартов.
Пример использования:
Указывает, какое приложение разворачивается, и его версию.
Упрощает управление версиями чарта и отслеживание изменений.
values.yaml
Файл с параметрами по умолчанию, который используется для задания значений, применяемых к шаблонам чарта для генерации конечных манифестов Kubernetes.
Пример использования:
Задает параметры, такие как количество реплик, тип сервиса, образ контейнера.
Позволяет переопределять значения через флаг --set
или дополнительный файл при установке.
templates/
В этой директории хранятся шаблоны YAML-файлов Kubernetes, определяющие объекты (поды, деплойменты, сервисы и т.д.), которые будут созданы при установке чарта. Шаблоны используют язык Go для динамической генерации манифестов на основе значений из values.yaml
.
Пример использования:
Шаблоны для создания объектов Kubernetes (например, deployment.yaml
, service.yaml
).
Логика для гибкой настройки ресурсов (например, количество реплик или тип сервиса).
charts/
Директория для зависимостей — других чартов, необходимых для работы вашего приложения. Зависимости могут быть установлены локально или загружены из удаленных репозиториев.
Пример использования:
Зависимости загружаются командой helm dependency update
, если они указаны в Chart.yaml
.
.helmignore
Этот файл работает аналогично .gitignore
, исключая файлы и директории при упаковке чарта в архив.
Пример использования:
Исключение ненужных файлов (например, документации или временных файлов), чтобы они не попали в финальный пакет.
Теперь, когда мы рассмотрели основную структуру чарта и назначение ключевых файлов, перейдем к практическому примеру. Мы создадим чарт для развертывания NGINX, настроим все необходимые параметры и рассмотрим, как шаблоны используют данные из values.yaml
для генерации Kubernetes-ресурсов.
Начните с создания базовой структуры чарта. Введите команду:
helm create nginx-chart
Это создаст директорию nginx-chart/
с базовыми файлами:
nginx-chart
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
Файл Chart.yaml
является ключевым элементом любого Helm-чарта. В этом файле указываются метаданные чарта, такие как его имя, версия, описание, а также информация о зависимостях.
Пример содержимого Chart.yaml
для чарта NGINX:
apiVersion: v2
name: nginx-chart
description: A Helm chart for deploying NGINX
version: 0.1.0
appVersion: "1.21.0"
Ключевые поля:
apiVersion: Версия API Helm для данного чарта. Для чартов Helm 3 используйте v2
.
name: Название вашего чарта. Оно должно быть уникальным в вашем репозитории.
description: Краткое описание того, что делает этот чарт.
version: Версия самого чарта. Каждый раз, когда вы вносите изменения в чарт, необходимо обновлять эту версию.
appVersion: Версия приложения (в данном случае NGINX), которая будет развернута. Это поле не влияет на логику Helm, но помогает пользователям видеть, какую версию приложения они устанавливают.
Файл values.yaml
используется для указания значений по умолчанию для параметров, которые могут быть изменены при установке чарта. Настройте его следующим образом:
replicaCount: 2
image:
repository: nginx
tag: "1.21.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
serviceAccount:
create: true
name: ""
ingress:
enabled: false
annotations: {}
hosts:
- host: chart-example.local
paths: []
tls: []
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 5
targetCPUUtilizationPercentage: 80
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
Этот файл содержит следующие настройки:
replicaCount: Количество реплик приложения.
image: Настройки образа контейнера NGINX, включая версию (tag
).
service: Тип сервиса и порт, через который будет доступен NGINX.
serviceAccount: Создание учетной записи сервиса для чарта.
ingress: Параметры для Ingress (по умолчанию выключено).
autoscaling: Параметры для авто-масштабирования (по умолчанию выключено).
Теперь настроим шаблоны в папке templates, которые будут использовать значения из values.yaml
.
Шаблон для создания Kubernetes-сервиса:
apiVersion: v1
kind: Service
metadata:
name: {{ include "nginx-chart.fullname" . }}
labels:
app: {{ include "nginx-chart.name" . }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
selector:
app: {{ include "nginx-chart.name" . }}
Шаблон для создания деплоймента NGINX:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nginx-chart.fullname" . }}
labels:
app: {{ include "nginx-chart.name" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ include "nginx-chart.name" . }}
template:
metadata:
labels:
app: {{ include "nginx-chart.name" . }}
spec:
serviceAccountName: {{ if .Values.serviceAccount.create }}{{ include "nginx-chart.serviceAccountName" . }}{{ else }}{{ .Values.serviceAccount.name }}{{ end }}
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
Шаблон для создания учетной записи сервиса:
{{- if .Values.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "nginx-chart.serviceAccountName" . }}
{{- end }}
Проверьте чарт на наличие ошибок:
helm lint ./nginx-chart
Установите чарт:
helm install test-nginx ./nginx-chart
Проверьте статус релиза:
helm status test-nginx
Проверьте состояние подов:
kubectl get pods
Когда приложение больше не нужно, его можно удалить:
helm uninstall test-nginx