The module lifecycle stagePreview
The module has requirements for installation

This guide describes how to migrate application publishing and Deckhouse Kubernetes Platform (DKP) system interfaces from the ingress-nginx module to the alb module, including replacing application Ingress resources with Gateway API resources and switching traffic to ALB.

Motivation

Migrating from the Ingress API to the Gateway API aligns application traffic management with the current Kubernetes networking model. Active maintenance of the upstream Ingress NGINX project used by DKP has ended, so further upstream development of features, fixes, and integrations is no longer expected. New and actively developed application publishing scenarios should use the Gateway API.

DKP continues to support the ingress-nginx module, so immediate migration is not required.

The Gateway API is the current standard for Kubernetes application networking. Compared with the Ingress API, it provides a more flexible and expressive model: protocol-specific route resources, explicit listener configuration, controlled route attachment, and dedicated resources for cross-namespace access. This model supports complex traffic configurations without relying primarily on controller-specific annotations.

The Gateway API also establishes clearer responsibility boundaries. Cluster and network administrators manage traffic infrastructure and Gateway objects through ClusterALBInstance or ALBInstance, while application teams define listeners and routing rules through ListenerSet and route resources. This separation simplifies delegation, validation, and gradual migration.

Scope

This guide covers migration from the DKP application publishing model based on ingress-nginx to the Gateway API model provided by the alb module. It describes the architectural differences, the infrastructure changes required to introduce ALBInstance or ClusterALBInstance and the managed Gateway, and the application changes required to replace Ingress resources with Gateway API resources.

The guide is not a general Gateway API tutorial. It does not cover migration from other ingress controllers, application architecture changes, service mesh migration, or every ingress-nginx annotation. Annotation compatibility is considered only where it affects migration to the alb module.

Model comparison

This section compares how administrators define traffic infrastructure, how DKP provisions it, and how application routing configuration is translated into data-plane configuration.

Ingress API and ingress-nginx

The diagram below shows the resource model and traffic flow through the ingress-nginx module.

ingress-nginx resource and traffic flow scheme

HTTP and HTTPS traffic processing through the ingress-nginx module is configured as follows:

  1. A cluster administrator creates a cluster-scoped IngressNginxController object.
  2. The IngressNginxController specifies the name of the IngressClass it uses. If the name is omitted, nginx is used.
  3. DKP reconciles the object and provisions the required infrastructure, including the IngressClass. Multiple IngressNginxController objects can use the same IngressClass.
  4. By default, DKP resources are published through the IngressClass named nginx. A different class can be selected in the DKP global configuration.
  5. Network administrators or application teams create Ingress objects that select the required IngressClass explicitly or implicitly.
  6. The resulting nginx configuration combines infrastructure settings from IngressNginxController with the Ingress objects selected by the IngressClass.

Gateway API and alb

The diagram below shows the resource model and traffic flow through the alb module.

Gateway API resource and traffic flow scheme

HTTP, HTTPS, gRPC, TLS, TCP, and UDP traffic processing through the alb module is configured as follows:

  1. A cluster administrator creates a cluster-scoped ClusterALBInstance object.
  2. The ClusterALBInstance specifies infrastructure parameters and the mandatory gatewayName, which identifies the managed Gateway.
  3. The ALB controller reconciles the object and provisions the managed Gateway and the required traffic-processing infrastructure. Multiple ClusterALBInstance objects can use the same gatewayName and therefore the same Gateway.
  4. If the default DKP Gateway is configured, DKP modules create their ListenerSet, HTTPRoute, and other Gateway API resources for that Gateway.
  5. Network administrators or application teams create Gateway API resources and attach them to the managed Gateway.
  6. The resulting Envoy Proxy configuration combines infrastructure settings from ClusterALBInstance with the configuration represented by the Gateway API resources attached to the Gateway.

Key architectural differences

The diagrams highlight the following architectural differences:

