Что такое Хелм? Краткое руководство для новичков в Kubernetes

by moiseevrus
Сегодня Kubernetes становится обязательным для практиков DevOps для оркестровки контейнеров. Когда у вас есть образ Docker для вашего приложения, вам нужно написать манифесты YAML для определения рабочих нагрузок Kubernetes. Затем вы развертываете их с помощью команды kubectl .Этот способ развертывания — когда у вас есть только одно приложение. Когда вы начинаете иметь много приложений и несколько сред, он становится перегруженным. Часто вы определяете одни и те же файлы YAML в 90% случаев.

Здесь мы сосредоточимся на том, как разумно управлять приложениями с помощью Helm.


Что такое Хелм?

Изображение логотипа Helm
Логотип Helm с https://helm.sh/

Helm — это менеджер пакетов для Kubernetes. Helm — это проект с открытым исходным кодом, изначально созданный DeisLabs и переданный в дар Cloud Native Foundation ( CNCF ). В настоящее время CNCF поддерживает проект и завершил его. Это означает, что она зрелая, а не просто причуда.

Управление пакетами — не новая концепция в индустрии программного обеспечения. В дистрибутивах Linux вы управляете установкой и удалением программного обеспечения с помощью менеджеров пакетов, таких как YUM/RPM или APT . В Windows вы можете использовать Chocolatey или Homebrew на Mac.

Helm позволяет упаковывать и развертывать готовые приложения в Kubernetes. Пакет называется ” Диаграмма” . Helm использует систему шаблонов, основанную на шаблоне Go , для рендеринга манифестов Kubernetes из диаграмм. Диаграмма — это согласованная структура, разделяющая шаблоны и значения.

Как пакет, диаграмма также может управлять зависимостями с другими диаграммами. Например, если вашему приложению для работы требуется база данных MySQL, вы можете включить диаграмму в качестве зависимости. Когда Helm запускается на верхнем уровне каталога диаграммы, он устанавливает целые зависимости. У вас есть всего одна команда для рендеринга и выпуска вашего приложения в Kubernetes.

В диаграммах Helm версии используются для отслеживания изменений в ваших манифестах, поэтому вы можете установить конкретную версию диаграммы для определенных конфигураций инфраструктуры. Helm хранит историю выпусков всех развернутых диаграмм в выделенной рабочей области. Это упрощает обновление и откат приложений, если что-то пойдет не так.

Helm позволяет сжимать графики. Результатом этого является артефакт, сравнимый с образом Docker. Затем вы можете отправить его в удаленный репозиторий для повторного использования и совместного использования.


Каковы преимущества использования Helm?

  • Helm предоставляет вам возможность устанавливать приложения с помощью одной команды. Диаграмма может содержать другие диаграммы в качестве зависимостей. Следовательно, вы можете развернуть весь стек с помощью Helm. Вы можете использовать Helm как docker-compose, но для Kubernetes.
  • Диаграмма включает шаблоны для различных ресурсов Kubernetes для формирования законченного приложения. Это снижает сложность микросервисов и упрощает управление ими в Kubernetes.
  • Графики можно сжимать и отправлять в удаленное хранилище. Это создает артефакт приложения для Kubernetes. Вы также можете получить и развернуть существующие диаграммы Helm из репозиториев. Это сильная сторона повторного использования и совместного использования.
  • Helm хранит историю развернутых выпусков в рабочей области Helm. Когда что-то пойдет не так, откатиться к предыдущей версии очень просто — канареечный выпуск упрощается с помощью Helm для развертывания с нулевым временем простоя.
  • Helm делает развертывание легко настраиваемым. Приложения можно настраивать «на лету» во время развертывания. Изменяя параметры, вы можете использовать одну и ту же диаграмму для нескольких сред, таких как разработка, подготовка и производство.
  • Оптимизация конвейеров CI/CD — передовой опыт GitOps.

Быстрый взгляд на проблему, которую решает Helm

Основная практика Kubernetes — писать манифесты YAML вручную. Мы создадим минимум файлов YAML для развертывания NGINX в Kubernetes.

Вот развертывание, которое создаст поды:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.6
        ports:
        - containerPort: 80
развертывание.yaml

Служба выставляет NGINX наружу. Связь с подом осуществляется через селектор:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
Сервис Kubernetes для NGINX: service.yaml

Теперь нам нужно создать предыдущие ресурсы с помощью команды kubectl:

$ kubectl create -f deployment.yaml
$ kubectl create -f service.yaml

Проверяем работоспособность всех ресурсов:

$ kubectl get deployment -l app=nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           8m29s
$ kubectl get pods -l app=nginx                                                                                      
NAME                     READY   STATUS    RESTARTS   AGE
nginx-65b89996ff-dcfs9   1/1     Running   0          2m26s
$ kubectl get svc -l app=nginx 
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.106.79.171   <none>        80/TCP    4m58s
  • Конкретные значения в манифестах YAML жестко закодированы и не могут использоваться повторно.
  • Избыточная информация для указания, такая как метки и селекторы, приводит к потенциальным ошибкам.
  • Kubectl не обрабатывает потенциальные ошибки после выполнения. Вы должны развернуть каждый файл один за другим.
  • Отслеживание изменений невозможно.

Создайте диаграмму Helm с нуля

Helm может создать структуру диаграммы в одной командной строке:

$ helm create nginx

Понимание структуры диаграммы Helm

