При организации доставки приложения в Kubernetes необходимо определиться с тем, какой формат выбрать для управления конфигурацией развёртывания (параметризации, управления зависимостями, конфигурации под различные окружения и т.д.), а также способом применения этой конфигурации – непосредственно механизмом развёртывания.
Nelm — обратно-совместимая с Helm альтернатива — встроена в werf и используется для решения перечисленных задач. Разработка и сопровождение конфигурации реализуется с помощью Helm-чартов, а для процесса развёртывания предлагается Nelm c дополнительными возможностями:
- отслеживание состояния выкатываемых ресурсов (с возможностью изменения поведения для каждого ресурса):
- умное ожидание готовности ресурсов;
- мгновенное завершение проблемного развертывания без необходимости ожидания таймаута;
- прогресс развёртывания, логи, системные события и ошибки приложения.
- использование произвольного порядка развертывания для любых ресурсов, а не только для хуков;
- ожидание создания и готовности ресурсов, не принадлежащих релизу;
- использование более надежного метода Server-Side Apply для обновления ресурсов вместо 3-Way Merge;
- возможности по типу
terraform plan
, доступные “из коробки”; - интеграция сборки и развертывания и многое другое.
werf стремится сделать работу с Helm-развертываниями более простой, удобной и гибкой, при этом не ломая обратную совместимость с Helm-чартами, Helm-шаблонами и Helm-релизами.
Простой пример развертывания
Для развертывания простого приложения достаточно двух файлов и команды werf converge
, запущенной в Git-репозитории приложения:
# .helm/templates/hello.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- image: nginxdemos/hello:plain-text
# werf.yaml:
configVersion: 1
project: hello
werf converge --repo registry.example.org/repo --env production
Результат: Deployment hello
развёрнут в Namespace’е hello-production
.
Расширенный пример развертывания
Более сложный пример развертывания со сборкой образов и внешними Helm-чартами:
# werf.yaml:
configVersion: 1
project: myapp
---
image: backend
dockerfile: Dockerfile
# Dockerfile:
FROM node
WORKDIR /app
COPY . .
RUN npm ci
CMD ["node", "server.js"]
# .helm/Chart.yaml:
dependencies:
- name: postgresql
version: "~12.1.9"
repository: https://charts.bitnami.com/bitnami
# .helm/values.yaml:
backend:
replicas: 1
# .helm/templates/backend.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: {{ $.Values.backend.replicas }}
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- image: {{ $.Values.werf.image.backend }}
werf converge --repo registry.example.org/repo --env production
Результат: собран образ backend
, а затем Deployment backend
и ресурсы чарта postgresql
развёрнуты в Namespace’е myapp-production
.