The exact helm command and flag for each task, for Helm 4 (v4.3), with the Helm 3 spelling
where a flag was renamed. Charts, templating and what changed in Helm 4 are explained in
Helm; the objects a release creates are inspected with
kubectl commands.
Install the CLI
Platform
Install
macOS, Linux with Homebrew
brew install helm
Windows
winget install Helm.Helm, choco install kubernetes-helm or scoop install helm
Fedora
sudo dnf install helm
Snap
sudo snap install helm --classic
Debian, Ubuntu
an apt repository (setup steps in the install guide), then sudo apt-get install helm
Any
the installer script or a binary from the GitHub releases page
Only the script and the release binaries come from the Helm project; the package managers are
community-maintained and can lag a release behind.
client version, Git commit, Go version; --short for just v4.3.x
helm env
every HELM_* setting in effect; helm env HELM_CACHE_HOME for one
helm completion bash, zsh, fish, powershell
shell completion script, e.g. source <(helm completion zsh)
helm help upgrade, helm upgrade -h
a command's flags
Renamed in Helm 4
Scripts written for Helm 3 mostly keep working: old flag names print a deprecation warning.
Helm 3
Helm 4
--atomic
--rollback-on-failure
--force
--force-replace
--wait (yes or no)
--wait means --wait=watcher; hookOnly (the default) and legacy are the other strategies
bare --dry-run (client)
--dry-run=client, server or none; the bare form still works but is deprecated
helm list showed deployed and failed; -a for all
every status by default; no -a
helm status --show-resources
resources are listed by default
helm template --validate
helm template --dry-run=server
helm registry login with a URL
host name only: helm registry login ghcr.io
--post-renderer ./script.sh
--post-renderer NAME of a post-renderer plugin
helm plugin install https://github.com/…
tarballs are signature-checked; Git sources need --verify=false
Global flags and environment
Flag
Environment variable
Does
-n web
HELM_NAMESPACE
release namespace (default: the kubeconfig context's)
--kube-context prod
HELM_KUBECONTEXT
kubeconfig context
--kubeconfig f
KUBECONFIG
kubeconfig file
--kube-as-user, --kube-as-group
HELM_KUBEASUSER, HELM_KUBEASGROUPS
impersonation
--kube-token, --kube-apiserver
HELM_KUBETOKEN, HELM_KUBEAPISERVER
connect without a kubeconfig
--debug
HELM_DEBUG
verbose output
--burst-limit, --qps
HELM_BURST_LIMIT, HELM_QPS
client throttling, for clusters with many CRDs
HELM_DRIVER
where releases are stored: secret (default), configmap, memory, sql
HELM_MAX_HISTORY
default for --history-max (10)
HELM_NO_PLUGINS=1
disable plugins
NO_COLOR
no colored output
SOURCE_DATE_EPOCH
fixed timestamps for reproducible helm package archives
OS
Cache (HELM_CACHE_HOME)
Config (HELM_CONFIG_HOME)
Data (HELM_DATA_HOME)
Linux
~/.cache/helm
~/.config/helm
~/.local/share/helm
macOS
~/Library/Caches/helm
~/Library/Preferences/helm
~/Library/helm
Windows
%TEMP%\helm
%APPDATA%\helm
%APPDATA%\helm
HELM_*_HOME wins, then the XDG variables, then the defaults above. Inside them:
repositories.yaml and registry/config.json (credentials) live in config, plugins and
starters in data, repository indexes in cache/repository.
OCI registries have no repo add and no search: use the full oci:// reference (see
Chart authoring).
Install and upgrade
helm install api ./api -n web --create-namespacehelm upgrade api ./api -n web -f values/prod.yaml# install or upgrade in one idempotent command (CI)helm upgrade --install api ./api -n web \ --create-namespace -f values/prod.yaml
Chart reference
Means
./api
an unpacked chart directory
./api-1.2.0.tgz
a packaged chart
grafana/loki
repo/chart from an added repository
loki --repo https://grafana.github.io/helm-charts
repository URL, no repo add needed
https://charts.acme.dev/api-1.2.0.tgz
an absolute URL
oci://ghcr.io/acme/charts/api
an OCI registry; --version picks the tag
oci://ghcr.io/acme/charts/api@sha256:…
pinned by digest
Release names are at most 53 characters of lowercase letters, digits, - and ., starting and
ending with a letter or digit.
helm install ./api --generate-name (-g) picks one; --name-template builds one.
Flags
Flag
Does
-n web, --create-namespace
release namespace; create it if missing (on upgrade only with --install)
-i, --install
upgrade installs when the release doesn't exist yet
--version 1.2.0
chart version, or a range such as ~1.2.0 or ^1.2; latest stable if omitted
--devel
allow pre-release chart versions
--dependency-update
fetch missing dependencies of a local chart first
--verify
check the chart's .prov signature (--keyring)
-f values.yaml
values file; repeatable, later files win; also a URL or - for stdin
sops -d secrets.yaml | helm upgrade api ./api -f -
-f - reads stdin
--set turns true, false, null and plain integers into typed values; everything else,
1.10 included, stays a string. Single-quote the argument so the shell leaves {}, [] and
\ alone. Lowest to highest precedence: chart defaults, -f files left to right, --set-json,
--set, --set-string, --set-file, --set-literal.
Each key comes from the highest layer that sets it; keys nobody overrides keep the chart's default.
Values on upgrade
Flags
Values used
-f or --set given
new chart defaults plus exactly what this command passes
no value flags at all
new chart defaults plus the last release's user-supplied values
--reuse-values
last release's values, old chart defaults included, plus this command's; new chart defaults are ignored
--reset-then-reuse-values
new chart defaults, then the last release's user-supplied values, then this command's
--reset-values
new chart defaults plus this command's only, even with no value flags
Passing the same -f values/prod.yaml on every upgrade is the only form that is reproducible
from Git; see Values and overrides.
Inspecting releases
Command
Shows
helm list
releases in the current namespace, any status, alphabetical
helm list -A
every namespace
helm list --failed, --pending, --deployed, --superseded, --uninstalled, --uninstalling
only those statuses (combinable)
helm list -q
names only
helm list -f '^api'
release names matching a regular expression
helm list -l team=payments
by release labels
helm list -d -r
newest first
helm list -o json
for scripts; up to 256 releases unless -m
helm status api
status, revision, resources and NOTES
helm status api --revision 6 -o yaml
an older revision, machine-readable
helm history api
every revision: status, chart, app version, description
helm history api --max 5 -o json
the last five, for scripts
helm get values api
the values you supplied
helm get values api -a
all computed values, chart defaults included
helm get values api --revision 6 -o json
as of a revision
helm get manifest api
the rendered objects as applied (hooks excluded)
helm get hooks api
rendered hook objects
helm get notes api
NOTES output
helm get metadata api
chart, versions, namespace, status, deploy time
helm get all api
all of the above; --template '{{.Release.Name}}' to pick fields
helm show values grafana/loki --version 6.40.0
a chart's defaults, without installing
helm show values grafana/loki --jsonpath '{.loki.storage}'
one subtree
helm show chart, show readme, show crds, show all
Chart.yaml, README, CRDs, everything
show takes any chart reference (directory, .tgz, repo/chart, oci://); get takes a
release name.
Status
Means
deployed
the current, successful revision
superseded
an older revision that was deployed and has been replaced
failed
the install, upgrade or rollback errored or timed out
helm install creates revision 1, status deployed: Install complete.
Rollback and uninstall
Command
Does
helm rollback api
to the revision before the latest one (current minus 1, even if that one failed)
helm rollback api 7
to revision 7, recorded as a new revision "Rollback to 7"
--wait, --wait-for-jobs, --timeout 10m
wait for readiness, as on upgrade
--cleanup-on-fail
delete objects the failed rollback created
--force-replace
Helm 3 --force
--server-side, --force-conflicts
apply method, as on upgrade
--no-hooks
skip pre-rollback, post-rollback
--dry-run=client
simulate
helm uninstall api -n web
delete the release's objects and its history
helm uninstall api web worker
several releases
--keep-history
keep the records (status uninstalled); helm rollback api N brings it back
--wait
return only when the objects are gone
--cascade=foreground, orphan
deletion propagation; default background
--no-hooks
skip pre-delete, post-delete
--ignore-not-found
no error for a missing release
--dry-run
simulate the uninstall
uninstall leaves behind objects annotated helm.sh/resource-policy: keep, hook objects
without a delete policy, PVCs created from StatefulSet volumeClaimTemplates, and CRDs from
the chart's crds/ directory (Helm never deletes those).
Rendering, linting and tests
helm template
Does
helm template api ./api -f values/prod.yaml
render to stdout; no cluster needed
-n web
sets .Release.Namespace
-s templates/deployment.yaml
only that template (--show-only, repeatable)
--output-dir out/
one file per template; --release-name adds the release to the path
--include-crds, --skip-tests
include crds/; leave out test hooks
--is-upgrade
render as an upgrade (.Release.IsUpgrade)
--kube-version 1.37.0
.Capabilities.KubeVersion
-a gateway.networking.k8s.io/v1
add to .Capabilities.APIVersions (--api-versions, repeatable)
--dry-run=server
use the cluster: real capabilities and working lookup
--debug
on a YAML error, print the broken output
Helm renders on your machine. The cluster only sees the finished manifests, and the release record keeps a copy of each revision.
A provenance file (api-1.2.0.tgz.prov) holds the chart's Chart.yaml, its SHA-256 and a
PGP signature. Helm reads only the legacy GnuPG keyring format, so export keys first.