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:

1kubectl get cloudendpoints2kubectl 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:

1apiVersion: v12data:3  resource.customizations.health.ngrok.k8s.ngrok.com_AgentEndpoint: |4    local hs = {}5 6    function checkConditions(conditions, conditionType)7      for _, condition in ipairs(conditions) do8        if condition.status == "False" and condition.type == conditionType then9          return false, condition.message or ("Failed condition: " .. conditionType)10        end11      end12      return true13    end14 15    if obj.status ~= nil then16      if obj.status.conditions ~= nil then17        local ready, readyMsg = checkConditions(obj.status.conditions, "Ready")18 19        if ready then20          hs.status = "Healthy"21          hs.message = "AgentEdnpoint is Healthy"22          return hs23        end24 25        hs.status = "Degraded"26        hs.message = readyMsg27        return hs28      end29    end30 31    hs.status = "Progressing"32    hs.message = "Waiting for AgentEndpoint status"33    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.