Skip to main content

Feb 25, 2026

ngrok-operator v0.22.0: multiple installs and clean uninstalls

625 words

Topics:

I’m excited to announce the release of version 0.22.0 of the ngrok-operator Helm chart. This release brings support for running multiple operator installations in a single cluster, a standalone CRD chart, and a comprehensive uninstall system that eliminates the stuck-finalizer issues you may have ran into when iterating on installations locally.

Standalone CRD chart

By default, the ngrok-operator bundles its CRDs in the Helm release—one helm install and you’re up and running. We still default to this for simplicity.

With this release, you can also install CRDs separately using the new ngrok-crds chart. This decouples the CRD lifecycle from the operator, which is required for multiple installations and gives you more control over upgrades and uninstalls:

1helm repo add ngrok https://charts.ngrok.com2helm repo update3 4# Install CRDs once5helm install ngrok-crds ngrok/ngrok-crds6 7# Install the operator without bundled CRDs8helm install ngrok-operator ngrok/ngrok-operator \9  --namespace=ngrok-operator \10  --create-namespace \11  --set credentials.apiKey=$NGROK_API_KEY \12  --set credentials.authtoken=$NGROK_AUTHTOKEN \13  --set installCRDs=false

If you have an existing installation and want to migrate, see the migration guide.

Multiple operator installations

With CRDs split out, you can now run multiple instances of the operator in a single cluster. Each installation is scoped to watch a specific namespace using ingress.watchNamespace, so operators only reconcile resources within their own namespace.

This unlocks self-service workflows where each team gets their own namespace with its own operator installation, managing their own ngrok resources independently.

Here’s a full example installing two operators, one per team namespace:

1# Install CRDs once (shared across all operators)2helm install ngrok-crds ngrok/ngrok-crds3 4# Team A's operator5helm install ngrok-operator ngrok/ngrok-operator \6  --namespace=team-a \7  --create-namespace \8  --set credentials.apiKey=$NGROK_API_KEY \9  --set credentials.authtoken=$NGROK_AUTHTOKEN \10  --set installCRDs=false \11  --set ingress.watchNamespace=team-a12 13# Team B's operator14helm install ngrok-operator ngrok/ngrok-operator \15  --namespace=team-b \16  --create-namespace \17  --set credentials.apiKey=$NGROK_API_KEY \18  --set credentials.authtoken=$NGROK_AUTHTOKEN \19  --set installCRDs=false \20  --set ingress.watchNamespace=team-b

Now creating an Ingress or CloudEndpoint in the team-a namespace will only be reconciled by team A’s operator, and likewise for team-b. Resources in a namespace without a corresponding operator will not be reconciled.

For the full walkthrough including ingress class scoping and migration from a single installation, see the multiple installations guide.

Clean uninstalls

If you’ve ever had resources stuck in Terminating after a helm uninstall and found yourself manually patching finalizers, this one’s for you.

With 0.22.0, we’ve added a pre-delete Helm hook that handles all of that automatically. It signals the operator to stop reconciling, then removes finalizers from all custom resources so the uninstall can proceed cleanly.

We’ve also introduced a drainPolicy setting that lets you control what happens to your ngrok API resources during uninstall:

  • Keep (default): Removes finalizers and lets Kubernetes clean up, but preserves resources in your ngrok account. This is the safe default for production — if you accidentally uninstall the operator, your CloudEndpoints and other cloud resources continue serving traffic. You can manage them through the ngrok Dashboard or reinstall the operator to resume managing them.

  • Delete: Deletes each custom resource and waits for the operator to clean up the corresponding ngrok API resource before proceeding. This is useful when you’re iterating locally and want a clean slate between install/uninstall cycles.

To use the Delete policy, upgrade your release before uninstalling:

1helm upgrade ngrok-operator ngrok/ngrok-operator \2  --namespace=ngrok-operator \3  --reuse-values \4  --set drainPolicy="Delete"5 6helm uninstall ngrok-operator -n ngrok-operator

For the full details including multi-operator uninstall ordering and troubleshooting, see the uninstall guide.

This release also includes a number of bug fixes and reliability improvements. For the full list of changes, see the Helm chart changelog and controller changelog. If you have feedback about ngrok-operator or hit what you might think is a bug, you’re welcome to create an issue in the ngrok/ngrok-operator repo.