Параметризация шаблонов в зависимости от окружения (только в werf)

Окружение werf указывается опцией --env ($WERF_ENV), либо автоматически выставляется командой werf ci-env. Текущее окружение доступно в параметре $.Values.werf.env основного чарта.

Окружение werf используется при формировании имени релиза и имени Namespace’а, а также может использоваться для параметризации шаблонов:

# .helm/values.yaml:
memory:
  staging: 1G
  production: 2G
# .helm/templates/example.yaml:
memory: {{ index $.Values.memory $.Values.werf.env }}
werf render --env production

Результат:

memory: 2G

Для использования $.Values.werf.env в зависимых чартах воспользуйтесь директивой export-values (только в werf):

# .helm/Chart.yaml:
dependencies:
- name: child
  export-values:
  - parent: werf
    child: werf
# .helm/charts/child/templates/example.yaml:
{{ $.Values.werf.env }}

Результат:

production

Развертывание в разные Kubernetes Namespace

Имя Kubernetes Namespace для развертываемых ресурсов формируется автоматически (только в werf) по специальному шаблону [[ project ]]-[[ env ]], где [[ project ]] — имя проекта werf, а [[ env ]] — имя окружения.

Достаточно изменить окружение werf и вместе с ним изменится и Namespace:

# werf.yaml:
project: myapp
werf converge --env staging
werf converge --env production

Результат: один экземпляр приложения развёрнут в Namespace myapp-staging, а второй — в myapp-production.

Обратите внимание, что если в манифесте Kubernetes-ресурса явно указан Namespace, то для этого ресурса будет использован именно указанный в нём Namespace.

Изменение шаблона имени Namespace (только в werf)

Если вас не устраивает специальный шаблон, из которого формируется имя Namespace, вы можете его изменить:

# werf.yaml:
project: myapp
deploy:
  namespace: "backend-[[ env ]]"
werf converge --env production

Результат: приложение развёрнуто в Namespace backend-production.

Прямое указание имени Namespace

Вместо формирования имени Namespace по специальному шаблону можно указывать Namespace явно для каждой команды (рекомендуется также изменять и имя релиза):

werf converge --namespace backend-production --release backend-production

Результат: приложение развёрнуто в Namespace backend-production.

Форматирование имени Namespace

Namespace, сформированный по специальному шаблону или указанный опцией --namespace, приводится к формату RFC 1123 Label Names автоматически. Отключить автоматическое форматирование можно директивой deploy.namespaceSlug файла werf.yaml.

Вручную отформатировать любую строку согласно формату RFC 1123 Label Names можно командой werf slugify -f kubernetes-namespace.

Развертывание в разные кластеры Kubernetes

По умолчанию werf развертывает Kubernetes-ресурсы в кластер, на который настроена команда werf kubectl. Для развертывания в разные кластеры можно использовать разные kube-контексты единого kube-config файла (по умолчанию — $HOME/.kube/config):

werf converge --kube-context staging  # или $WERF_KUBE_CONTEXT=...
werf converge --kube-context production

… или использовать разные kube-config файлы:

werf converge --kube-config "$HOME/.kube/staging.config"  # или $WERF_KUBE_CONFIG=...
werf converge --kube-config-base64 "$KUBE_PRODUCTION_CONFIG_IN_BASE64"  # или $WERF_KUBE_CONFIG_BASE64=...

Развертывание из-под разных пользователей Kubernetes

По умолчанию werf для развертывания использует пользователя Kubernetes, через которого работает команда werf kubectl. Для развертывания из-под разных пользователей используйте разные kube-контексты:

werf converge --kube-context admin  # или $WERF_KUBE_CONTEXT=...
werf converge --kube-context regular-user