NetScaler® Operator release notes

Last published : Nov 14, 2026

Version 3.7.5

What's new

Automatic reload of rotated NetScaler credentials

The NetScaler ingress, gateway, GSLB, and node controllers can now adopt rotated NetScaler credentials (for example, Vault-issued credentials). This feature is opt-in. You can enable it with the netscaler.vaultCredentials.enabled field of the NetscalerIngressController, NetscalerK8sGatewayController, or NetscalerGslbController instance, or the vaultCredentials.enabled field of the NetscalerNodeController instance (the NetscalerNodeController needs NetScaler Node Controller 3.2.13 or later), and add your Vault Agent sidecar with extraContainers. The controller then reads the credentials from files rendered by the Vault Agent sidecar and re-checks them on a periodic poll (default 30 seconds), so a rotated credential is adopted without a pod restart. A watcher confirms each new password with a test login before using it, and keeps using the current password if the new one is rejected. If you do not enable it, hot-reload stays off, and deployments that supply the password through a Kubernetes secret continue to work unchanged. For more information, see Use NetScaler credentials stored in a Vault server with NetScaler Ingress Controller, NetScaler Kubernetes Gateway Controller, NetScaler GSLB controller, or NetScaler Node Controller.

Preconfigured SSL certkeybundle support in the Listener CRD

The Listener CRD can now bind an SSL certkeybundle that was preconfigured directly on NetScaler, matching the behavior already available for Secret-based bundles and for the Gateway CRD. Set preconfiguredBundle: true on a preconfigured certificate entry and NetScaler Ingress Controller binds it as a certkeybundle instead of a plain certkey. Without the field, the name is still bound as a plain certkey. For more information, see Listener.

Configurable TLS settings for the GSLB HTTPS health monitor

The GSLB HTTPS health monitor used a fixed TLS setup, so you could not choose the TLS version, ciphers, or other SSL settings it used. You can now add two optional fields to an HTTPS monitor in the GlobalTrafficPolicy to control exactly how the health check negotiates TLS:
  • sslProfile (any NetScaler back-end SSL profile parameter, such as tls13 or sessReuse)
  • ciphers (a list of cipher suites or cipher groups)
For more information, see GSLB overview and deployment topologies.

Full monitor parameter tuning in GlobalTrafficPolicy

The GSLB health monitor in a GlobalTrafficPolicy previously exposed only a limited set of NetScaler monitor parameters, so you could not fully tune probe behavior. The GSLB health monitor now supports curated monitor fields (such as interval, respTimeout, retries, failureRetries, successRetries, downTime, deviation, reverse, secure, lrtm, netProfile, and monState) plus an advancedOptions map that forwards any other NetScaler monitor parameter, with any omitted field reset to the NetScaler default. For more information, see GSLB overview and deployment topologies.

GSLB support for the Kubernetes Gateway API

The GSLB Controller can now create global server load balancing entries for applications exposed through a Kubernetes Gateway API HTTPRoute. Reference the route from a GlobalTrafficPolicy host with routeRef (and optionally routeHostName and hostNameValidation). When it processes the policy, the controller reads the HTTPRoute and its parent Gateway and creates a GlobalServiceEntry for the Gateway address and listener port. Read access to Gateway API resources is controlled by the gatewayAPI.enabled field of the NetscalerGslbController CR (enabled by default). For more information, see GSLB for Kubernetes Gateway API routes.

NetScaler as an MCP (Model Context Protocol) Gateway

NetScaler can now be deployed as an MCP (Model Context Protocol) Gateway to route, secure, and scale Gen AI workloads in Kubernetes. You define traffic with the new mcproute CRD (with extensionRef and HTTP filter support, like HTTPRoute) and protect it with OAuth authentication plus token-claim-driven authorization configured through the authpolicy CRD, with MCP server access control configured through the rewritepolicy CRD, and with tool-based rate limiting configured through the ratelimit CRD. For more information, see MCP Gateway overview.

