Learn how to effectively manage configuration complexity in Helm by using multiple values.yaml files to organize and override your application settings.
When deploying applications with Helm, you often need to provide different sets of values for various environments or purposes. Helm simplifies this process by allowing you to use multiple values files during installation or upgrades. You can achieve this by using the --values flag (or its shorthand -f) multiple times, followed by the path to each values file.
You can use multiple values files with Helm by using the --values flag (or -f) multiple times.
helm install ./path --values ./internalValues.yaml --values ./secrets.yaml
Helm merges the values files in the order they are specified, with the later files overriding values from earlier files.
For example, if internalValues.yaml sets replicaCount: 2 and secrets.yaml sets replicaCount: 3, the final value for replicaCount will be 3.
This merging process is a "deep merge," meaning that nested values are merged recursively.
However, there are some cases where Helm's deep merge might not behave as expected, especially with lists.
To see the final rendered values after merging, you can use the helm template command with the --debug flag.
helm template -f values1.yaml -f values2.yaml mychart --debug
This will print the rendered template to the console, allowing you to verify the final values used.
This code demonstrates how to deploy a simple web application using a Helm chart with multiple values files. It showcases how Helm merges values from different files, with later files overriding earlier ones. The example also includes how to use Helm's debug mode to view the final rendered template with merged values, ensuring the application is deployed with the desired configuration.
Let's imagine we have a simple Helm chart for deploying a web application.
Chart Structure:
mychart/
├── Chart.yaml
├── values.yaml
└── templates
└── deployment.yaml
values.yaml:
replicaCount: 1
image:
repository: nginx
tag: stable
resources: {}templates/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-web
spec:
replicas: {{ .Values.replicaCount }}
template:
metadata:
labels:
app: {{ .Release.Name }}-web
spec:
containers:
- name: web
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
resources:
{{ toYaml .Values.resources | indent 10 }}Now, let's create two values files:
internalValues.yaml:
replicaCount: 2
resources:
requests:
memory: "64Mi"
cpu: "250m"secrets.yaml:
image:
tag: 1.23.2
resources:
limits:
memory: "128Mi"
cpu: "500m"Installation and Debugging:
helm install myapp ./mychart --values ./internalValues.yaml --values ./secrets.yamlhelm template -f ./internalValues.yaml -f ./secrets.yaml myapp ./mychart --debugThis will output the final rendered deployment manifest, showing the merged values:
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-web
spec:
replicas: 2
template:
metadata:
labels:
app: myapp-web
spec:
containers:
- name: web
image: nginx:1.23.2
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"As you can see, the final values are a result of merging values.yaml, internalValues.yaml, and secrets.yaml, with later files overriding earlier ones. The resources section demonstrates the deep merge functionality, combining values from both internalValues.yaml and secrets.yaml.
This example demonstrates how to use multiple values files and debug the final rendered template to ensure your application is deployed with the desired configuration.
Best Practices:
production.yaml, staging.yaml), component configurations (database.yaml, frontend.yaml), and secrets (secrets.yaml).Advanced Techniques:
-f -, allowing for dynamic value generation.yq or kustomize to programmatically modify values files before passing them to Helm.if, range, and with to conditionally include or modify resources based on values.Caveats:
Troubleshooting:
helm template --debug to inspect the final rendered template and identify any unexpected value merging outcomes.By understanding these concepts and best practices, you can effectively leverage multiple values files to manage complex Helm deployments and tailor configurations for different environments and scenarios.
| Feature | Description |
|---|---|
| Multiple Values Files | Use multiple values files with helm install or helm template by specifying the --values (or -f) flag multiple times. |
| Merging Order | Values are merged in the order they are specified, with later files overriding earlier ones. |
| Deep Merge | Merging is recursive, applying to nested values within the files. |
| Unexpected Behavior | Deep merge might not always behave as expected, especially with lists. |
| Debugging Merged Values | Use helm template -f values1.yaml -f values2.yaml mychart --debug to print the final rendered template and verify the merged values. |
In conclusion, Helm's ability to use multiple values files provides flexibility and organization for managing application deployments across different environments. By understanding the merging process, leveraging best practices, and utilizing debugging techniques, developers can harness the full potential of Helm's values management capabilities. However, it's crucial to be aware of potential caveats, especially with list merging, and to thoroughly test and verify the final rendered templates to ensure desired application configurations. As you delve deeper into Helm, exploring advanced techniques like programmatic value manipulation and conditional logic in templates can further enhance your deployment workflows. By mastering these concepts, you can streamline deployments, reduce errors, and confidently manage complex Kubernetes applications with Helm.
Values Files - Helm | Instructions on how to use the --values flag.
Handling Multiple Environments With Helm | Tarka Labs Blogs | Helm doesn’t support multiple product environments by default, but there’s a workaround.
How to create multiple values files inside helm chart? | Jhooq | Apr 23, 2021 ... Helm chart provides a very convenient way to pass values.yaml and use it inside your Helm Chart. But for this article, we will focus on -. How ...