Aspect Ingress API and ingress-nginx Gateway API and alb
Resource relationships Infrastructure and routing rules are associated indirectly through an IngressClass Resources form an explicit graph using parentRefs and other typed references, with the Gateway as the root
Separation of responsibilities IngressNginxController defines infrastructure, while Ingress combines application routing with controller-specific configuration Cluster and network administrators manage instances and gateways, while application teams define listeners and routes through ListenerSet and route resources
Configuration model An Ingress combines most HTTP/HTTPS routing configuration in one object and controller-specific annotations Listeners, routes, backends, and policies are represented by separate, composable objects
Shared configuration and entry points Multiple IngressNginxController objects that use the same IngressClass consume the same set of Ingress rules while providing separate entry points Multiple ClusterALBInstance objects with the same gatewayName provide separate entry points backed by the same Gateway configuration
Cross-namespace references An Ingress, its backend Service, and its TLS Secret generally reside in the same namespace Controlled cross-namespace references are supported through ReferenceGrant
Protocol support Ingress primarily models HTTP and HTTPS traffic Dedicated route types model HTTP, gRPC, TCP, TLS, and UDP traffic
Extensibility Additional behavior is commonly configured through implementation-specific annotations More behavior is expressed through structured, validated API resources and policies
Lifecycle and ownership Infrastructure and routing configuration have limited delegation and attachment controls Gateway infrastructure can remain stable while application teams independently create, update, and remove routes
Route attachment Selecting an IngressClass provides a broad association between an Ingress and controllers Gateway objects and listeners explicitly control which routes may attach to them

Multiple ClusterALBInstance objects can refer to the same Gateway, but settings that affect the shared Gateway, such as additionalPorts, can conflict. Consistent with the Gateway API conflict-resolution approach, the alb module treats the oldest ClusterALBInstance as authoritative. Conflicting settings from newer instances are ignored and reported in their status. Ensure that all instances associated with the same Gateway use compatible Gateway-level settings.

Migrating infrastructure

Choosing ALBInstance or ClusterALBInstance

Use ClusterALBInstance for a shared or platform-level Gateway, for publishing DKP system interfaces, or when the HostPort inlet is required. To publish DKP system interfaces, follow the procedure in “Accessing DKP system components using Gateway API”. Use ALBInstance for a Gateway dedicated to an application or team and managed within its namespace. ALBInstance supports the LoadBalancer inlet only.

For a detailed comparison, refer to “Automatically creating and flexibly configuring infrastructure for Gateway objects”.

Inlet configuration

In IngressNginxController, the inlet type combines the method of accepting traffic with optional behaviors such as Proxy Protocol and SSL passthrough. The alb module configures these concerns separately:

  • ClusterALBInstance supports the LoadBalancer and HostPort inlet types.
  • ALBInstance supports the LoadBalancer inlet type.
  • Proxy Protocol is enabled by the spec.useProxyProtocol parameter. It can be enabled or disabled on an existing instance without restarting the Envoy Proxy Pod objects or recreating the instance.
  • TLS passthrough is configured with a TLS listener and a TLSRoute, rather than with a dedicated inlet type.

Use the following mapping when selecting an inlet for the alb module:

IngressNginxController inlet alb module configuration Migration notes
LoadBalancer ClusterALBInstance or ALBInstance with spec.inlet.type: LoadBalancer The controller provisions a Service of type LoadBalancer
LoadBalancerWithProxyProtocol LoadBalancer inlet with spec.useProxyProtocol: true Configure the external load balancer to send Proxy Protocol. Proxy Protocol and HTTP/3 cannot be enabled simultaneously
LoadBalancerWithSSLPassthrough LoadBalancer inlet with a TLS listener and TLSRoute TLS passthrough is part of the Gateway API routing configuration and is not an inlet variant
HostPort ClusterALBInstance with spec.inlet.type: HostPort HostPort is not supported by ALBInstance
HostPortWithProxyProtocol ClusterALBInstance with the HostPort inlet and spec.useProxyProtocol: true Proxy Protocol and HTTP/3 cannot be enabled simultaneously
HostPortWithSSLPassthrough ClusterALBInstance with the HostPort inlet, a TLS listener, and TLSRoute TLS passthrough is configured independently of the inlet
HostWithFailover No direct equivalent The recommended replacement is a ClusterALBInstance with the LoadBalancer inlet backed by MetalLB. Follow “Example for bare metal with the MetalLB load balancer” and validate load-balancer failover before switching traffic

During migration, the ingress-nginx module with a HostNetwork or HostPort inlet and the alb module with a HostPort inlet cannot use the same host ports on the same nodes. The resulting port conflict prevents the corresponding Pod objects from running. Select separate node sets with node selectors, or configure a different set of host ports for one of the controllers.

Map related inlet parameters as follows:

IngressNginxController ClusterALBInstance or ALBInstance
spec.loadBalancer.annotations spec.inlet.loadBalancer.serviceAnnotations
spec.loadBalancer.loadBalancerClass spec.inlet.loadBalancer.loadBalancerClass
spec.loadBalancer.httpPort, httpsPort spec.inlet.loadBalancer.httpPort, httpsPort
spec.loadBalancer.sourceRanges spec.inlet.loadBalancer.loadBalancerSourceRanges
spec.hostPort.httpPort, httpsPort spec.inlet.hostPort.httpPort, httpsPort
spec.acceptRequestsFrom spec.acceptRequestsFrom
spec.*.behindL7Proxy, realIPHeader, acceptClientIPHeadersFrom spec.originalIPDetection.realIPHeader, setRealIPFrom

Consider the following when migrating these parameters:

  • Copy only service annotations supported by the target load balancer implementation.
  • spec.inlet.loadBalancer.loadBalancerClass is immutable after creation.
  • The default HTTP and HTTPS ports remain 80 and 443. In the alb module, set a port to 0 to disable the corresponding default listener.
  • HostPort parameters are available for ClusterALBInstance only. At least one port must be specified.
  • Preserve the required source CIDR restrictions in spec.acceptRequestsFrom.
  • Configure trusted proxy CIDRs explicitly. Do not trust client-IP headers from arbitrary sources.
  • loadBalancerSourceRanges is passed to the LoadBalancer Service. Cloud providers may not support or may ignore this parameter. Verify its behavior with the target load balancer implementation.

The inlet type of ClusterALBInstance is immutable, and ALBInstance supports only the LoadBalancer inlet. To change the ALB inlet, create a new instance with the required inlet type and the same gatewayName so that it uses the same managed Gateway. Validate the traffic flow through the new instance, switch traffic to it, and then delete the instance with the unsuitable inlet type.

TLS and certificates

When ingress-nginx and alb are used simultaneously and certificates are issued by Issuer or ClusterIssuer resources that use HTTP-01 solvers, use separate Certificate resources and certificate Secret objects for the Ingress API path and the Gateway API path. DKP provisions a Gateway-specific ClusterIssuer configured with a Let’s Encrypt HTTP-01 solver for the default DKP Gateway. Sharing a certificate between the two publishing paths may cause conflicts during issuance or renewal. This recommendation applies only to Issuer and ClusterIssuer resources configured with HTTP-01 solvers; it does not apply to resources configured exclusively with DNS-01 solvers.

For instructions on configuring an HTTP-01 issuer with the Gateway API solver, see “Adding a custom HTTP-01 ClusterIssuer or Issuer for ALB”.

Migrating DKP interfaces

To publish DKP system interfaces through the Gateway API, follow “Accessing DKP system components using Gateway API” in the administrator guide.

Migrating application exposure

Supported Gateway API resources

The alb module creates and manages Gateway objects referenced by ALBInstance and ClusterALBInstance resources. One or more instances may refer to the same managed Gateway. Sharing a Gateway allows the instances to use the same Gateway API configuration graph, including ListenerSet, route, and policy resources, while providing separate traffic entry points with different inlet and per-instance proxy deployment settings.

Some instance parameters, such as additionalPorts, frontendTLS, and backendTLS, affect the shared Gateway and therefore cannot have different effective values. For these parameters, the oldest instance by creation timestamp is authoritative. Newer, non-authoritative instances continue to provide their own inlets and proxy workloads, but their conflicting Gateway-level settings are ignored and the conflict is reported in their status.

Do not edit the managed Gateway directly. Define how the Gateway accepts HTTP, HTTPS, gRPC, and TLS traffic with ListenerSet resources, and attach route resources to the corresponding listeners. For plain TCP and UDP traffic, the instance’s additionalPorts parameter defines listeners directly on the managed Gateway.

The alb module supports the following Gateway API resources:

  • Gateway — represents a traffic entry point controlled by DKP. DKP creates and continuously reconciles the resource from the parameters of the corresponding ALBInstance or ClusterALBInstance. Do not edit the Gateway directly.
  • ListenerSet — defines listeners for a managed Gateway, including their ports, protocols, hostnames, and TLS settings. In the alb module, use ListenerSet as the primary way to define HTTP, HTTPS, gRPC, and TLS listeners instead of editing Gateway.spec.listeners.
  • HTTPRoute — routes HTTP and HTTPS requests from a ListenerSet listener to backend Service objects. It supports matching and processing requests by hostname, path, headers, query parameters, and other HTTP attributes.
  • GRPCRoute — routes gRPC requests from a ListenerSet listener to backend Service objects, with optional matching by gRPC service, method, or headers.
  • TCPRoute — routes plain TCP connections from an additional TCP listener directly to a backend Service. The listener and port are created on the managed Gateway from spec.inlet.additionalPorts.
  • TLSRoute — routes TLS connections by SNI without terminating TLS on the Gateway. Attach it to a TLS or HTTPS listener in Passthrough mode defined in a ListenerSet when the application terminates TLS.
  • UDPRoute — routes UDP datagrams from an additional UDP listener directly to a backend Service. The listener and port are created on the managed Gateway from spec.inlet.additionalPorts.
  • ReferenceGrant — explicitly permits supported references across namespace boundaries, for example when a route and its parent ListenerSet are in different namespaces.
  • BackendTLSPolicy — configures TLS and server-certificate validation for connections from the Gateway to a backend Service.