Gateway API TLSRoute support

The NetScaler Kubernetes Gateway Controller now supports the Kubernetes Gateway API TLSRoute resource. In Passthrough mode, NetScaler routes TLS traffic by the SNI host name without decrypting it. In Terminate mode (the default), NetScaler terminates TLS with the Gateway certificate and routes HTTP requests by the Host header. For more information, see Kubernetes Gateway API: TLSRoute support.

Smart annotations for Gateway routes

You can use smart annotations to set NetScaler content switching, load balancing, service group, and monitor settings per Gateway route. For more information, see Smart annotations for Gateway routes.

IP pool exhaustion now queues requests and reports progress

Previously, when the IPAM controller's IP pool was exhausted, a new VIP allocation request would hang with no error, retry, or progress shown. The controller now holds the request and assigns an address as soon as one is released, and reports progress through Kubernetes events and a new durable status on the vips.citrix.com resource (status.state Pending or Allocated). For more information, see IP address management using the NetScaler IPAM controller.

NetScaler Operator at parity with the 4.3.22 Helm charts

NetScaler Operator is now at parity with the Helm charts that are released with NetScaler Ingress Controller 4.3.22. These include the Helm charts for NetScaler Ingress Controller, NetScaler GSLB Controller, NetScaler Kubernetes Gateway Controller, NetScaler IPAM Controller, and NetScaler Node Controller. The operator custom resources now expose the new chart capabilities, including Vault credential hot-reload, Splunk analytics and distributed tracing, Gateway API support in the GSLB controller, control over service-status publishing, IPAM TLS verification, and NetScaler Node Controller health probes. The operator also sets default CPU and memory for the NetScaler Kubernetes Gateway Controller container (requests 32m CPU and 256Mi memory, limits 100m CPU and 512Mi memory) and for NetScaler CPX in the CPX with Gateway Controller resource (requests 128m CPU and 512Mi memory, limits 500m CPU and 1Gi memory).

Configurable metrics exporter TLS certificate validation

The operator now lets you set how the metrics exporter validates the NetScaler certificate by using the new exporter.validateCert field, which applies only to the NetscalerIngressController instance. The field defaults to no, so existing instances keep their current behavior after you upgrade. Set it to auto (or yes, true, y, on, or 1) to make the metrics exporter validate the NetScaler certificate against the trust store in the exporter image; this requires NetScaler Metrics Exporter 1.7.0 or later. When nsValidateCert (with hostAliases) is configured, the exporter validates the certificate against that CA instead. The operator also accepts false, n, off, and 0 as no, and rejects any other value: when the exporter is enabled, the instance reports Available=False with the reason ExporterValidateCertRequired. Leaving the field unset does not cause an error. For more information, see Deploy NetScaler Ingress Controller in OpenShift using NetScaler Operator.

IPAM allocation status surfaced on the vip resource

The operator-deployed IPAM controller now writes each virtual IP's allocation state and status message back onto the vip resource, shown as new Status and Message columns. Its deployment now uses the Recreate upgrade strategy, so an upgrade no longer briefly runs two IPAM pods that could hand out the same address twice. For more information, see Deploy NetScaler IPAM controller using NetScaler Operator.

Deploy the NetScaler Node Controller using NetScaler Operator

NetScaler Operator can now deploy the NetScaler Node Controller through the new NetscalerNodeController custom resource. The operator adds liveness and readiness health probes to the node controller pod by default, matching the Helm chart; you can adjust the probe timings or turn them off with the healthProbes field. When you delete a NetscalerNodeController instance, the operator removes the node controller in an order that lets it clean up after itself: the node controller removes its overlay configuration from NetScaler, the router pods remove their VXLAN interfaces and iptables rules from the nodes, and the operator then deletes the router ConfigMaps and the RBAC. The net profile cnc-<clusterName>_netprof stays on NetScaler, so delete it yourself once nothing uses it. For more information, see Deploy NetScaler Node Controller using NetScaler Operator.