Скриншот древовидной структуры диаграммы Helm
Древовидная структура диаграммы Helm
  • Chart.yaml: файл YAML, содержащий информацию о диаграмме.
  • charts: Каталог, содержащий любые диаграммы, от которых зависит эта диаграмма.
  • templates: здесь Helm находит определения YAML для ваших служб, развертываний и других объектов Kubernetes. Вы можете добавить или заменить сгенерированные файлы YAML своими собственными.
  • templates/NOTES.txt: это шаблонный текстовый файл, который распечатывается после успешного развертывания диаграммы. Здесь полезно кратко описать следующие шаги по использованию диаграммы.
  • templates/_helpers.tpl: этот файл является расположением по умолчанию для частичных шаблонов. Предполагается, что файлы, имя которых начинается с символа подчеркивания, не имеют внутри манифеста. Эти файлы не отображаются в определениях объектов Kubernetes, но доступны везде в других шаблонах диаграмм для использования.
  • templates/tests: тесты, которые подтверждают, что ваша диаграмма работает должным образом, когда она установлена.
  • values.yaml: значения конфигурации по умолчанию для этой диаграммы.

Настройка шаблонов

По values.yamlумолчанию загружается автоматически при развертывании диаграммы. Здесь мы устанавливаем тег изображения 1.21.5:

# Default values for nginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "1.21.5"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}
значения.yaml

Вы можете указать конкретный values.yamlфайл, чтобы настроить развертывание для конкретных параметров среды.


Установите диаграмму руля

Хороший совет перед развертыванием чарта Helm — запустить линтер, если вы сделали обновление:

$ helm lint nginx
==> Linting nginx
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

Запустите Helm, чтобы установить диаграмму в пробном режиме и в режиме отладки, чтобы убедиться, что все в порядке:

$ helm install --debug --dry-run nginx nginx 

Использование helm linter и пробной установки с режимом отладки сэкономит вам драгоценное время при разработке.

Чтобы установить график, снимите --dry-runфлажок:

$ helm install nginx nginx          
NAME: nginx
LAST DEPLOYED: Mon Mar 14 12:01:46 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=nginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

Вы можете увидеть шаблонное содержимое, NOTES.txtобъясняющее, как подключиться к приложению.

Теперь вы можете получить релиз в рабочей области Helm:

$ helm list               
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
nginx   default         1               2022-03-14 12:01:46.926038 +0100 CET    deployed        nginx-0.1.0     1.0.0 

Обновите выпуск Helm

Представьте, что вы хотите обновить образ контейнера 1.21.6для целей тестирования.

Вместо создания нового values.yamlмы изменим настройку из командной строки.

$ helm upgrade nginx nginx --set image.tag=1.21.6
Release "nginx" has been upgraded. Happy Helming!
NAME: nginx
LAST DEPLOYED: Mon Mar 14 12:04:40 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=nginx" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

Модуль также использует новый образ контейнера:

$ kubectl get pod -l app.kubernetes.io/name=nginx -o jsonpath='{.items[0].spec.containers[0].image}'
nginx:1.21.6

Обновление видно в истории графика:

$ helm history nginx                                                   
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION     
1               Mon Mar 14 12:07:33 2022        superseded      nginx-0.1.0     1.0.0           Install complete
2               Mon Mar 14 12:08:25 2022        deployed        nginx-0.1.0     1.0.0           Upgrade complete

Изменение можно проверить с помощью helm diff:

$ helm diff revision nginx 1 2
default, nginx, Deployment (apps) has changed:
  # Source: nginx/templates/deployment.yaml
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: nginx
    labels:
      helm.sh/chart: nginx-0.1.0
      app.kubernetes.io/name: nginx
      app.kubernetes.io/instance: nginx
      app.kubernetes.io/version: "1.0.0"
      app.kubernetes.io/managed-by: Helm
  spec:
    replicas: 1
    selector:
      matchLabels:
        app.kubernetes.io/name: nginx
        app.kubernetes.io/instance: nginx
    template:
      metadata:
        labels:
          app.kubernetes.io/name: nginx
          app.kubernetes.io/instance: nginx
      spec:
        serviceAccountName: nginx
        securityContext:
          {}
        containers:
          - name: nginx
            securityContext:
              {}
-           image: "nginx:1.21.5"
+           image: "nginx:1.21.6"
            imagePullPolicy: IfNotPresent
            ports:
              - name: http
                containerPort: 80
                protocol: TCP
            livenessProbe:
              httpGet:
                path: /
                port: http
            readinessProbe:
              httpGet:
                path: /
                port: http
            resources:
              {}

Откат выпуска Helm

Обновление не было окончательным, и вы хотите вернуться. Поскольку Helm сохраняет все изменения, откат выполняется очень просто:

$ helm rollback nginx 1
Rollback was a success! Happy Helming!

Под теперь вернулся к 1.21.5образу контейнера:

$ kubectl get pod -l app.kubernetes.io/name=nginx -o jsonpath='{.items[0].spec.containers[0].image}'
nginx:1.21.5

Удалить диаграмму Helm

Удаление диаграммы Helm тривиально, так как установка:

$ helm uninstall nginx

Повторное использование существующих диаграмм Helm

Многие известные проекты предоставляют диаграмму Helm, чтобы сделать интеграцию более удобной. Они предоставляют диаграммы через репозиторий. Вам нужно просто добавить его на своей стороне:

$ helm repo add bitnami https://charts.bitnami.com/bitnami

После добавления обновите локальный кеш, чтобы синхронизировать информацию с удаленными репозиториями:

$ helm repo update

Теперь вы можете установить диаграмму в свой кластер Kubernetes:

$ helm install nginx bitnami/nginx

Диаграммы развертываются со значениями по умолчанию. Вы можете вдохновить и указать обычай values.yamlв соответствии с вашими потребностями!

$ helm install my-release bitnami/nginx -f values.yaml

You may also like

Leave a Comment