Helm command reference for Kubernetes cluster deployments. The Helm manifest represents desired cluster state. Covers install, upgrade, delete, ACR auth, YAML conventions, Solr ingress 413 fix, and rollback for hung upgrades.

Commands below apply to Helm 3 and 4 unless noted. Helm 2 is deprecated.

helm-logo

Variables used in commands

CHART='path_to_chart'
DIRECTORY='directory_name'
NAME='release_name'
NAMESPACE='kubernetes_namespace'
REPO_NAME='helm_repo_name'          # e.g. rancher-latest, acrteam.azurecr.io
REPO_URL='repo_url'                 # e.g. https://releases.rancher.com/server-charts/latest
REGISTRY='oci_registry'             # e.g. acrteam.azurecr.io/helm
VALUES='path_to_values_yaml_file'

Common flags

--debug show verbose output
--dry-run simulate without applying
-n / --namespace target namespace
-f / --values path to values YAML file
--create-namespace create namespace if it doesn't exist
--wait wait for resources to be ready before returning
--atomic auto-rollback on failure (implies --wait)
-o / --output output format: table, json, yaml

Create a chart

helm create $NAME scaffold a new chart in a directory named $NAME

Install, upgrade, uninstall

helm install -f $VALUES $NAME $CHART install with values
helm install -f $VALUES $NAME $CHART --dry-run --debug dry-run with debug
helm install -f $VALUES $NAME $CHART -n $NAMESPACE --create-namespace install into a namespace
helm install -f $VALUES $NAME $REPO_NAME/$CHART install from a repo
helm install -f $VALUES $CHART --generate-name let Helm generate the release name
helm install $NAME $CHART --set ingress.hosts[0].host=$HOST --set ingress.hosts[0].paths[0]=/ install with inline value overrides

helm upgrade -f $VALUES $NAME $CHART upgrade an existing release
helm upgrade -f $VALUES $NAME $CHART --install upgrade, or install if not present
helm upgrade -f $VALUES $NAME $CHART --install --wait --atomic upgrade with wait and auto-rollback
helm upgrade -f $VALUES $NAME $CHART --dry-run --debug --install dry-run with install-if-missing
helm upgrade -f $VALUES $NAME $CHART --set image.tag=$TAG upgrade with inline override
helm upgrade -f $VALUES $(helm ls | grep $NAME | awk '{print $1}') $CHART upgrade by looking up the release name dynamically:

helm uninstall $NAME remove a release
helm uninstall $NAME -n $NAMESPACE remove from a specific namespace
helm uninstall $(helm ls | grep $NAME | awk '{print $1}') remove by dynamic lookup

List releases

helm list list releases in current namespace
helm list -A list across all namespaces
helm list | grep $NAME filter by name

Search for charts

helm search repo $KEYWORD search configured repos
helm search hub $KEYWORD search Artifact Hub

Pull and package

helm pull $CHART download chart archive
helm pull $CHART --untar --untardir $DIRECTORY download and extract to directory
helm pull $REPO_NAME/$CHART --version 1.2.3 pull a specific version

helm package $CHART package chart directory into .tgz
helm package $CHART --destination $DIRECTORY package to a specific directory

Show chart information

helm show all $CHART show all chart info
helm show chart $CHART show Chart.yaml definition
helm show values $CHART show default values
helm show crds $CHART show CRDs defined by the chart
helm show readme $CHART show the chart's README

Get release information

helm get values $NAME show values for a deployed release
helm get manifest $NAME show rendered Kubernetes manifests
helm get hooks $NAME show hooks for a release
helm get notes $NAME show installation notes
helm get all $NAME show all release info

Status and history

helm status $NAME show release status
helm history $NAME show release revision history
helm rollback $NAME 1 rollback to revision 1
helm test $NAME run tests defined in the chart

Hung upgrades

When an upgrade is stuck (pending-upgrade or failed state):

helm ls -a list all releases including failed/pending
helm history $NAME find the last good revision number
helm rollback $NAME <revision> rollback to the last known-good revision

Dependencies

helm dependency list $CHART list dependencies
helm dependency update $CHART update Chart.lock and download dependencies
helm dependency build $CHART rebuild dependencies from Chart.lock

Repositories

helm repo add $REPO_NAME $REPO_URL add a repo
helm repo add $REPO_NAME $REPO_URL --username USER --password PASS add with auth
helm repo list list configured repos
helm repo update update repo indexes
helm repo remove $REPO_NAME remove a repo
helm repo index $DIRECTORY generate index.yaml for a local repo

OCI registries (Helm 3.8+)

helm registry login $REGISTRY login to an OCI registry
helm registry logout $REGISTRY logout
helm push $CHART.tgz oci://$REGISTRY push chart to OCI registry
helm pull oci://$REGISTRY/$CHART --version 1.2.3 pull from OCI registry

Azure Container Registry (ACR)

Add an ACR Helm repo using the Azure CLI:
az acr helm repo add --name <acr-name>.azurecr.io

ACR auth via Docker credentials

Reference: Azure Container Registry Helm repos

Add to ~/.bashrc:

export DOCKER_CONFIG="~/.docker"
export HELM_REGISTRY_CONFIG="${DOCKER_CONFIG}/config.json"
export HELM_EXPERIMENTAL_OCI=1    # enable OCI support (Helm < 3.12)
. ~/.bashrc

Login to the ACR creates ~/.docker/config.json with auth tokens.

Create the image pull secret:

kubectl create secret generic regcred \
  --from-file=.dockerconfigjson=~/.docker/config.json \
  --type=kubernetes.io/dockerconfigjson

Inspect the secret:

kubectl get secret regcred --output=yaml

Reference in a deployment:

spec:
  template:
    spec:
      imagePullSecrets:
      - name: regcred

Templates and linting

helm template $NAME $CHART -f $VALUES render templates locally without deploying
helm template $NAME $CHART -f $VALUES > output.yaml render to a file
helm template $NAME $CHART --set key=value render with inline override

helm lint $CHART validate chart for issues
helm lint $CHART --strict treat warnings as errors
helm lint output.yaml lint a rendered manifest file

Utilities

helm env show Helm environment variables and paths
helm version show Helm version
helm completion bash generate shell autocompletion (also: zsh, fish, powershell)

Ingress — 413 Request Entity Too Large

When an Nginx ingress proxy rejects large uploads (e.g., Solr batch imports), add these annotations to the Ingress resource:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 500m
    nginx.org/client-max-body-size: "0"
    nginx.org/proxy-connect-timeout: 600s
    nginx.org/proxy-read-timeout: 600s

proxy-body-size: 500m raises the upload limit. client-max-body-size: "0" disables the client-side limit. The timeout annotations prevent premature termination of long-running requests.

Conventions

  • Indentation — follow the style displayed in Helm debug and ArgoCD outputs, not Microsoft dash indents
  • Annotation order — order annotations alphabetically, matching Helm debug and ArgoCD
  • YAML file names — follow kubectl resource names (e.g., ingress.yaml, deployment.yaml)
  • .helmignore — keep a single file in the chart root; remove from subfolders
  • Templatize — share templates across identical YAML files rather than duplicating
  • Single .tpl for Services — create and apply one .tpl file for all Service resources
  • Dash position — use a consistent position for the dash in YAML
  • Lowercase — use lowercase for all keys and values, not CAPS

References

ArgoCD References

ArgoCD automatically fetches desired state from a Helm repo.

Role: Principal Cloud Engineer

Setting: Providence St. Joseph Health

Location: Portland, Oregon

Year: 2022