Fixed issues - NetScaler Ingress Controller

  • In a two-tier ingress (a tier-1 VPX in front of a tier-2 CPX exposed as a Service of type LoadBalancer), the controller binds the tier-1 service-group member to the node IP and node port. As a result, traffic hair-pins through a cluster node instead of reaching the tier-2 service's external IP. A new opt-in flag, EXTERNAL_IP_FOR_SERVICEGROUP_MEMBERS (off by default), makes the controller bind the tier-2 service's external IP and service port instead. In NetScaler Operator deployments, set EXTERNAL_IP_FOR_SERVICEGROUP_MEMBERS to true with the extraEnv field of the NetscalerIngressController instance; the operator manages the controller ConfigMap and reverts manual edits to it.
  • When a type LoadBalancer Service and an Ingress share the same VIP and port, changing the Service type from LoadBalancer to NodePort leaves the Ingress with no content switching virtual server on the NetScaler. As a result, the Ingress becomes unreachable even though it still exists and reports the correct address. NetScaler Ingress Controller now rebuilds the Ingress front end once the conflicting virtual server is removed, and traffic recovers. In addition, when an Ingress front-end IP address and port are already used by another virtual server, NetScaler Ingress Controller now records a Warning event on the Ingress and removes its ADDRESS instead of showing an address that it cannot serve.
  • With the node-watch routing feature enabled, an invalid NS_SNIPS value in the ConfigMap permanently stops NetScaler Ingress Controller from configuring policy-based routes—no SNIP, netprofile, or PBR routes are added. The condition persists until the controller pod is restarted, and correcting the typo alone does not recover it.
  • In a tier-1 deployment where NetScaler Ingress Controller manages an external NetScaler, the VIP of a type LoadBalancer Service is always written into the Service status. As a result, Kubernetes sends in-cluster traffic for that VIP straight to the backend pods instead of through NetScaler. NetScaler Ingress Controller now lets you stop publishing the VIP in the Service status so in-cluster clients also reach it through the NetScaler. To stop publishing the VIP, set the ingressController.updateServiceStatus field of the NetscalerIngressController or NetscalerCpxWithIngressController instance to false. NetScaler Ingress Controller then records the VIP in the service.citrix.com/lb-ip annotation. Upgrade the NetScaler GSLB Controller to 4.3.22 as well, so that GSLB endpoints are still generated, and update anything that reads the service EXTERNAL-IP, such as Argo CD health checks or external-dns (use the external-dns.alpha.kubernetes.io/target annotation).
  • When IPAM is used with a LoadBalancer Service on a classic tier-1 NetScaler (VPX/MPX), changing the service.citrix.com/ipam-range annotation on a Service that already has an IP address does not move it to the new range, and the Service keeps its old IP. NetScaler Ingress Controller now detects the range change, frees the old IP, allocates one from the new range, and reprograms the NetScaler; the same now also applies to Ingress resources that change ingress.citrix.com/ipam-range.
  • When you delete a LoadBalancer Service that uses IPAM on an embedded NetScaler CPX, NetScaler Ingress Controller can recreate an orphaned VIP object after the Service is already gone. The IPAM controller then re-assigns an IP address to that orphan, and the address is not freed. Once a Service or Ingress is deleted, NetScaler Ingress Controller no longer recreates its VIP object and the IP is properly freed.
  • When a Service falls back to the default VIP and no NS_VIP is configured, NetScaler Ingress Controller can program the NetScaler management IP (NSIP) as the VIP, which the NetScaler rejects with errorcode 257. For example, this can happen on a standalone VPX whose only IP is the NSIP. NetScaler Ingress Controller no longer programs the NSIP or an already-configured VIP as the default VIP, and Services that depend on the default VIP stay pending until an NS_VIP, a frontend-ip annotation, or IPAM supplies one.
  • On NetScaler CPX with configuration persistence enabled, the content switching virtual servers that NetScaler Ingress Controller creates for Ingresses are restored on the previous pod IP address after the CPX pod restarts, and NetScaler refuses to move them to the new pod IP address. As a result, Ingresses that are added or changed afterwards are not configured. NetScaler Ingress Controller now recreates such a virtual server, with its policies, certificates, and other bindings, on the new pod IP address.
  • On NetScaler CPX with configuration persistence enabled, the content switching virtual servers that an earlier release of NetScaler Ingress Controller created for Listener resources, or that an earlier release of NetScaler Kubernetes Gateway Controller created for Gateway resources, are saved with an incomplete name when the CPX pod stops. As a result, after the restart, the controller does not reuse them, and they keep their IP address and port. The saved configuration now keeps the full name, so the controller reuses or replaces these virtual servers after the restart.
  • In PBR mode (node-watch with NS_SNIPS) on Calico, when a node receives a second Calico IPAMBlock, NetScaler Ingress Controller reuses a single per-node route name and overwrites the first block's policy-based route. As a result, pods on the first block lose connectivity, and deleting any one block removes the shared route for the others. Only Calico in PBR mode is affected. NetScaler Ingress Controller now programs a separate PBR for each IPAMBlock so the blocks no longer overwrite one another. On upgrade, NetScaler Ingress Controller removes the old per-node PBRs for nodes that are still in the cluster. For a node that has since left the cluster, remove any leftover PBR manually.
  • In large-scale deployments, NetScaler Ingress Controller repeatedly fails its liveness and readiness probes and restarts when its Kubernetes watch threads are wrongly treated as unhealthy.
  • NetScaler Ingress Controller stops configuring a profile, such as the front-end TCP profile on NetScaler CPX, when a profile annotation written as a JSON document contains a plain number or boolean instead of a quoted string.
  • In multicluster mode, an SSL passthrough Listener can fail to come up because the controller gives the SSL action the same name as the content-switching action, causing a NITRO naming collision (error 528). SSL passthrough Listeners now come up reliably when several clusters share one NetScaler and front-end VIP.
  • A SNIP entered with an IPv6 zone or scope id (for example, fe80::1%eth0) passes validation but is then silently ignored. As a result, it is never programmed on the NetScaler and no error is shown. Such scoped or zoned IPv6 SNIPs are now rejected up front so the misconfiguration is visible.
  • For a GlobalTrafficPolicy with multi-port backends—including dual-tier deployments where several applications share one CPX behind a VPX—the GSLB controller health-monitors a single, shared service port. As a result, it can probe the wrong port and mark a healthy service DOWN, and removing a shared backend can fail. You can now set an optional per-host servicePort in the GlobalTrafficPolicy to choose the backend port used for each host's GSLB health monitor; co-located applications are monitored on distinct ports and shared-backend teardown no longer fails. When servicePort is omitted, behavior is unchanged.
  • In large GSLB deployments with a few hundred GlobalTrafficPolicies and Ingresses, the GSLB controller re-checks every GlobalTrafficPolicy on each Ingress change and uses a full CPU. As a result, it stops applying configuration changes. The controller now links each GlobalTrafficPolicy only to the Ingresses that match its host names (ingressHostName, when it is set) or that use one of its target services as their default backend, so an Ingress change re-checks only the policies that it affects. The controller now also creates a global service entry (GSE) from an Ingress that has only a default backend and no rules. If you create all GSEs yourself, you can also set the new GSLB controller environment variable GSE_AUTOCREATION to false (the default is true) with the gslbController.gseAutoCreation field of the NetscalerGslbController instance. The controller then does not list or watch Ingresses and does not create, update, or delete any GSE. For more information, see Turn off automatic GSE creation.
  • By default, the GSLB controller manages the global service entry (GSE) of each GlobalTrafficPolicy target, even a GSE that you created yourself. When you edit a GlobalTrafficPolicy to remove a target, change the destination of a target, or set hosts to an empty list, the controller now deletes the GSE of each target that the GlobalTrafficPolicy no longer uses. If you create all the GSEs yourself, set the gslbController.gseAutoCreation field of the NetscalerGslbController instance to false right after the operator upgrade. For more information, see Turn off automatic GSE creation.
  • When NetScaler Ingress Controller starts, a slow internal client lookup can significantly delay startup, so the controller takes a long time to become ready and begin configuring NetScaler.
  • The controller might fail while watching the authpolicies custom resource (citrix.com/v1beta1) and return an HTTP 401. As a result, changes to authentication policies are not applied until the controller recovers.
  • When NetScaler Ingress Controller is deployed through NetScaler Operator and upgraded, it can leave the previously configured NetScaler objects orphaned and create duplicate objects instead of updating the existing configuration. For example, this can happen when you upgrade from 3.5.0 to 3.6.0. A related content switching virtual server naming change also causes NITRO calls to fail with "vserver does not exist". NetScaler Ingress Controller now reconciles and reuses the existing NetScaler configuration across operator upgrades, so objects are updated in place and the naming stays consistent.
  • In a multicluster deployment, where NetScaler Ingress Controllers in several clusters share one NetScaler, a Listener can fail to come up with NetScaler errorcode 273 after you upgrade NetScaler Ingress Controller. This happens because the content switching virtual server of the Listener now has a new name, and the virtual server with the old name still uses the same IP address and port. NetScaler Ingress Controller now renames that virtual server to the new name, so the Listener comes up after the upgrade.

