Ответ
Я пишу Helm chart как пакет, описывающий набор связанных ресурсов Kubernetes для развертывания приложения. Основная цель — параметризация и повторное использование.
Базовая структура chart:
my-chart/
├── Chart.yaml # Метаданные chart (имя, версия, зависимости)
├── values.yaml # Значения параметров по умолчанию
├── templates/ # Шаблоны манифестов Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # Вспомогательные шаблонные функции
└── charts/ # Директория для зависимых subcharts
Ключевые компоненты:
-
Chart.yaml: Определяет chart.apiVersion: v2 name: my-app description: A Helm chart for My Application type: application version: 1.0.0 appVersion: "2.1" dependencies: - name: redis version: "~14.0" repository: "https://charts.bitnami.com/bitnami" -
values.yaml: Централизованная конфигурация.replicaCount: 2 image: repository: nginx tag: "stable" pullPolicy: IfNotPresent service: type: ClusterIP port: 80 -
Шаблоны в
templates/: Используют синтаксис Go templates для подстановки значений. Примерdeployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "my-app.fullname" . }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: {{- include "my-app.selectorLabels" . | nindent 6 }} template: metadata: labels: {{- include "my-app.labels" . | nindent 8 }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: {{ .Values.service.port }}Здесь
{{ include "my-app.fullname" . }}вызывает именованную шаблонную функцию из_helpers.tpl.
Рабочий процесс: Для установки chart с кастомными значениями я выполняю:
helm install my-release ./my-chart -f my-production-values.yaml