常见问题与解决方案
使用 Ingress Controller 时如果出现问题,通常应先查看网关和控制器日志,因为日志往往可以快速暴露根因。
本文介绍常见问题,并提供实用的排查和解决建议。
GatewayProxy 缺失或配置错误
当 Gateway 或 IngressClass 引用 GatewayProxy 时,GatewayProxy 定义其使用的提供商连接。如果资源没有同步到网关,常见原因是被引用的 GatewayProxy 缺失或配置错误。
确认 GatewayProxy 资源存在:
kubectl get gatewayproxy --all-namespaces
如果 GatewayProxy 存在,检查其配置:
kubectl describe gatewayproxy <gatewayproxy-name> -n <namespace>
对于 Gateway,被引用的 GatewayProxy 必须位于同一命名空间。IngressClass 可以在 spec.parameters 中指定 GatewayProxy 的命名空间。确认提供商 Service 或端点以及任何被引用的认证 Secret。这些检查不能证明提供商连接正常;如果引用正确,请继续进行配置同步故障排查。
IngressClassName 缺失或未指定
当以下资源的 ingressClassName 选择了匹 配的 IngressClass,或者在省略该字段时存在匹配的默认 IngressClass,Ingress Controller 会处理这些资源:
IngressApisixRouteApisixUpstreamApisixTlsApisixPluginConfigApisixGlobalRuleApisixConsumer
如果显式指定的 ingressClassName 不正确,或者省略该字段且不存在匹配的默认 IngressClass,资源不会同步到网关。
对于 Ingress 资源,控制器会先检查 spec.ingressClassName,然后回退到 kubernetes.io/ingress.class 注解。如果两者均未设置,控制器可以使用匹配的默认 IngressClass。
查看当前存在的 IngressClass 资源(集群级资源):
kubectl get ingressclass
检查 IngressClass 配置,确认它引用了预期的 Ingress Controller:
kubectl describe ingressclass <ingressclass-name>
确认你的资源指定了正确的 ingressClassName,例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
ingressClassName: apisix
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
etcd 故障
本节仅适用于使用 etcd 作为配置后端的 APISIX 部署。如果 etcd Pod 反复重启(CrashLoopBackOff)或持续处于不健康状态,APISIX 配置操作可能失败。
检查 etcd Pod 的状态、事件和日志,然后恢复存储访问和健康的集群成员关系,再继续排查 Ingress Controller。这是 APISIX 网关后端问题,而非 Ingress Controller 故障;APISIX 独立模式不受影响。
跨资源路由优先级
优先级值越高,路由优先级越高。当同时使用多种资源类型(Ingress、HTTPRoute 和 ApisixRoute)时,路由行为可能受到不同资源优先级分配和评估方式的影响。
各资源类型的优先级处理方式如下:
- Ingress:原生资源不提供显式路由优先级。只有 HTTPRoutePolicy 提供优先级时,控制器才会设置优先级。
- HTTPRoute:除非 HTTPRoutePolicy 设置了优先级,否则控制器会根据路由匹配条件计算确定性的优先级。
- ApisixRoute:允许显式配置路由优先级。
不要依赖固定的 ApisixRoute 值来覆盖所有 HTTPRoute 或 Ingress。请比较通过 HTTPRoutePolicy 设置的所有优先级,并参阅配置路由优先级和匹配条件。
HTTPRoute 过滤器与 PluginConfig
当 HTTPRoute 过滤器和 PluginConfig CRD 同时应用到同一路由时,可能出现非预期的插件行为。理解二者的交互方式有助于避免配置冲突。
Ingress Controller 会将内置 Gateway API HTTPRoute 过滤器映射到特定插件:
RequestHeaderModifier映射到proxy-rewriteRequestRedirect映射到redirectRequestMirror映射到proxy-mirrorURLRewrite映射到proxy-rewriteResponseHeaderModifier映射到response-rewriteCORS映射到corsExtensionRef引用同一命名空间中 PluginConfig 的插件
不要在同一条规则中通过标准过滤器和 PluginConfig 配置同一个底层插件。重叠的条目无法可靠合并,并可能导致路由无法转换。有关支持的映射,请参阅 HTTP 路由过滤器。
启用监听器端口匹配时 Gateway API 路由返回 404
启用监听器端口匹配时,Gateway API HTTPRoute 或 GRPCRoute 可能返回 404;TCPRoute 与 UDPRoute 连接也可能无法匹配 stream route。这些问题源于 Gateway 监听器端口与网关实际监听端口不一致。
按照查看渲染后的控制器配置检查 config.yaml 中实际生效的 listener_port_match_mode。Helm Chart 会显式渲染该字段,因此安装值可能与控制器省略字段时的默认值不同。
当监听器端口匹配注入 server_port 路由变量时,数据面会用实际监听端口(例如 9080、9443 或配置的 stream 端口)评估该值。若 Gateway 监听器使用不同的 Service 对外端口,路由将无法按预期匹配。有关模式触发条件和产品差异,请参阅配置参考。
可使用以下任一方式解决:
- 将
listener_port_match_mode设置为"off",禁用server_port路由变量注入。 - 将网关配置为监听 Gateway 监听器中声明的相同端口。对于 TCPRoute 与 UDPRoute,监听器端口必须等于对应的
stream_proxy端口。