A reliable Helm chart is more than a set of Kubernetes templates. It is a versioned interface between an application, its operators, and the cluster where it runs. This maintenance checklist explains how to structure charts, design safe values, validate templates, manage dependencies, test upgrades, and prepare rollback and deprecation plans before every release.
Overview
Helm charts reduce repeated Kubernetes configuration by packaging manifests, defaults, dependencies, and release metadata together. That packaging is useful only when the chart remains understandable and predictable as the application, dependencies, and Kubernetes APIs change.
Chart maintenance should therefore be treated as a release workflow rather than a one-time authoring task. Every meaningful change should answer four questions:
- What Kubernetes resources will be created, changed, or removed?
- Which values and defaults can users safely override?
- Will the chart render and behave correctly on every supported cluster version?
- Can the release be upgraded, observed, and rolled back without guesswork?
A practical maintenance cycle includes source review, dependency inspection, schema validation, linting, rendered-manifest review, Kubernetes compatibility checks, upgrade testing, packaging, and release notes. Teams that manage several charts can place these checks in CI/CD so that developers receive fast feedback before a chart reaches a shared repository or production environment.
For broader workload readiness, pair this process with the Kubernetes Deployment Readiness Checklist. Helm validates how resources are packaged and rendered; deployment readiness also requires checking application health, capacity, security, and operational ownership.
Checklist by scenario
When creating or restructuring a chart
- Define the chart boundary. Keep templates, values, helper definitions, documentation, tests, and dependency metadata together. Avoid placing unrelated applications in one chart unless their lifecycle is intentionally coupled.
- Use conventional structure. A typical chart contains
Chart.yaml,values.yaml, atemplates/directory, optionalvalues.schema.json, and optional chart tests or documentation. Keep generated files separate from source-controlled inputs where the team’s workflow permits. - Give resources stable names. Centralize naming in helper templates and account for release name, namespace, and truncation limits. A name that changes unexpectedly during an upgrade can cause resource replacement or orphaned objects.
- Keep templates readable. Prefer small, focused templates and named helpers over deeply nested inline logic. Use whitespace control carefully so rendered YAML remains easy to inspect.
- Document user-facing values. Explain the purpose, type, default, security implications, and safe examples for important settings. Values should represent supported configuration, not every possible Kubernetes field.
When designing values and schemas
- Choose safe defaults. Defaults should produce a valid, minimally surprising deployment. Do not require production secrets to be committed into
values.yaml. - Separate required inputs from optional features. Make image references, service exposure, persistence, resources, probes, and authentication settings explicit. Use feature flags only where the chart can support both states reliably.
- Validate values early. A
values.schema.jsonfile can enforce types, required properties, allowed values, and basic constraints before rendering. It cannot replace runtime testing, but it can prevent common configuration errors. - Preserve compatibility deliberately. If a value is renamed, support the old key temporarily when practical, document the migration, and define when the old key will be removed.
- Control sensitive data. Treat values files, rendered manifests, CI logs, and dry-run output as possible secret-bearing artifacts. Review the chart’s secret-handling approach alongside the Docker Image Security Checklist and your organization’s access controls.
When adding or updating dependencies
- Declare dependencies in chart metadata. Record repository locations and version constraints in the chart’s dependency configuration.
- Prefer intentional version ranges. A range can allow compatible maintenance updates, while an exact version gives stronger reproducibility. Choose based on the release process and test coverage rather than convenience.
- Review the lock file. When dependencies are resolved, commit the resulting lock information if it is part of the team’s reproducible build process. Review lock changes as carefully as application code.
- Inspect transitive behavior. A dependency may add resources, labels, webhooks, CRDs, or values that affect the parent chart. Read its documentation and inspect rendered output before upgrading.
- Test repository availability. Ensure CI and release environments can access the required chart repositories without relying on a developer’s local cache.
Before packaging a release
- Run
helm dependency buildor the dependency command selected by your workflow. - Run
helm lintwith representative values files. - Render default and production-like configurations with
helm template. - Validate rendered manifests against the intended Kubernetes API versions.
- Review the diff from the previous chart version, including deleted resources and changed immutable fields.
- Install or upgrade the chart in an isolated test namespace.
- Run chart tests and application smoke tests where available.
- Package the chart only after validation passes.
- Publish release notes that describe value changes, dependency changes, API changes, migration steps, and rollback considerations.
Choosing a testing approach
| Approach | Best for | What it catches | Limitation |
|---|---|---|---|
| Linting and schema checks | Fast pull-request feedback | Malformed metadata, invalid values, common template errors | Does not prove cluster behavior |
| Rendered manifest review | Template and configuration changes | Unexpected fields, names, defaults, and resource changes | May miss admission or runtime behavior |
| Ephemeral cluster install | Pre-release integration testing | API compatibility, scheduling, hooks, probes, and service behavior | Requires cluster automation and representative configuration |
| Upgrade and rollback test | Application and chart releases | State transitions, immutable fields, migration and recovery issues | Needs a meaningful previous release state |
| Post-deployment smoke test | Release verification | Basic reachability and application health | Should not replace deeper functional testing |
What to double-check
Kubernetes API compatibility
Review every resource kind and API version in the rendered output. Kubernetes API availability can differ between cluster versions, and a chart may fail before any application container starts if it references an unavailable or removed API. Maintain a documented support range for the chart and test against the oldest supported environment, not only the newest one.
Pay particular attention to ingress, policy, autoscaling, storage, admission, and custom resource definitions. If a dependency installs CRDs, determine whether it owns upgrades, whether CRDs are upgraded separately, and what happens when a chart is uninstalled.
Upgrade and rollback behavior
Compare the current release with the proposed manifests. Look for renamed objects, selector changes, storage changes, removed configuration, and fields that Kubernetes treats as immutable. A successful template render does not guarantee that an upgrade will be accepted.
Define what rollback means for the application. Helm can restore a prior release’s manifests, but external database migrations, irreversible data changes, or one-way schema changes may require a separate recovery plan. Record pre-upgrade backups, migration ordering, and verification steps where state is involved.
Operational signals
Check that the chart exposes useful labels and annotations without allowing arbitrary user input to create unsafe metadata. Confirm that readiness and liveness probes reflect actual application behavior, resources have an intentional policy, and logs and metrics remain discoverable after an upgrade. For monitoring design, the Prometheus and Grafana Monitoring Stack guide provides a related reference for dashboards and alerting.
Security and access
Review service accounts, RBAC rules, pod security settings, network policies, image references, and secret mounts. Grant only the permissions required by the workload. Validate that optional debugging or administrative features cannot be enabled accidentally through an unreviewed values override. If the application uses JWTs, OAuth, or API keys, use the API Authentication Testing Guide to complement chart-level checks.
Common mistakes
- Testing only the default values. Production failures often come from an environment-specific override. Render and test the values combinations that operators actually use.
- Using unbounded dependency updates. Automatically selecting a new dependency version without rendering and upgrade tests weakens reproducibility.
- Putting secrets in examples. Even placeholder-looking values can be copied into real environments. Show references to external secret systems or clearly marked non-sensitive examples instead.
- Making every field configurable. Excessive flexibility increases the chart’s support surface and makes safe defaults harder to reason about.
- Ignoring rendered YAML. Templates can look correct while producing duplicated documents, empty fields, incorrect indentation, or unexpected resource names. Treat rendered output as a review artifact.
- Assuming rollback is automatic recovery. Rollback does not reverse every application-level change. Pair it with data, migration, and dependency recovery procedures.
- Leaving deprecated values indefinitely. Compatibility keys add complexity. Mark them clearly, warn when they are used if the tooling supports it, and remove them according to a documented policy.
- Skipping release notes. Operators need to know which values changed, whether an upgrade is disruptive, and which chart or Kubernetes versions were tested.
When to revisit
Use this checklist before the first release of a chart, every application release that changes deployment behavior, every dependency refresh, and every Kubernetes version compatibility review. It is also worth revisiting before seasonal planning cycles, when ownership changes, or when a team moves from manual Helm commands to CI/CD automation.
At minimum, schedule a maintenance review when any of these inputs change:
- the supported Kubernetes version range or admission policy;
- a container image, startup command, port, probe, or resource requirement;
- a chart dependency, repository, CRD, or transitive component;
- a secret, service account, RBAC rule, network policy, or exposed endpoint;
- a persistent volume, database migration, selector, or other stateful behavior;
- the CI/CD pipeline, chart repository, signing process, or release promotion path.
For a practical release gate, save the following evidence with the chart version: lint and schema results, rendered manifests for important environments, dependency and lock-file changes, cluster-version test results, upgrade and rollback outcomes, and operator-facing release notes. Then link the chart release to the surrounding infrastructure change process, such as the CI/CD Pipeline Design Guide or Terraform Best Practices when Helm is managed alongside infrastructure as code.
Final action: before merging a chart change, render it with real representative values, inspect the resource diff, test it against the oldest supported cluster, perform an upgrade from the current release, and confirm that the rollback and observability plan is documented. Repeat the review whenever the chart’s inputs change—not only when its templates do.