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

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
Служба выставляет NGINX наружу. Связь с подом осуществляется через селектор:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 8080
Теперь нам нужно создать предыдущие ресурсы с помощью команды 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

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: {}
Вы можете указать конкретный 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