Converting Ingress to Gateway API

Create the target ALBInstance or ClusterALBInstance before converting application resources, wait for it to become ready, and obtain the managed Gateway namespace and name from its status. Convert each Ingress and its related configuration into the appropriate ListenerSet, route, and policy resources for that Gateway. The built-in conversion tool can generate a starting point, but review the resulting manifests before applying them because not every ingress-nginx feature has a direct Gateway API equivalent.

Using the built-in ingress2gateway tool

The gateway controller provides an HTTP endpoint that accepts a single object, a Kubernetes List object, or a YAML payload containing multiple documents. The converter reads the following input resources:

  • Ingress — the resources selected for conversion.
  • Service — used to resolve named backend ports and service metadata.
  • DexAuthenticator — used to resolve spec.applicationDomain when an ingress-nginx external-auth configuration contains nginx variables such as $host.

Pass all related resources as input so the converter can preserve the supported parts of their configuration. The endpoint is disabled by default and listens only inside gateway controller Pod objects.

  1. Temporarily enable migrations.ingress2Gateway.enabled in the alb module configuration and wait for the gateway controller to restart:

    d8 k patch moduleconfig alb --type merge \
      --patch '{"spec":{"settings":{"migrations":{"ingress2Gateway":{"enabled":true}}}}}'
    d8 k -n d8-alb rollout status deployment/gateway-controller
  2. Forward the endpoint from a gateway controller Pod:

    d8 k -n d8-alb port-forward deployment/gateway-controller 8082:8082
  3. In another terminal, export all recognized resource types and send the resulting Kubernetes List directly to the converter:

    d8 k get ingress,service,dexauthenticator --all-namespaces --output yaml | curl --fail-with-body --silent --show-error --request POST --header 'Content-Type: application/yaml' --data-binary @- --output gateway-api.yaml 'http://127.0.0.1:8082/ingress2gateway?gateway=<GATEWAY_NAMESPACE>/<GATEWAY_NAME>&scope=<SCOPE>&ingress-class=<INGRESS_CLASS>'

    where:

    • <GATEWAY_NAMESPACE> — namespace of the managed Gateway;
    • <GATEWAY_NAME> — name of the managed Gateway;
    • <SCOPE> — ALB infrastructure scope: cluster or namespaced. The default is cluster;
    • <INGRESS_CLASS> — IngressClass selected for conversion. The default is nginx.

The request body is limited to 8 MiB. For large clusters, export only the namespaces and related resources being migrated.

The query parameters have the following meanings:

  • gateway — the target managed Gateway in <GATEWAY_NAMESPACE>/<GATEWAY_NAME> format. The default is d8-alb/public-gw;
  • scope — the target ALB infrastructure scope: cluster or namespaced. The default is cluster;
  • ingress-class — the IngressClass selected for conversion. The default is nginx.

Review gateway-api.yaml and the conversion diagnostics included as YAML comments before applying the generated resources. After completing the conversion, disable the endpoint:

d8 k patch moduleconfig alb --type merge \
  --patch '{"spec":{"settings":{"migrations":{"ingress2Gateway":{"enabled":false}}}}}'

Extending Gateway API with annotations

The Gateway API specification does not cover every implementation-specific traffic-management feature required by DKP. The alb module therefore uses HTTPRoute annotations to provide configuration options that are not yet represented by standard Gateway API fields. As the corresponding features become available in the Gateway API, the alb module will gradually replace annotation-based configuration with native Gateway API resources and fields. During migration, use standard Gateway API fields where possible and replace ingress-nginx annotations only with supported alb annotations. See the current list in “Supported HTTPRoute annotations”.

Switching traffic to ALB

