Как писать Helm chart

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

Ответ

Я пишу Helm chart как пакет, описывающий набор связанных ресурсов Kubernetes для развертывания приложения. Основная цель — параметризация и повторное использование.

Базовая структура chart:

my-chart/
├── Chart.yaml          # Метаданные chart (имя, версия, зависимости)
├── values.yaml         # Значения параметров по умолчанию
├── templates/          # Шаблоны манифестов Kubernetes
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── _helpers.tpl   # Вспомогательные шаблонные функции
└── charts/             # Директория для зависимых subcharts

Ключевые компоненты:

  1. 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"
  2. values.yaml: Централизованная конфигурация.

    replicaCount: 2
    image:
      repository: nginx
      tag: "stable"
      pullPolicy: IfNotPresent
    service:
      type: ClusterIP
      port: 80
  3. Шаблоны в 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