Skip to content

feat: As a sysadmin, I want better feedback on invalid routes, so that i can troubleshoot easier #2714

@ch-gr

Description

@ch-gr

Description

Currently when an ApisixRoute is not accepted, ** all ** ApisixRoutes are shown as not accepted, and it is not easy to determine which ApisixRoute is at fault. The index of the problem route is indicated, but not the name & namespace.

It would be beneficial to only reject the invalid routes, allowing those that are valid to continue to update the config.

If that is not possible, it would make troubleshooting easier if the message included the namespace & name of the problem route.

Steps to reproduce:

Install apisix

helm install apisix \
  --namespace ingress-apisix \
  --create-namespace \
  --set apisix.deployment.role=traditional \
  --set apisix.deployment.role_traditional.config_provider=yaml \
  --set etcd.enabled=false \
  --set ingress-controller.enabled=true \
  --set ingress-controller.config.provider.type=apisix-standalone \
  --set ingress-controller.apisix.adminService.namespace=ingress-apisix \
  --set ingress-controller.gatewayProxy.createDefault=true \
  apisix/apisix

Install a hello-world service

helm install hello-world \
    --namespace hello-world \
    --create-namespace \
    --version 21.0.8 \
    --set image.repository=bitnamilegacy/nginx \
    --set global.security.allowInsecureImages=true \
    --set-literal serverBlock='server {listen 0.0.0.0:8080;location /hello-world {default_type text/plain;return 200 "Hello, World!";}}' \
    oci://registry-1.docker.io/bitnamicharts/nginx

Add a valid route

kubectl apply -f - << __EOF__
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: hello-world-1
  namespace: hello-world
spec:
  ingressClassName: apisix
  http:
    - name: hello-world-1
      match:
        paths:
          - /hello-world-1
      backends:
      - serviceName: hello-world-nginx
        servicePort: 80
__EOF__

Check the route's status

kubectl get apisixroute -n hello-world hello-world-1 -o yaml | yq .status
conditions:
  - lastTransitionTime: "2026-02-03T18:33:40Z"
    message: ""
    observedGeneration: 2
    reason: Accepted
    status: "True"
    type: Accepted

Add an invalid route (reference a plugin that does not exist)

kubectl apply -f - << __EOF__
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: hello-world-2
  namespace: hello-world
spec:
  ingressClassName: apisix
  http:
    - name: hello-world-2
      match:
        paths:
          - /hello-world-2
      backends:
      - serviceName: hello-world-nginx
        servicePort: 80
      plugins:
        - name: non-existent-plugin
          enable: true
__EOF__

Verify the new plugin

kubectl get apisixroute -n hello-world hello-world-2 -o yaml | yq .status
conditions:
  - lastTransitionTime: "2026-02-03T18:36:37Z"
    message: 'ServerAddr: http://10.244.0.6:9180, Err: invalid routes at index 1, err: unknown plugin [non-existent-plugin]'
    observedGeneration: 1
    reason: SyncFailed
    status: "False"
    type: Accepted

Observe that the original apisixroute is also no longer accepted

kubectl get apisixroute -n hello-world hello-world-1 -o yaml | yq .status
conditions:
  - lastTransitionTime: "2026-02-03T18:36:37Z"
    message: 'ServerAddr: http://10.244.0.6:9180, Err: invalid routes at index 1, err: unknown plugin [non-existent-plugin]'
    observedGeneration: 2
    reason: SyncFailed
    status: "False"
    type: Accepted

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions