Helm Values Files in Kubernetes
Learn how Helm separates a reusable application package from the settings that change between environments, and how to design, layer, protect, and debug values files with confidence.
Imagine a favorite family recipe for tomato soup. The steps of the recipe are always the same: chop, simmer, blend, season. But the details change from kitchen to kitchen. A small household makes two bowls, a wedding caterer makes two hundred. One family likes it mild, another likes it spicy. A wise cook does not rewrite the whole recipe for every occasion. Instead, the recipe stays fixed, and a small note beside it says how many servings to make and how much spice to add.
Helm works in exactly the same spirit. A Helm chart is the recipe: a reusable package that knows how to install an application on Kubernetes. A values file is the small note that says how this particular installation should be set up: how many copies to run, which image version to use, how much memory to request, and whether to switch certain features on or off. In this guide, we will build the whole idea from zero. You do not need any earlier knowledge of Helm. Every new word is explained the first time it appears, with a simple comparison from everyday life.
1What Is a Helm Values File?
A values file is a plain text file of settings that customizes a Helm chart for one particular installation.
The Simple Definition
Helm is a tool that installs applications on Kubernetes by using packages called charts. A chart contains templates, which are blueprints for the Kubernetes objects an application needs. But a blueprint with every detail fixed would be useless outside its original setting. So the templates leave blanks for the details that may differ, and a values file fills in those blanks.
The file is written in a simple, human-friendly format called YAML. It is essentially a tidy list of names and their values, sometimes grouped into sections. When you install or upgrade a chart, Helm reads the values, pours them into the templates, and produces the final set of Kubernetes objects that are sent to the cluster. Change the values file, and the very same chart produces a different installation.
Think of a wedding invitation template at a print shop. The layout, the fonts, and the decorations are fixed. The names, the date, and the venue are blanks. Each couple fills in their own details, and the shop prints a unique invitation from the same template. The template is the chart, and the filled-in details are the values.
Where the Values Come From
Values can come from several places. Every chart ships with its own default values file, so that it works out of the box. You can supply your own file to override some of those defaults. You can also pass individual settings directly on the command line. Helm combines all of these into one final set of values using clear rules that we will study carefully in this guide.
The word “values” is used in two ways. It can mean the file itself, and it can mean the final, combined set of settings Helm actually uses. Keeping these two meanings apart makes many later ideas easier to follow.
2Why Configuration Must Be Separate From Templates
Mixing settings into blueprints leads to endless copies, so good engineers keep the two apart.
The Copy and Paste Trap
Suppose a team has an application that runs in a development cluster, a testing cluster, and a production cluster. Each needs slightly different settings: development runs one small copy, production runs ten large ones, and each connects to a different database. Without a way to separate settings from structure, the team would copy the entire set of files three times and edit each copy by hand.
This works for a week. Then someone fixes a bug in the production copy and forgets the others. Someone adds a new feature to development that never reaches production. Slowly, the three copies drift apart, and nobody is sure how they differ. Every change becomes a risk, and every new environment means another full copy to maintain.
What Separation Buys You
With values files, the structure lives in one place and the differences live in small, focused files. A bug fix in the chart reaches every environment at once. A change in production’s memory size touches only the production file. Reviewers can read a values file and immediately see what is special about an environment, without wading through hundreds of lines of shared structure.
A restaurant chain uses one central recipe book for every branch, while each branch has a small sheet listing local details such as its supplier and portion sizes. When the head chef improves a recipe, every branch benefits. Nobody photocopies the whole book for each branch.
Some teams keep one chart per environment, thinking it is simpler. It feels simpler for a month, and then becomes the most expensive decision in the project. One chart with several small values files is almost always the healthier design.
3Helm and Kubernetes Building Blocks You Need First
A short list of basic terms will make everything else in this guide easy to follow.
Kubernetes is a system that runs applications packed inside containers, which are lightweight boxes holding an application together with everything it needs. Kubernetes describes what should run using text files called manifests. Helm sits on top of Kubernetes and helps produce those manifests in a repeatable way. Think of Kubernetes as a large warehouse, and Helm as the assistant who prepares the correct paperwork for each delivery. These are the words we will use most.
Chart
A Helm package. It bundles templates, default settings, and a description of the application, like a recipe with a list of ingredients.
Release
One installed copy of a chart in a cluster, with its own name. The same chart can be installed many times as different releases.
Template
A blueprint file inside a chart with blanks that Helm fills in from the values before sending it to Kubernetes.
Values
The settings that fill the blanks in the templates. They come from the chart’s defaults, your files, and command line overrides.
Manifest
A finished Kubernetes description of an object, such as a deployment or a service, ready to be sent to the cluster.
Repository
A shared place where charts are stored and downloaded from, like a library for packages.
Subchart
A chart that another chart depends on and includes inside itself, such as a database chart bundled with an application chart.
Namespace
A named section of a cluster used to separate teams or environments, like different floors of the same office building.
The Chart Is Generic, the Release Is Specific
The most useful mental picture is this. A chart is a general-purpose kit, and a release is one particular thing built from that kit. If a chart is like a flat-pack furniture kit, then a release is the assembled bookshelf standing in your living room. The values file is the instruction sheet that says which color and which size to build this time.
A cookie cutter is the chart, and the cookies on the tray are releases. The same cutter can make a hundred cookies. The values decide the flavor, the sprinkles, and the number on the tray, without ever changing the shape of the cutter.
4The Anatomy of a Chart and Where Values Fit
Seeing the parts of a chart side by side shows exactly what role the values file plays.
The Parts of a Chart
A chart is simply a folder with a known layout. One file describes the chart itself: its name, its version, and a short description. A folder holds the templates. A file called values.yaml holds the default settings. Optional folders can hold subcharts, helper templates that are reused in several places, and a schema file that checks the values. When you ask Helm to install the chart, it reads all of these together.
Chart Description
Names the chart, records its version, and lists any other charts it depends on.
Templates Folder
Holds the blueprints for the Kubernetes objects, with blanks to be filled from the values.
Default Values
The chart’s own settings file, containing sensible starting points for every blank.
Schema File
An optional rulebook that describes which values are allowed and what type each must be.
Subcharts Folder
Holds other charts that this chart depends on and installs together with itself.
The Rendering Journey
When you install a release, Helm performs a process called rendering. It gathers the chart’s templates, combines the values from all sources into one final set, and then fills every blank in every template. The result is a stack of ordinary Kubernetes manifests with no blanks left. Only then does Helm send these manifests to the cluster. Kubernetes itself never sees the templates or the values. It sees only the finished manifests.
graph LR
T["Chart templates with blanks"] --> R["Helm renders"]
D["Default values in the chart"] --> M["Combined final values"]
F["Your values files"] --> M
S["Command line overrides"] --> M
M --> R
R --> K["Finished Kubernetes manifests"]
K --> C["Cluster creates the objects"]
A mail merge takes a letter template and a list of names and produces a personalized letter for each. The post office only receives the finished letters and knows nothing about the template. Kubernetes is the post office, and Helm is the mail merge.
Because rendering happens before anything reaches the cluster, Helm can show you the finished manifests without installing anything. This is one of the best tools for understanding exactly what your values will do.
5The Default values.yaml: The Chart’s Own Voice
Every chart carries its own default values file, and reading it is the fastest way to learn what a chart can do.
What Lives There
The default file lists every setting the chart author expects users to care about, with a sensible starting value for each. Typical entries include how many copies of the application to run, which container image and version to use, what resources to request, whether to create an ingress, and what port the application listens on. Well-made charts group related settings into sections and explain each one in comments beside it.
The default file serves as both a working starting point and as documentation. You can install a good chart with no changes at all, and it will run with reasonable behavior. When you need something different, you read the default file, find the setting, and override only that one. You never need to copy the whole file.
| Typical Setting | What It Controls | Why It Often Changes |
|---|---|---|
| Replica count | How many copies of the application run | Production needs more than development |
| Image name and tag | Which container image and which version to run | New versions are released often |
| Resource requests and limits | How much processor and memory to reserve | Real load differs by environment |
| Service type and port | How the application is exposed inside the cluster | Different networks and needs |
| Ingress settings | Public web addresses and certificates | Each environment has its own address |
| Feature switches | Optional parts turned on or off | Not every environment needs every part |
Reading Before Overriding
Helm can display the default values of any chart before you install it. This is the best habit to build. Look at the structure, read the comments, note which settings are grouped together, and only then write your own file. A user who skips this step often invents a setting name that the chart does not recognize, and the mistake can pass unnoticed, as we will see later.
Before ordering a customized cake, a sensible customer looks at the bakery’s standard menu. The menu shows what can be changed and how it is normally made. Reading it first prevents asking for a flavor that does not exist.
Never edit the default file inside a downloaded chart to suit your environment. Your edits would be lost the next time the chart is updated, and nobody will know they were made. Keep your changes in your own separate values files.
6How Templates Read Values
Inside a template, every blank is a small instruction that asks the values for an answer.
The Values Object
Helm gives every template access to a special object called Values. It holds the final, combined set of settings. A template asks for a setting by its path, in the same way you might give directions to a file in nested folders. If the settings are grouped so that the image section holds a name and a tag, the template asks for the image name by walking through the sections in order. The value found there is placed exactly where the blank was.
Helpful Tools Inside Templates
Templates can do more than simple substitution. They can supply a fallback when a value is missing, insist that a value must be provided and stop with a clear message if it is not, wrap text in quotes, convert a whole section of settings into properly indented text, and decide whether to include a block at all depending on a switch. These small tools are what let a single chart adapt to many situations.
Fallback Value
Uses a sensible default when the user leaves a setting empty, so the template never breaks on a missing value.
Required Value
Stops rendering with a clear message if a setting that must be provided is missing, instead of producing a broken result.
Conditional Block
Includes a whole section only when a switch is on, such as creating an ingress only if the user enabled it.
Loop
Repeats a block once for each item in a list, such as one environment variable for each entry.
Section to Text
Turns a nested group of settings into correctly indented text, so users can pass through their own extra options.
Quoting
Wraps values in quotes so that words and numbers are read as text where the target expects text.
A form at a doctor’s office has blanks for your name and date of birth. Some blanks are compulsory, and the receptionist refuses the form if they are empty. Some have printed defaults such as “none.” A few sections are only relevant if you tick a box. Template tools behave just like these form rules.
A chart that insists on required values gives users a friendly early error. A chart that silently accepts blanks may produce a broken application that only fails later, when it is much harder to trace back to a missing setting.
7Value Types and YAML Basics
A values file is only as reliable as your understanding of the small text format it is written in.
The Building Pieces of YAML
YAML is a text format that uses indentation to show structure. It has a few kinds of values. A string is plain text. A number is a whole number or a decimal. A boolean is a yes or no choice written as true or false. A list is an ordered set of items. A map is a group of named entries, and maps can contain other maps, which is how sections and subsections are built. The structure of a values file is simply maps inside maps, ending in strings, numbers, booleans, and lists.
| Kind | What It Looks Like In Words | Typical Use |
|---|---|---|
| String | Plain text, sometimes in quotes | Image names, host names, labels |
| Number | Whole or decimal | Replica counts, port numbers |
| Boolean | True or false | Switching features on or off |
| List | An ordered series of items | Multiple host names, extra arguments |
| Map | Named entries, possibly nested | Groups of related settings |
Traps That Catch Beginners
YAML tries to be helpful by guessing the type of what you write, and the guesses can surprise you. A version number such as one point ten may be read as the number one point one, silently dropping the trailing zero. A word such as yes, no, on, or off may be read as a boolean by some YAML readers, not as the text you meant. A value with a leading zero may be read as a number in an unexpected base. A very long number may be turned into scientific notation. The safest habit is to put quotes around anything that must remain text.
Indentation is another source of trouble. YAML uses spaces, never tabs, and a single misplaced space can move a setting into the wrong section or make the whole file unreadable. Because the structure is so sensitive, teams often use an editor that shows indentation guides and checks the file as they type.
A friendly but overeager spell checker may change a proper name into a common word because it guesses what you meant. YAML’s type guessing is the same kind of overeagerness. Putting quotes around a value is like telling the spell checker, leave this exactly as I wrote it.
Writing an image tag such as a plain version number without quotes and finding the deployed version differs from the one intended. Always quote tags and other identifiers, so that they stay text exactly as typed.
8Overriding Defaults With Your Own Values File
Passing your own file is the standard, most readable way to customize a chart for one installation.
The File Flag
When you install or upgrade a release, you can pass one or more values files using the file option. Helm reads your file and lays its settings over the chart’s defaults. You only need to include the settings you want to change. Everything you leave out keeps the chart’s default value. This keeps your file short, focused, and easy to review: it contains only what is special about your installation.
Because the file lives in a repository alongside your other project files, it gets all the benefits of version control. Every change is recorded, reviewed, and attributable to a person. You can see who raised the replica count, when they did it, and why. This audit trail is one of the strongest arguments for using files instead of one-off command line settings.
Read the chart’s defaults
Look at the default values so you know which settings exist and what they currently say.
Write only your differences
Create a small file that lists just the settings you want to change, keeping the same structure as the defaults.
Preview the result
Ask Helm to render the finished manifests with your file, and read them to confirm they say what you expect.
Install or upgrade
Pass your file to the install or upgrade command, and commit the file to version control.
When you order a pizza with your usual changes, you do not read out the whole menu. You say, “the standard one, but no onions and extra cheese.” Your values file is that short list of changes on top of the standard recipe.
Keep your override file as small as you can. A file that copies the entire default file is hard to review, and it silently freezes old defaults, so you miss improvements in later chart versions.
9Overriding With Command Line Settings
Individual settings can be passed directly, which is handy for quick tests but risky as a long-term habit.
The Set Flag and Its Cousins
Besides files, Helm lets you pass single values on the command line with the set option. You write the name of the setting and its value, and Helm places it at the right spot in the final values. Nested settings are reached by joining the section names with dots. There are variants for special situations: one forces the value to be read as text, one reads the value from a file, and one accepts a structured piece of data.
Set
Passes a single value. Helm guesses its type, which can surprise you with numbers and words like yes or no.
Set String
Forces the value to be treated as plain text. Useful for identifiers that look like numbers.
Set File
Reads the value from the contents of a file, handy for long text such as a certificate.
Set JSON
Accepts a structured piece of data in one go, helpful for lists and nested maps.
When Command Line Settings Help
They shine in quick experiments and in automation. A build pipeline that knows the exact image version it just built can pass that single value on the command line, while the rest of the settings come from files. In such a case, the command line carries one small, generated piece of information, which is a perfect use.
When They Cause Trouble
As a long-term way of configuring a release, command line settings have real drawbacks. They leave no record in version control, so nobody can tell later what was used. They are hard to review, because they live in a shell history or a pipeline script rather than in a clean file. Lists and special characters are awkward to write and easy to get wrong. And a long command with dozens of settings is a fragile thing that nobody wants to touch.
Telling a builder small changes out loud while walking around the site is fine for one quick tweak. But for the plans of the whole house, you want a written drawing that everyone can look at, sign, and refer to later. Files are the drawing, and command line settings are the spoken tweak.
A value passed on the command line wins over every file. A forgotten override in a pipeline script can silently defeat the carefully reviewed value in your file, and nobody will understand why the file seems to be ignored.
10Precedence: Who Wins When Sources Disagree?
Helm follows a strict order when the same setting appears in several places, and knowing it removes most confusion.
The Ladder of Authority
When the same setting is given in more than one place, Helm picks the winner by a fixed order. At the bottom is the chart’s own default file. Above it, if the chart is a subchart, is whatever its parent chart supplies. Above that are the files you pass with the file option, in the order you list them, where later files win over earlier ones. At the very top are individual settings passed on the command line, which beat everything else.
graph TD
A["1. Chart default values, lowest authority"] --> B["2. Parent chart values, for subcharts"]
B --> C["3. Your values files, later files win over earlier ones"]
C --> D["4. Command line settings, highest authority"]
D --> E["Final combined values used for rendering"]
| Rank | Source | Beats |
|---|---|---|
| Lowest | The chart’s default values file | Nothing, it is the base |
| Second | Values supplied by a parent chart | The subchart’s own defaults |
| Third | Files passed with the file option, later ones over earlier | Chart defaults and parent values |
| Highest | Command line settings | Everything above |
Think of dress rules. The school has a default uniform. A club can add a rule on top of it. A teacher can announce a special exception for today. And a student who has a doctor’s note for a specific item wins over all of them for that item. Each level can override the ones beneath it, and the most specific voice has the last word.
Why the Order of Files Matters
When you pass several files, the order you list them in is significant. Helm reads them from left to right, and each later file can override anything set by an earlier one. This is the foundation of the layering technique we will explore later, where a general file is followed by a more specific one. Getting the order backwards is a classic mistake: the general file quietly cancels the specific one.
General first, specific last. Put your broadest, most shared file at the start and the most environment-specific file at the end, so that the most specific voice always wins.
11How Merging Works: Maps Blend, Lists Replace
Understanding the two different merge behaviors explains many baffling results, especially with lists.
Maps Are Merged Deeply
When two sources both define a section of settings, Helm does not throw away one entire section. Instead, it merges the two sections entry by entry. If the default file defines an image section with a name and a tag, and your file overrides only the tag, the final values keep the default name and your tag. This is what lets your files stay small: you name only the entries you want to change, and everything else survives from below.
Lists Are Replaced Whole
Lists behave very differently. Helm does not try to merge two lists item by item. If your file defines a list, that list completely replaces the list from the layer below. Suppose the defaults hold a list of three extra arguments, and your file gives a list of one. The final result has one item, not four, and the two defaults you did not repeat are gone. This surprises many people because it is so different from how sections behave.
| Kind of Value | Merge Behavior | Result When Your File Defines It |
|---|---|---|
| Map or section | Merged entry by entry | Your entries win, other entries survive |
| List | Replaced entirely | Only your list remains, defaults are gone |
| Single value | Replaced | Your value wins |
Imagine editing a shared shopping list. If you change one item’s quantity on a labeled aisle sheet, the rest of the sheet stays. But if you hand in a whole new list for the “dairy” aisle, the old dairy list is thrown away and only your new one is used. Sections are edited entry by entry, while lists are swapped entirely.
Designing Around the Rule
Chart authors who understand this rule design values so that things users are likely to customize are maps and not lists. For example, a set of extra environment variables is often exposed as a map from names to values, which users can extend one entry at a time. When a list is unavoidable, good documentation warns that overriding it means providing the complete list, including any defaults the user wants to keep.
Problem
A user wants to add one extra host to a list of allowed hosts and writes a values file containing only the new host, assuming it will be appended to the defaults.
Why It’s Harmful
The list is replaced, so the original hosts vanish. Traffic for them is refused after the upgrade, and the change looks harmless in review because only one line was added.
Correct Approach
Write the complete list, including every host that must remain. Check the rendered manifests before applying, and prefer charts that expose extendable settings as maps.
12Environment-Specific Values Files
The most common use of values files is giving each environment its own small file of differences.
One Chart, Several Files
A typical team keeps one file per environment, named in an obvious way, such as one for development, one for staging, and one for production. Each contains only what is different about that environment. The development file might request tiny amounts of memory and run a single copy. The production file might request generous resources, run several copies spread across machines, and enable certain protective features. The chart itself is identical in all three.
Development
One small copy, minimal resources, debug features on, and a throwaway database. The goal is speed and low cost, not resilience.
Staging
Shaped like production but smaller. It runs the same features and the same kinds of dependencies, so surprises appear here instead of in front of customers.
Production
Several copies, generous and carefully tuned resources, strict security settings, real addresses, and the protective features that customers depend on.
Temporary preview environments
Short-lived copies made for a single change, using a small generated file so reviewers can try a feature before it is merged.
What Differs and What Should Not
A healthy environment file changes sizes, counts, addresses, and switches. It should not change the fundamental structure of the application. If production and development differ in deep ways, such as one using a completely different set of components, the risk grows that a bug appears only in production. The more your environments resemble each other, the more your tests in earlier environments tell you about the final one.
An actor rehearses a play in a small studio, then in a dress rehearsal hall, and finally on the big stage. The script is identical every time. Only the size of the room and the lighting differ. If the actor changed lines between rehearsal and opening night, the rehearsals would be worthless.
Letting the development file drift far from the production file over time. A feature enabled in production but never tested anywhere else is a surprise waiting to happen. Compare the files regularly and keep the list of differences short and intentional.
13Layering Several Files Together
Passing more than one file lets you build the final settings in layers, from the most general to the most specific.
The Layer Cake Idea
Because Helm accepts several values files and lets later ones override earlier ones, you can split your settings into meaningful layers. A common arrangement has a base file holding settings shared by every environment, an environment file holding what differs between development, staging, and production, and sometimes a region file holding what differs between locations. A final small file may hold generated or sensitive values that are supplied by a pipeline. Each layer is short, and each has one clear purpose.
graph TD
A["Chart defaults"] --> B["Base file: shared by all environments"]
B --> C["Environment file: development, staging, or production"]
C --> D["Region file: location specific settings"]
D --> E["Pipeline file: generated or sensitive values"]
E --> F["Final combined values"]
Rules for Healthy Layering
Layering is powerful, but it can turn confusing if the layers are not disciplined. Each setting should ideally be defined in only one layer, unless it is deliberately overridden. A team should be able to answer the question, where does this setting come from, quickly. If the answer requires searching through five files and comparing them by eye, the layering has become too clever. Good teams keep the number of layers small, usually two to four, and document the order of the files in a short guide next to them.
Base
Settings that are the same everywhere, such as the application’s name, ports, and standard labels.
Environment
Sizes, counts, and switches that differ between development, staging, and production.
Region or Cluster
Addresses, zones, and provider-specific details that depend on where the release runs.
Generated or Sensitive
Values created by a pipeline, such as an image version, or delivered securely, such as credentials.
Dressing for cold weather uses layers: a base shirt, a sweater, a coat, and a scarf. Each layer has one job, and you can add or remove one without rethinking the others. But if you wear ten layers, nobody knows which one is keeping you warm. Values layers work best when there are only a few and each has a clear job.
Write the exact order of files in the project’s guide and in the deployment script, and keep them in step. Most layering mistakes come from a script that lists the files in a different order than the guide says.
14Removing a Default With Null
Sometimes you do not want to change a default setting, you want it to disappear entirely, and Helm provides a way to do that.
Why Removal Is Needed
Overriding a value can replace it, but replacing is not the same as removing. Suppose a chart’s defaults include a setting for a special probe or an optional annotation, and you want none at all. Writing an empty value may leave an empty entry behind, and some applications treat an empty entry differently from a missing one. What you truly want is for the key to vanish from the final values.
Helm supports this by letting you set a key to null. When a values file sets a key to null, Helm removes that key from the final combined values. It is a deliberate signal: I know a default exists, and I want it gone. This is especially helpful when a chart’s default supplies an item in a map that you wish to remove without redefining the whole section.
| What You Write | Effect on the Final Values | Best Used When |
|---|---|---|
| A new value | Replaces the default | You want a different setting |
| An empty value | Leaves a key with nothing in it | The template handles empty and missing the same way |
| Null | Removes the key altogether | You want the default to be gone completely |
| Nothing at all | The default survives | The default already suits you |
On an order form, writing “none” is different from crossing out the line completely. Some kitchens read “none” as an instruction to prepare something empty, while a crossed-out line means the item is not part of the order. Null is the crossing out.
Use With Care
Removing a default is a strong action. If the template expects the value to exist and does not handle its absence, rendering may fail or produce a broken manifest. Before using null, read the template or the chart’s documentation, and preview the rendered result. Also leave a short comment in your file explaining why the default was removed, so that the next person does not restore it by accident.
Removing a setting that a template quietly depends on, and finding out only when the release fails at run time. Always render the manifests first and check that nothing important vanished along with the key.
15Subcharts and Global Values
When a chart contains other charts, values flow downward in a specific and sometimes surprising way.
Charts Inside Charts
Many real applications depend on other components, such as a database or a message queue. Instead of asking users to install each separately, the chart author can list them as dependencies, and Helm installs them together as subcharts. The outer chart is called the parent. Each subchart has its own templates and its own default values, and can be configured on its own.
To configure a subchart from the parent’s values, you place its settings under a section that has the same name as the subchart. For example, a subchart called database is configured by a section called database in the parent’s values file. Helm passes everything under that section down to the subchart, where it overrides the subchart’s own defaults.
The Special Global Section
Sometimes a setting must be shared by the parent and every subchart, such as a common label, an image registry address, or a storage class. Repeating it under every subchart would be tedious and easy to get wrong. Helm offers a special section called global for exactly this. Anything placed under global is visible to the parent and to all subcharts, at the same path, without repetition.
graph TD
P["Parent chart values"] --> G["global section: visible to everyone"]
P --> S1["database section: goes to the database subchart"]
P --> S2["cache section: goes to the cache subchart"]
G --> A["Parent templates"]
G --> B["Database subchart templates"]
G --> C["Cache subchart templates"]
S1 --> B
S2 --> C
Downward Only
Values flow from parent to subchart. A subchart cannot read the parent’s other values, which keeps charts independent.
Section Named After the Subchart
Settings for a subchart live under a section with its name, and override the subchart’s own defaults.
Global Is Shared
Anything under global is visible everywhere, so use it only for truly common settings.
Switches for Dependencies
A dependency can be turned on or off through a condition in the parent’s values, so users can bring their own database instead.
A head office sends instructions to each department in a sealed envelope addressed by department name. Each department reads only its own envelope. A company-wide notice board holds messages for everyone. The envelopes are the named sections, and the notice board is the global section.
Keep the global section small. The more you place there, the more every subchart depends on the parent’s naming, and the harder it becomes to reuse a subchart elsewhere.
16Validating Values With a Schema
A schema is a rulebook that catches wrong or misspelled values before they cause a broken release.
The Silent Typo Problem
Imagine a chart that reads a setting called replicaCount, and a user who writes replicaCounts by mistake. Helm sees no problem: it simply stores an extra unused setting. The template reads the original setting, finds the default, and installs one copy while the user believes they asked for five. Nobody sees an error, and the mistake may survive for weeks. Silent typos are among the most common and most frustrating problems with values files.
What a Schema Does
A chart author can include a schema file that describes exactly which settings are allowed, what type each must be, which ones are required, and sometimes what range or set of values is acceptable. Helm checks the final combined values against this rulebook during install, upgrade, rendering, and linting. If a value has the wrong type, is missing, or breaks a rule, Helm stops with a clear message before anything reaches the cluster. The schema can also reject unknown settings, which turns silent typos into loud, early errors.
Values are combined
Helm merges defaults, files, and command line settings into one final set.
The schema checks the final set
Types, required entries, allowed ranges, and unknown names are all tested against the rulebook.
Errors stop the process early
If anything breaks a rule, Helm reports exactly what is wrong and refuses to continue.
Only valid values reach the templates
Templates render with settings already known to be sane, reducing surprises at run time.
An online form that refuses a phone number with letters in it, or a birth date in the future, is applying a schema. The rules are checked the moment you press submit, long before the wrong data can cause trouble further along.
Schemas for Your Own Charts
If you write charts for your team, adding a schema is one of the most valuable small investments you can make. It documents the expected shape of the values, catches mistakes for every user, and reduces the number of questions from teammates. Even a modest schema that checks only types and required entries prevents most everyday errors.
Run Helm’s linting step and a rendering step in your automated checks on every change. With a schema in place, these checks give fast, friendly feedback before a human reviewer even looks at the change.
17Secrets and Sensitive Values
Passwords and keys do not belong in ordinary values files, and Helm itself stores values in a place you might not expect.
Why Plain Values Are Risky
A values file is a plain text file, usually kept in a shared repository. Anyone who can read the repository can read every value in it, and the history of the repository keeps every old version forever. Putting a real database password in such a file is like writing your bank card number on a whiteboard in a busy office. The risk is not only from strangers. It includes former employees, contractors, and every tool that has a copy of the repository.
There is a second, less obvious risk. When Helm installs a release, it saves a record of that release inside the cluster, including the chart and the values used. This record is stored as a Kubernetes Secret in the release’s namespace. Anyone allowed to read those records can read the values, including any passwords you passed. So even if the file never touched a repository, the values live inside the cluster in a form that can be read by people with the right permissions.
Reference an Existing Secret
The values file holds only the name of a Secret created separately, and the chart’s templates read the password from that Secret. The values file itself contains no password.
Encrypt the Values File
Tools exist that encrypt the sensitive parts of a values file so it can be committed safely, and decrypt it only at deployment time.
External Secret Managers
A dedicated system stores the real values, and a helper in the cluster delivers them to the application as Secrets, so values files never mention them.
Pipeline Injection
The deployment pipeline supplies the sensitive value at run time from a protected store, so it never sits in a file in the repository.
Protecting the Release Records
Because release records contain values, control who can read Secrets in namespaces where releases live. Treat the ability to read release records as equivalent to the ability to read the values themselves. Combined with the earlier approaches, this closes the loop: sensitive values stay out of repositories, and the copies inside the cluster are guarded by tight access rules.
Suppose you send a courier with an instruction sheet for opening a safe. Even if you never show the sheet to anyone else, the courier keeps a copy in the office filing cabinet. To protect the safe, you must lock the filing cabinet as well, or better, never write the combination on the sheet at all.
Problem
A team keeps a production values file in their repository with the real database password written in plain text, so that deployments are easy.
Why It’s Harmful
Everyone with repository access, present and future, can read the password. The repository history preserves it forever, and copies of the repository spread to laptops and automation tools.
Correct Approach
Keep passwords out of values files. Reference a separately managed Secret, encrypt sensitive values, or fetch them from an external secret manager, and rotate any password that was ever committed.
18Values During Upgrades and Rollbacks
What Helm remembers between releases is different from what most people assume, and the difference causes real outages.
The Reset Default
When you upgrade a release, Helm does not automatically keep the overrides you gave last time. By default, an upgrade starts again from the chart’s default values and applies only the files and settings you pass in this upgrade. If you installed with a file and a few command line overrides, and then upgrade while passing only the file, the earlier command line overrides are gone, and their settings silently return to the chart’s defaults.
Helm offers an option to reuse the values from the previous release. It sounds like the obvious solution, but it has its own trap: reused values are the old values, so new defaults added to a newer version of the chart do not appear, and settings you never explicitly overrode stay frozen. Many teams therefore avoid reuse and instead pass the complete set of files on every upgrade, which is repeatable and visible.
| Approach | What Happens on Upgrade | Risk |
|---|---|---|
| Default, reset | Starts from chart defaults, applies only what you pass now | Forgotten earlier overrides return to defaults |
| Reuse previous values | Keeps the earlier overrides, layers new ones on top | New chart defaults may be missed, and hidden values linger |
| Pass all files every time | Rebuilds the full set from files you supply | You must keep the file list correct and complete |
sequenceDiagram
participant U as Person or pipeline
participant H as Helm
participant C as Cluster
U->>H: Upgrade with files and settings
H->>H: Combine defaults with what was passed now
H->>C: Apply the new manifests
H->>C: Save a new release record with these values
U->>H: Roll back to an earlier revision
H->>C: Reapply the older manifests and values
Rollbacks and History
Helm keeps a numbered history of each release. Every upgrade creates a new revision containing the chart and the values used. If something goes wrong, you can roll back to an earlier revision, and Helm reapplies the manifests and values of that revision. This is a powerful safety net, but it depends on the history being kept. Helm limits how many revisions it stores, so very old revisions eventually disappear.
A document editor with version history lets you go back to an earlier draft. But if you edit a draft while only remembering part of your earlier changes, the new version can accidentally lose work. Passing all your files every time is like always editing from the complete document instead of from memory.
A pipeline that installs with several settings and later upgrades with fewer will quietly undo the missing ones. If a release suddenly changes behavior after an upgrade with no visible difference in the files, compare the values used by the previous and current revisions.
19Values in Pipelines and GitOps
Automated delivery tools treat values files as the main knobs for controlling what runs where.
Values in a Delivery Pipeline
In a typical pipeline, a change to the application triggers a build, which produces a new container image with a unique version. The pipeline then deploys the release using the chart and the appropriate values files for the target environment. The single piece of information that changes on every build, the image version, is often passed as one small generated value, while everything else comes from the reviewed files in the repository.
flowchart LR
A["Code change"] --> B["Build and test"]
B --> C["New image version"]
C --> D["Render with values files and new version"]
D --> E["Review and checks"]
E --> F["Deploy to environment"]
F --> G["Verify and monitor"]
The GitOps Style
In GitOps, the desired state of the cluster is stored in a repository, and an automatic tool inside the cluster makes reality match it. Popular tools of this kind understand Helm charts and values files natively. Instead of running a command by hand, a team writes a small description that names the chart, its version, and the values to use. The tool then renders the chart and keeps the release in line. Changing a value becomes a normal code change: a proposal, a review, an approval, and a merge.
Reviewed changes
Every change to a values file goes through review, so a large increase in resources or a switched-off protection is seen by a second pair of eyes before it takes effect.
Automatic correction of drift
If someone changes the cluster by hand, the tool notices the difference from the repository and can restore the reviewed state.
Full history
The repository records who changed which value and when, giving a complete audit trail for free.
Promotion between environments
A change proven in development is promoted by copying a small difference into the staging file, and later into the production file, with a review at each step.
A well-run theater keeps the script, the lighting plan, and the stage layout in a master binder. Any change goes through the director, and stagehands set up the stage exactly as the binder says. If someone moves a prop, the stagehands put it back. The binder is the repository, and the stagehands are the automatic tool.
Whatever tool you use, make sure the rendered result is visible in review. A reviewer who sees only a one-line change to a values file may not realize its effect. Showing the rendered difference makes the effect obvious.
20Inspecting and Debugging Values
Helm offers several ways to see exactly what values are in play, and using them turns guessing into knowing.
The Everyday Tools
The first tool shows the default values of a chart before you install it, which is the best way to learn what can be changed. Another tool renders the templates locally with your values and prints the finished manifests, without touching the cluster. A checking tool, often called linting, looks for common mistakes in the chart and the values. A dry run pretends to install and reports what would happen. For a release that already exists, one tool shows the values you supplied, and with an extra option, the complete combined values. Another shows the manifests that were actually applied.
Show Default Values
Prints the chart’s own defaults, so you can see every setting that exists before you override anything.
Render Locally
Fills the templates with your values and prints the result, with no cluster needed. The best way to preview the effect of a change.
Lint
Checks the chart and its values for common mistakes and schema violations.
Dry Run
Simulates an install or upgrade so you can see what would be sent to the cluster without changing anything.
Get Values
Shows the values used by an existing release, either only your overrides or the complete combined set.
Get Manifest
Shows the final manifests actually applied for a release, so you can compare them with what you expected.
Comparing Before You Apply
A widely used add-on for Helm shows a difference between the currently running release and what an upgrade would change. Reading this difference before applying is one of the most protective habits you can build. It reveals accidental changes, such as a list that lost entries or a setting that silently returned to its default, while there is still time to fix them.
Before a printer produces a thousand copies of a brochure, the designer prints a single proof and reads it carefully. Rendering the manifests is the proof. Skipping it is possible, but the cost of a mistake is multiplied a thousand times.
Make rendering and linting automatic in your pipeline, so every change is proofed without anyone remembering to do it. Automatic checks never forget on a busy Friday.
21Troubleshooting Values Problems
A short list of common symptoms and their usual causes will resolve most puzzling situations quickly.
Most values problems fall into a few families. A setting is ignored because of a typo or a wrong location. A value has the wrong type because of YAML guessing. A file is in the wrong order. Or something from an earlier release is missing after an upgrade. Start with the simplest question: what are the final combined values, and what do the rendered manifests say?
| Symptom | Likely Cause | What To Check |
|---|---|---|
| My change has no effect | Misspelled name, wrong section, or the template does not read this setting | Compare with the chart’s default values and render the manifests |
| A list lost its default entries | Lists are replaced, not merged | Repeat every entry you want to keep |
| A version number looks wrong | YAML read it as a number and dropped a trailing zero | Put quotes around versions and other identifiers |
| A word turned into true or false | YAML guessed the type from words like yes or no | Quote the value so it stays text |
| Earlier file seems to override a later one | Files listed in the wrong order | Put general files first and specific files last |
| Upgrade changed unrelated settings | Earlier command line overrides were not passed again | Compare values of the two revisions and pass all files each time |
| Error mentioning a required value | A setting the chart insists on was not provided | Read the message and add the missing value |
| Error mentioning wrong type at a path | The schema found a value of the wrong kind | Fix the type at the named path |
| Subchart ignores my setting | Setting placed at the wrong level, or under the wrong name | Put it under a section named exactly after the subchart |
A Calm Order of Investigation
First look at the final combined values of the release, not just your file. Second, render the manifests locally with the same files in the same order and read the relevant parts. Third, compare the rendered result with what is actually running. Fourth, if something still looks wrong, check the template to see exactly which setting it reads. This order moves from the broad picture to the fine detail, and rarely fails.
Editing values at random until something works leaves behind a file nobody understands. Find the cause first, make one change at a time, and keep a note of what you learned for the next person.
22Designing Good Values for Your Own Charts
If you write charts for others, the shape of your values is the user interface of your work, and it deserves careful design.
Names and Structure
Good value names are clear, consistent, and predictable. A widely followed convention starts each name with a lowercase letter and joins words in camel case, so that names read naturally and work well inside templates. Names should describe the meaning, not the implementation, so that the chart can change internally without renaming settings that users depend on.
Structure matters too. Deeply nested settings are harder to type and harder to override, so many chart authors favor a flatter layout where it does not hurt clarity. Related settings are grouped into a section when they clearly belong together, such as an image section with a name, tag, and pull policy. But avoid nesting for its own sake.
Clear, Consistent Names
Lowercase first letter, words joined in camel case, and names that describe purpose.
Prefer Maps Over Lists
Users can override one entry in a map without repeating the rest, which lists do not allow.
Sensible Defaults
The chart should run with no changes, using safe, modest settings suited to trying it out.
Explain Every Setting
Add a short comment beside each entry saying what it does, what values are allowed, and what the default means.
Add a Schema
Describe types, required entries, and allowed values, so mistakes fail early and loudly.
Do Not Expose Everything
Every setting is a promise to maintain. Expose what users truly need, and keep internals inside the templates.
Think Like the User
Before adding a setting, picture the person who will read your file at midnight during an incident. Can they find the setting quickly? Is the name obvious? Does the comment tell them what will happen if they change it? A small amount of empathy in the design of values saves hours for every future user.
The dashboard of a car shows a handful of clearly labeled controls for the driver, and hides the thousand internal parts that make the engine work. A good values file is the dashboard. Adding every possible internal knob turns it into an engine room that only experts can read.
Generate a reference table of your values automatically from the comments in the default file. Documentation that is built from the source stays in step, while a hand-written table drifts out of date within weeks.
23Advantages and Trade-offs
Every approach has a price, and honest teams look at both sides before relying on it.
Advantages
- One reusable chart serves many environments and teams
- Small readable files show exactly what is special about each installation
- Values live in version control, giving review and history for free
- Defaults make charts work out of the box, and overrides stay minimal
- Schemas can catch mistakes before anything reaches the cluster
- Rendering locally lets you preview the effect of any change
Disadvantages / Trade-offs
- Silent typos are possible without a schema
- Lists are replaced, not merged, which surprises many users
- YAML type guessing can quietly change values
- Several layers of files can become hard to trace
- Values are stored inside the cluster, so sensitive data needs extra care
- Upgrades reset overrides unless files are passed again
When Values Files Are Not Enough
Values files are excellent for changing settings, but they cannot change the structure of what a chart produces beyond what the templates allow. If a team needs to change a part of the output that the chart author did not expose, they must either ask the author to add a setting, modify the chart, or use another tool to adjust the rendered result. This is a real limit, and it is one reason chart authors should think carefully about which settings to expose.
A tailor can adjust the length and width of a suit using the measurements you give, but cannot turn it into a completely different garment. Values are the measurements, and the chart is the pattern. Within the pattern’s flexibility, the results are excellent, and beyond it, you need a new pattern.
Values files are a sharp tool with clear strengths. Their weaknesses are mostly about habits, such as quoting, previewing, validating, and passing complete file lists, and each has a simple, well-known remedy.
24Best Practices and Common Mistakes
Teams that use values files well follow the same habits, and teams that struggle repeat the same mistakes.
Habits That Work
Read the defaults first
Always look at the chart’s default values before writing your own file, so you use real setting names and know what you are changing.
Override only what differs
Keep files short, so they are easy to review and so that improvements in newer chart versions still reach you.
Quote your text values
Put quotes around versions, identifiers, and anything that must stay text, so YAML never guesses wrongly.
Preview before applying
Render the manifests and compare with the running release, so every change is proofed before it takes effect.
Pin chart versions and image versions
Use exact versions, and avoid floating tags such as latest, so that the same files always produce the same result.
Mistakes to Avoid
Problem
A team copies the chart’s entire default file into their own file and edits a few lines, believing this is the safe way to customize.
Why It’s Harmful
The copied defaults freeze in time. New defaults and fixes in later chart versions never reach the team, and reviewers cannot see which of the hundreds of lines were actually changed on purpose.
Correct Approach
Write a small file containing only the settings that differ, and let every other setting come from the chart’s current defaults.
Problem
Production is configured by a long deployment command containing dozens of command line settings that live only in a script and in people’s memories.
Why It’s Harmful
Nobody can review or safely change the settings. Special characters and lists are easy to get wrong, and the true configuration cannot be seen in version control.
Correct Approach
Move settings into reviewed values files, keeping the command line only for a small generated value such as the image version.
Problem
An unpinned image tag such as latest is set in the values file, and the chart is upgraded to refresh the release.
Why It’s Harmful
The same files produce different results on different days, rollbacks do not restore the earlier image, and nobody can say which version is truly running.
Correct Approach
Pin an exact image version, or an exact image digest, so every deployment is repeatable and every rollback returns to a known state.
Problem
Environment files grow apart over months, with production enabling features and settings that development and staging never use.
Why It’s Harmful
Earlier environments stop predicting how production will behave, and bugs appear only in front of customers.
Correct Approach
Keep environment files short and intentionally different, review them side by side regularly, and promote changes through each environment in order.
25Real-World Examples and an Adoption Roadmap
The same few patterns appear again and again in real teams, and a staged path helps you grow toward a mature setup safely.
Product teams with several environments
A team keeps one chart for their service and three small values files. Development runs one tiny copy, staging mirrors production at half the size, and production runs several copies with strict settings.
Platform teams offering a standard chart
A platform team publishes a well-documented chart with a schema and sensible defaults. Dozens of product teams install it with tiny files, getting consistent logging, security settings, and health checks without effort.
Companies running in many regions
Organizations with clusters in several regions add a region layer for addresses and zones. The same chart and environment files are reused everywhere, and only a few lines differ between regions.
Open-source projects packaging their software
Projects that ship charts publish a default values file that doubles as documentation, so users learn every option by reading one well-commented file.
Temporary preview environments
Pipelines create short-lived copies of an application for each proposed change, using a small generated values file, and delete them after review.
A Roadmap for Growing Safely
Learn the defaults
Pick one chart you already use and read its default values from top to bottom, noting which settings matter for you.
Move settings into a file
Replace long command line settings with a small values file, committed to version control and reviewed like code.
Add one file per environment
Split the file into a shared base and small environment files, keeping the list of differences short and intentional.
Automate the proofing
Add linting, rendering, and difference checks to your pipeline, so every change is previewed without anyone remembering.
Protect sensitive values
Move passwords and keys out of files, using existing Secrets, encryption, or an external manager, and tighten who can read release records.
Add a schema and documentation
For charts you own, add a schema and generate reference documentation, so every user gets early errors and clear guidance.
Reviewing a Values Change Like a Professional
A change to a values file looks small, often a single line, yet it can alter what runs in production. A careful reviewer therefore asks a few consistent questions. Which environment does this file belong to? Does the changed key actually exist in the chart, or is it a misspelling that Helm will silently ignore? Would the change be visible in the rendered manifests, and has someone looked at that rendered output rather than only at the values? Teams that make these questions routine catch most mistakes before they reach a cluster.
It also helps to keep each change focused. A pull request that adjusts the replica count is easy to judge. A pull request that renames keys, changes images, and rewrites resource limits at once is hard to judge, and reviewers tend to approve it out of fatigue. Small, single-purpose changes keep the history readable, and they make rollbacks precise because you can revert exactly the change that caused trouble.
Naming Keys So Future Readers Understand Them
Good names are the cheapest documentation a values file can have. A key called timeoutSeconds tells the reader the unit, while a key called timeout leaves them guessing whether it means seconds, milliseconds, or minutes. A key called enabled under a section called ingress reads naturally, and a key called useIngressMaybe does not. Consistency matters as much as clarity: if one section says replicas and another says replicaCount, every newcomer must learn both spellings and remember which lives where.
Grouping related settings under a shared parent also pays off. Image repository, tag, and pull policy belong together under an image section, because they are always considered together. Resource requests and limits belong together under a resources section. When the structure mirrors how people think about the application, the values file becomes a map of the application itself, and a new teammate can find what they need in seconds.
Living With Values Files Over Many Months
Values files are not written once and forgotten. Over months they collect small overrides, temporary workarounds, and settings whose reasons nobody remembers. A healthy habit is to leave a short comment beside any unusual override that explains why it exists and when it can be removed. Another healthy habit is a periodic tidy-up: compare each environment file with the chart defaults, and delete any override that merely repeats the default. The smaller the override files are, the easier it is to see what truly makes each environment different.
When a chart is upgraded to a new version, review the changelog for renamed or removed keys. A key that used to be honoured may now be ignored, and nothing will complain unless a schema exists to catch it. Rendering the chart with the old values file before and after the upgrade, then comparing the two outputs, reveals such silent changes quickly and calmly.
A Simple Mental Checklist Before Every Release
Before pressing the button on an install or upgrade, walk through a short mental checklist. First, confirm which files and command line settings are being supplied, and in what order, because the order decides the winner. Second, render the templates locally and read the result, focusing on images, replica counts, and resource limits. Third, run the linter and the schema validation so that structural mistakes surface early. Fourth, use a dry run against the cluster to catch objects the cluster itself would reject. Finally, note the current revision number so that a rollback target is known in advance. These five habits take only a few minutes, and they turn a nerve-racking release into an ordinary one.
Over time the checklist becomes second nature, and much of it can be automated in a pipeline. Automation does not replace understanding, however. A person who understands precedence, merging, and rendering will always diagnose a surprising result faster than a person who only knows which commands to run, and the goal of this whole guide has been to build exactly that understanding.
Sharing Values Knowledge Across a Team
Values files are only as useful as the shared understanding around them. A short internal guide that explains where the files live, how environments differ, and who approves changes prevents a great deal of confusion. New teammates should be able to answer three questions within their first week: where do defaults come from, where do environment overrides live, and how does a change travel from a proposal to a running cluster? When those answers are written down and easy to find, onboarding becomes faster and mistakes become rarer.
Pairing is also valuable. Having a newer teammate sit beside an experienced one while a release is prepared teaches precedence, merging, and rendering far better than any document. The newer person sees why the rendered output is read before anything is applied, and why a tiny key change deserves the same attention as a large one. Knowledge that is demonstrated tends to be remembered, and it spreads through the team without formal training.
Keeping Environments Honest and Comparable
The purpose of having development, staging, and production is that lessons learned in the first two protect the third. That protection weakens when the environments drift apart without anyone noticing. A staging file that sets a single replica while production sets six means that staging cannot reveal problems caused by running several copies. Some differences are intentional and healthy, such as smaller resources or a different hostname. Others are accidents, and only a deliberate comparison of the files can tell them apart.
A practical approach is to keep a short list of the differences that are meant to exist, and to review the actual files against that list from time to time. Anything found that is not on the list is either an accident to fix or a deliberate difference to add to the list. This gentle discipline keeps the environments comparable, so that a successful rehearsal in staging genuinely predicts a successful release in production.
When to Prefer Fewer Settings
Every setting exposed in a chart is a promise to maintain it, document it, and keep it working across versions. Chart authors are tempted to expose everything, on the theory that flexibility is always good. In practice, a chart with hundreds of settings is hard to understand, hard to test, and hard to upgrade. A better instinct is to expose the settings that people genuinely need to change, and to keep the rest sensible and fixed. If someone truly needs more control later, adding a setting is easy, while removing one that people depend on is painful.
26Frequently Asked Questions
A chart is the reusable package with templates and default settings. A values file is a small file of your own settings that customizes the chart for one installation.
No. Every chart has its own default values, so it can be installed without any file. You pass your own file only to change something.
The last one listed. Helm reads files from left to right, and each later file overrides the earlier ones for any setting they share. Command line settings win over all files.
Lists are replaced whole and never merged. If you define a list in your file, it completely replaces the one from below. Repeat every entry you want to keep.
Prefer files for anything that should be reviewed and remembered. Use command line settings sparingly, for quick tests or for a single generated value such as a fresh image version in a pipeline.
Without a schema, Helm usually accepts it silently, and the template simply never reads it, so your intended change has no effect. A schema file in the chart can catch such mistakes early.
Not in plain text in a shared repository. Helm also stores the values of each release inside the cluster, so anyone who can read release records can read them. Use encryption tools or external secret managers instead.
Not by default. An upgrade starts from the chart’s defaults plus the files and settings you pass this time. To keep earlier overrides you must pass the same files again or use the reuse option deliberately.
Helm can show the values you supplied for a release, and with an extra option, the full combined values. It can also render the final manifests so you can check their effect.
A parent can set values for its subcharts under the subchart’s name, and shared settings can be placed in a special global section. A subchart cannot read the parent’s other values directly.
27Summary and Key Takeaways
Helm values files are the bridge between a generic, reusable chart and a specific installation. They let one carefully maintained package serve many environments, with small readable files describing only what differs. Behind the simple idea lies a clear set of rules: defaults at the bottom, your files above them in order, and command line settings on top; maps blending entry by entry while lists are replaced whole; and templates reading the final combined values to produce ordinary Kubernetes manifests.
Using these files well is mostly a matter of good habits. Read the defaults before overriding them, keep your files small, quote your text values, validate the shape of the values with a schema, keep sensitive values out of plain text files, and always preview the rendered result before applying it. Teams that follow these habits enjoy calm, predictable releases, and those who skip them meet surprises at the worst moments.
Key Takeaways
- Values fill the blanks — a chart is a generic blueprint, and values files supply the settings that make one installation different from another.
- Precedence is fixed — chart defaults are weakest, then parent values, then your files in order, and command line settings are strongest.
- Maps merge, lists replace — overriding one entry in a section keeps the rest, but defining a list swaps the whole list.
- Keep files small — override only what differs, so reviews are easy and chart improvements still reach you.
- One file per environment — small, focused files keep environments similar and their differences visible and intentional.
- Protect sensitive values — never store plain passwords in shared files, and remember that Helm keeps release values in the cluster.
- Preview before applying — render the manifests and read them, so your values do exactly what you think they do.