Skip to main content

Oct 31, 2025

ngrok-operator v0.21.0: status conditions galore

426 words

Topics:

I’m excited to announce we’ve shipped ngrok-operator v0.21.0 with comprehensive status conditions across all our major custom resource definitions (CRDs) and several bug fixes that enhance reliability for LoadBalancer services.

This release focuses on improving observability by bringing Kubernetes-standard status conditions to AgentEndpoint, Domain, CloudEndpoint, IPPolicy, and BoundEndpoint CRDs. Now you can use standard kubectl commands to track the provisioning and health of your ngrok resources directly in your cluster.

Enhanced status tracking across CRDs

All major CRDs now include comprehensive status tracking with Kubernetes-standard conditions, giving you better visibility into resource provisioning and health:

  • AgentEndpoint - Track agent connectivity and endpoint state
  • Domain - Monitor domain provisioning progress
  • CloudEndpoint - View cloud endpoint creation status
  • IPPolicy - Track IP policy creation and updates
  • BoundEndpoint - Monitor endpoint binding operations

You can now inspect resource state using familiar kubectl patterns:

kubectl get cloudendpointskubectl describe domain my-domain

Here is the output of kubectl get cloudendpoints showing one CloudEndpoint is in a Ready state while another is not:

CloudEndpoint Status Conditions

This brings the ngrok-operator more in line with community standards for Kubernetes resource management, making it easier to integrate with existing monitoring and debugging workflows.

For example, if using Argo CD, you can add a custom health check for AgentEndpoint resources to reflect their Ready condition by adding the following to your argocd-cm ConfigMap:

apiVersion: v1data:  resource.customizations.health.ngrok.k8s.ngrok.com_AgentEndpoint: |    local hs = {}     function checkConditions(conditions, conditionType)      for _, condition in ipairs(conditions) do        if condition.status == "False" and condition.type == conditionType then          return false, condition.message or ("Failed condition: " .. conditionType)        end      end      return true    end     if obj.status ~= nil then      if obj.status.conditions ~= nil then        local ready, readyMsg = checkConditions(obj.status.conditions, "Ready")         if ready then          hs.status = "Healthy"          hs.message = "AgentEdnpoint is Healthy"          return hs        end         hs.status = "Degraded"        hs.message = readyMsg        return hs      end    end     hs.status = "Progressing"    hs.message = "Waiting for AgentEndpoint status"    return hs

This allows you to quickly see the health of your AgentEndpoint resources directly in the Argo CD dashboard:

Argo CD AgentEndpoint Health

Bug fixes and performance

This release includes several important fixes:

  • LoadBalancer service status: Fixed an issue where LoadBalancer service status wasn’t properly reported when using the default mapping strategy
  • Agent Endpoint watches: The agent endpoint controller now properly watches for secret changes and updates endpoints accordingly
  • Reconcile frequency: Reduced excessive reconciles for LoadBalancer services, improving overall performance

This release continues our work toward ngrok-operator v1.0, improving reliability and observability.