Use Kustomize when you want to take plain, valid YAML and layer environment-specific patches on top with zero templating — it is built into kubectl and stays readable. Use Helm when you are packaging an app for others to install and configure, or consuming the vast ecosystem of community charts. Many teams use both: Helm to vendor third-party apps, Kustomize to tune their own manifests.
Helm
A package manager for Kubernetes, with templated charts.
They solve "the same manifest, different per environment" in opposite ways. Helm parameterizes with Go templates and ships versioned, installable packages. Kustomize keeps the base as real YAML and applies declarative overlays. The trade is templating power and packaging versus readability and no new templating language.
Quick takes
If you're…
You are distributing an app for other people to install→HelmCharts package, version, and parameterize an app for third-party installs.
You want per-environment manifests with no templating language→KustomizeOverlays patch a plain-YAML base; what you read is what gets applied.
You need to install community software (Prometheus, cert-manager)→HelmAlmost everything ships an official Helm chart.
You want it built into the tool you already run→Kustomizekubectl apply -k and kubectl kustomize need nothing extra.
You need release lifecycle, rollback, and hooks→HelmHelm tracks releases and can roll back; Kustomize has no release concept.