Run ingress-nginx and alb simultaneously until the ALB path has been validated and the rollback window has closed. Migrate individual domains or namespaces when they can use separate DNS records. Otherwise, switch the shared external entry point by changing DNS records or the backend pool of an external load balancer.

Testing ALB through Ingress NGINX

The spec.migrationGateway parameter of IngressNginxController enables source-IP-based testing without changing DNS. Requests from sourceCIDRs continue to enter through the existing Ingress NGINX entry point but are proxied to the internal Service of the target ALB instance. Other requests continue to use the original Ingress backends.

The parameter is available in the ingress-nginx module version 1.1.0 and later.

Despite its use in this guide for ALB migration, migrationGateway is not specific to ALB. Its serviceRef can point to the entry-point Service of any Gateway API implementation that accepts ordinary HTTP and HTTPS traffic on the configured ports.

Locate the ALB configuration Service:

d8 k get service --all-namespaces --selector alb.deckhouse.io/configuration-service

Then configure the source IngressNginxController, using narrow tester CIDRs initially:

apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: <CONTROLLER_NAME>
spec:
  # Existing settings are omitted.
  migrationGateway:
    sourceCIDRs:
      - <SOURCE_CIDR>
    serviceRef:
      namespace: <SERVICE_NAMESPACE>
      name: <SERVICE_NAME>
      ports:
        http: <HTTP_PORT>
        https: <HTTPS_PORT>

where:

  • <CONTROLLER_NAME> — name of the source IngressNginxController;
  • <SOURCE_CIDR> — CIDR of clients whose requests are proxied to ALB during testing;
  • <SERVICE_NAMESPACE> — namespace of the ALB configuration Service;
  • <SERVICE_NAME> — name of the ALB configuration Service;
  • <HTTP_PORT> — HTTP port on the target Service;
  • <HTTPS_PORT> — HTTPS port on the target Service.

HTTP requests are forwarded to the configured HTTP port. For HTTPS, nginx terminates the incoming TLS connection and establishes a new TLS connection to the configured HTTPS port, using the original hostname in the Host header and for SNI. The setting applies to all Ingress resources served by the controller, so verify every hostname accessible from the selected CIDRs.

migrationGateway bypasses the backends and location-level behavior configured by the original Ingress resources for matching clients. It supports HTTP, HTTPS, and HTTP-based protocol upgrades such as WebSocket, but does not support gRPC or non-HTTP protocols. Before expanding sourceCIDRs, verify that authentication, redirects, headers, GeoIP behavior, WebSocket connections, and other policies have equivalents on the ALB path.

The parameter is not supported with HostPortWithSSLPassthrough, LoadBalancerWithSSLPassthrough, HostWithFailover, or enableIstioSidecar. The target Service must accept ordinary HTTP and HTTPS because migrationGateway does not send Proxy Protocol. If the Gateway API entry point will use Proxy Protocol in production, it can be temporarily disabled in the target instance settings during testing (spec.useProxyProtocol: false for an ALB instance). Restore the production setting afterward and validate the entry point through the load balancer that sends Proxy Protocol. When a trusted L7 proxy is used in front of the Ingress NGINX Controller, verify real-IP processing before relying on sourceCIDRs.

Remove spec.migrationGateway to immediately return selected clients to the original Ingress backends:

d8 k patch ingressnginxcontroller <CONTROLLER_NAME> --type json \
  --patch '[{"op":"remove","path":"/spec/migrationGateway"}]'

where <CONTROLLER_NAME> is the name of the source IngressNginxController.

Preserving HTTP-01 validation

migrationGateway handles selected application requests, while migrations.http01CertificateSolverBridging keeps cert-manager Gateway API HTTP-01 challenges reachable through Ingress NGINX while public DNS still points to it. When Issuer or ClusterIssuer resources with HTTP-01 solvers are used, enable bridging before requesting certificates for the ALB path:

d8 k patch moduleconfig alb --type merge \
  --patch '{"spec":{"settings":{"migrations":{"http01CertificateSolverBridging":{"enabled":true,"ingressClassName":"<INGRESS_CLASS>"}}}}}'
d8 k -n d8-alb rollout status deployment/gateway-controller

where <INGRESS_CLASS> is the IngressClass that currently receives public traffic on port 80.

The ALB controller creates temporary Ingress resources for cert-manager solver HTTPRoute resources, allowing challenges to pass through Ingress NGINX to the solver Service. This feature requires the ingress-nginx module to remain enabled.

Bridging allows certificates for the Gateway API path to be issued before the traffic cutover. It is then possible to test the prepared TLS configuration through migrationGateway or by connecting directly to the ALB address with a hostname override, for example using the curl --resolve option.