Fixed issues - NetScaler IPAM Controller

  • The IPAM controller creates its connection to the Infoblox server without verifying the server's TLS certificate. The connector now verifies the Infoblox certificate.
  • For IPAM controllers deployed by NetScaler Operator, certificate verification is controlled by the infoblox.sslVerify field of the NetscalerIpamController instance. It defaults to true, also for existing instances after you upgrade. If the Infoblox server uses a self-signed or private-CA certificate, create a secret with the CA certificate in the ca.crt key and set its name in infoblox.caBundleSecret. Otherwise, the IPAM controller cannot connect to the server.

Fixed issues - NetScaler Metrics Exporter

  • By default, the NetScaler metrics exporter does not validate the certificate of NetScaler on its HTTPS connection. The exporter now validates the NetScaler certificate by default. In NetScaler Operator deployments, the exporter's validation follows the exporter.validateCert field of the NetscalerIngressController instance, which defaults to no; set it to auto (requires NetScaler Metrics Exporter 1.7.0 or later) or configure nsValidateCert (with hostAliases) to turn validation on.

Fixed issues - NetScaler OpenShift Operator

  • Under a heavy configuration load, the NetScaler Operator pod can exceed its default 400Mi memory limit, get OOM-killed, and crash-loop, leaving it unable to reconcile NetScaler resources until it recovers. The default limits are now 1 CPU and 1Gi memory, with requests of 250m CPU and 512Mi memory (previously limits of 500m CPU and 400Mi memory, and requests of 200m CPU and 200Mi memory), and you can further tune the operator's CPU and memory with spec.config.resources on its OLM Subscription, which persists across operator upgrades.
  • In a large cluster, NetScaler Operator can use more memory than it needs. The operator now caches only the resources it manages.

Known issues - NetScaler Node Controller

  • Back-end pods that are reached over the node controller VXLAN overlay can be marked DOWN at random, because the router pod does not add the VXLAN flood entry on its node.
    Workaround: On each worker node, run the following command. Run it again if the router pod on that node is recreated. To find the cncvxlan interface on the node, run ip -d link show type vxlan.
    bridge fdb append 00:00:00:00:00:00 dev <cncvxlan interface> dst <vtepIP>