Environment-dependent template parameters (werf only)
You can set the environment to use in werf with the --env
option ($WERF_ENV
). It can also be set automatically via the werf ci-env
command. The current environment is stored in the $.Values.werf.env
parameter of the main chart.
The werf environment is used when generating the release name and Namespace name and can also be used to parameterize templates:
# .helm/values.yaml:
memory:
staging: 1G
production: 2G
# .helm/templates/example.yaml:
memory: {{ index $.Values.memory $.Values.werf.env }}
werf render --env production
Output:
memory: 2G
The export-values
(werf only) directive provides a way to use $.Values.werf.env
in dependent charts:
# .helm/Chart.yaml:
dependencies:
- name: child
export-values:
- parent: werf
child: werf
# .helm/charts/child/templates/example.yaml:
{{ $.Values.werf.env }}
Output:
production
Deployment to various Kubernetes Namespaces
The name of the Kubernetes Namespace for the resources being deployed is generated automatically (werf only) using a custom pattern [[ project ]]-[[ env ]]
, where [ project ]]
is the werf project name, and [[ env ]]
is the environment name.
Thus, the Namespace changes when the werf environment changes:
# werf.yaml:
project: myapp
werf converge --env staging
werf converge --env production
In this case, the first instance of the application will be deployed to the myapp-staging
namespace, and the second will be deployed to the myapp-production
namespace.
Note that if the Namespace is explicitly specified in the Kubernetes resource manifest, it will be used for that resource.
Changing the Namespace naming pattern (werf only)
You can change the custom pattern used to generate the Namespace name.
# werf.yaml:
project: myapp
deploy:
namespace: "backend-[[ env ]]"
werf converge --env production
In this case, the application will be deployed to the backend-production
Namespace.
Specifying the Namespace name explicitly
You can specify the Namespace explicitly for each command instead of generating the Namespace using a custom pattern (it is recommended to change the release name as well):
werf converge --namespace backend-production --release backend-production
In this case, the application will be deployed to the backend-production
Namespace.
Formatting the Namespace name
Namespace generated using a custom pattern or specified by the --namespace
option is converted to the RFC 1123 Label Names format automatically. You can disable automatic formatting using the deploy.namespaceSlug
directive in werf.yaml
.
You can manually format any string according to RFC 1123 Label Names format using the werf slugify -f kubernetes-namespace
command.
Deploying to different Kubernetes clusters
By default, werf deploys Kubernetes resources to the cluster set for the werf kubectl
command. You can use different kube-contexts of a single kube-config file (the default is $HOME/.kube/config
) to deploy to different clusters:
werf converge --kube-context staging # or $WERF_KUBE_CONTEXT=...
werf converge --kube-context production
… or use different kube-config files:
werf converge --kube-config "$HOME/.kube/staging.config" # or $WERF_KUBE_CONFIG=...
werf converge --kube-config-base64 "$KUBE_PRODUCTION_CONFIG_IN_BASE64" # or $WERF_KUBE_CONFIG_BASE64=...
Deploying as a different Kubernetes user
By default, werf uses the Kubernetes user set for the werf kubectl
command for deployment. You can use several kube contexts to deploy as different users:
werf converge --kube-context admin # or $WERF_KUBE_CONTEXT=...
werf converge --kube-context regular-user