After DNS or the external load balancer sends public traffic to ALB, verify HTTP-01 issuance through the Gateway API path and disable bridging:

d8 k patch moduleconfig alb --type merge \
  --patch '{"spec":{"settings":{"migrations":{"http01CertificateSolverBridging":{"enabled":false}}}}}'

Choosing the switching method

Automatically provisioned load balancer

When the Ingress NGINX Controller uses a LoadBalancer Service provisioned by the Kubernetes cloud provider, the source and target controllers normally have separate load balancer IP addresses or hostnames. Wait for the ALB load balancer and its health checks to become ready, lower the DNS TTL in advance, and change each application DNS record from the Ingress NGINX address to the ALB address.

Use weighted DNS records for a gradual switch only if the DNS provider supports them. A provider-managed load balancer does not normally allow node-by-node migration between two independently managed Service objects. If MetalLB or another implementation uses a fixed address, the same address cannot be assigned to both Service objects simultaneously. Transfer it only during a coordinated cutover.

Manually managed load balancer

When a cloud or private load balancer is managed outside Kubernetes, keep the public DNS record unchanged and migrate its backend pool. Add ALB nodes and their configured ports as healthy backends, shift traffic from Ingress NGINX backends gradually, and remove the old backends only after validation. This supports node-by-node migration and weighted traffic distribution when the external load balancer provides those features.

Configure health checks against /healthz on the ALB HTTP port. Preserve the original protocol and client-address handling: align Proxy Protocol settings for traffic and health checks, or configure trusted forwarded headers for an L7 load balancer. If both controllers run on the same nodes, use different host ports. Alternatively, select disjoint node sets.

Direct HostNetwork or HostPort access

When DNS records point directly to node addresses, deploy ALB on a separate node set or use non-conflicting host ports. For a node-by-node switch, add ALB node addresses to the DNS pool and remove Ingress NGINX node addresses after each node passes validation. DNS pools do not provide deterministic weighting or connection draining, so account for TTLs and client-side caching.

DNS cannot distinguish controllers that use different ports on the same node address. If clients must continue using ports 80 and 443, use separate nodes or introduce a load balancer or NAT rule. HostWithFailover has no direct ALB equivalent. Use the recommended LoadBalancer inlet with MetalLB when equivalent failover behavior is required.

Validating the cutover

Before shifting production traffic:

Traffic processing can differ between Ingress NGINX and ALB, including generated and trusted headers, protocol handling, and supported features. Thoroughly test applications through the ALB path and, where necessary, adjust them to the traffic-processing behavior of ALB before switching production traffic.

  • Verify that the target ALBInstance or ClusterALBInstance reports ready and synced, and inspect its conflict fields.
  • Verify the Gateway, ListenerSet, and route status conditions, including accepted references and programmed listeners.
  • Test every hostname and protocol through the ALB address or with migrationGateway, including TLS certificates, redirects, authentication, long-lived connections, and application-specific policies.
  • Verify preservation of the client address, Proxy Protocol or forwarded-header processing, source restrictions, and load balancer health checks.
  • Confirm that metrics, logs, alerts, and dashboards identify traffic and errors on both controllers.
  • Keep Ingress resources, the Ingress NGINX Controller, its external entry point, and valid certificates available throughout the rollback window.

Rolling back

Define rollback criteria before the cutover. If validation fails:

  1. For migrationGateway testing, remove spec.migrationGateway.
  2. For a DNS switch, restore the Ingress NGINX address and wait for the previous DNS TTL to expire.
  3. For a manually managed load balancer, restore Ingress NGINX nodes and ports in its backend pool.
  4. If public traffic again enters through Ingress NGINX and the Issuer or ClusterIssuer resources for Gateway API certificates use HTTP-01 solvers, re-enable http01CertificateSolverBridging.

Do not delete the old Ingress resources, Ingress NGINX Controller, load balancer, or DNS values until rollback has been tested and the agreed stabilization period has elapsed.

Cleanup

After the rollback window closes, remove migrationGateway, disable http01CertificateSolverBridging and ingress2Gateway, delete obsolete Ingress resources and Ingress NGINX Controllers, and remove unused load balancers, certificates, Secret objects, and DNS records. Restore normal DNS TTLs after confirming that no clients use the old entry point.

DKP interfaces continue to be published through the Ingress API path even when the ingress-nginx module is disabled. Work is in progress to adjust this behavior.