joonslach opened a new issue, #2800:
URL: https://github.com/apache/apisix-ingress-controller/issues/2800

   ### Type
   
   Feature request / behavior inconsistency between the Ingress and Gateway API 
reconcilers.
   
   ### Current Behavior
   
   In `2.1.0`, the **Gateway API** controller populates 
`Gateway.status.addresses` **only** from `gatewayProxy.spec.statusAddress`. 
There is no fallback to `publishService`.
   
   `internal/controller/gateway_controller.go`:
   ```go
   gatewayProxy, ok := tctx.GatewayProxies[rk]
   if !ok {
       acceptStatus = conditionStatus{status: false, msg: "gateway proxy not 
found"}
   } else {
       for _, addr := range gatewayProxy.Spec.StatusAddress {   // only 
StatusAddress
           addrType := gatewayv1.IPAddressType
           if net.ParseIP(addr) == nil { addrType = 
gatewayv1.HostnameAddressType }
           addrs = append(addrs, gatewayv1.GatewayStatusAddress{Type: 
&addrType, Value: addr})
       }
   }
   ...
   gateway.Status.Addresses = addrs   // overwrites; if StatusAddress is empty, 
addresses are cleared on every reconcile
   ```
   
   By contrast, the **Ingress** controller already resolves `publishService` 
dynamically when `statusAddress` is not set.
   
   `internal/controller/ingress_controller.go` (`updateStatus`):
   ```go
   // 1. use the IngressStatusAddress in the config
   statusAddresses := gatewayProxy.Spec.StatusAddress
   if len(statusAddresses) > 0 {
       ... // static
   } else {
       // 2. if the IngressStatusAddress is not configured, try to use the 
PublishService
       publishService := gatewayProxy.Spec.PublishService
       if publishService != "" {
           ... // resolves the LoadBalancer Service ingress IP/hostname 
dynamically
       }
   }
   ```
   
   So `publishService` works for Ingress status but is ignored for Gateway 
status.
   
   ### Expected Behavior
   
   The Gateway reconciler should mirror the Ingress path: when 
`gatewayProxy.spec.statusAddress` is empty, fall back to 
`gatewayProxy.spec.publishService` and populate `Gateway.status.addresses` from 
that Service's `.status.loadBalancer.ingress[].ip|hostname`.
   
   ### Why
   
   On cloud LoadBalancers (we run OpenStack Octavia; AWS/GCP are equivalent), 
the external IP/hostname is assigned dynamically and can change when the LB is 
recreated. A static `statusAddress` is brittle: it must be hand-updated 
whenever the LB address changes, and if left empty the controller clears 
`Gateway.status.addresses` on every reconcile.
   
   This breaks consumers that read `Gateway.status.addresses` — e.g. 
external-dns (`--source=gateway-httproute`) publishes A records from the 
Gateway address; an empty address causes it to remove all records for routes 
attached to the Gateway. `publishService` already exists on the GatewayProxy 
and is the natural dynamic source; it just isn't wired into the Gateway status 
path.
   
   ### Environment
   
   - apisix-ingress-controller `2.1.0` (manager), ADC `0.26.0`
   - Gateway API standalone mode, `gatewayProxy.spec.publishService` set to the 
`LoadBalancer` Service, `statusAddress` unset
   - LoadBalancer: OpenStack Octavia (dynamic VIP)
   
   ### Proposed Change
   
   In `gateway_controller.go`, after the `StatusAddress` loop, when no 
`statusAddress` entries are present, resolve `gatewayProxy.spec.publishService` 
to the Service's LoadBalancer ingress and append the resulting 
`GatewayStatusAddress` entries (IP → `IPAddress`, hostname → `Hostname`), 
reusing the helper logic already used by the Ingress path. Happy to contribute 
a PR if the direction is acceptable.
   
   Related prior work: #2730 / #2732 (statusAddress hostname support + 
publishService/statusAddress logic).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to