常见问题与解决方案
使用 Ingress Controller 时如果出现问题,通常应先查看网关和控制器日志,因为日志往往可以快速暴露根因。
本文介绍常见问题,并提供实用的排查和解决建议。
GatewayProxy 缺失或配置错误
GatewayProxy 定义 Ingress Controller 与控制面通信时使用的控制面端点和 Admin API key。如果资源没有同步到网关,常见原因是 GatewayProxy 资源缺失或配置错误。
确认 GatewayProxy 资源存在,并创建在正确的命名空间中:
kubectl get gatewayproxy --all-namespaces
如果 GatewayProxy 存在,检查其配置:
kubectl describe gatewayproxy <gatewayproxy-name> -n <namespace>
IngressClassName 缺失或未指定
对于以下资源,只有当 ingressClassName 与控制器配置的 IngressClass 匹配时,Ingress Controller 才会处理:
IngressApisixRouteApisixUpstreamApisixTLSApisixPluginConfigApisixGlobalRuleApisixConsumer
如果 ingressClassName 缺失或指定错误,资源不会同步到网关。
对于 Ingress 资源,控制器会先检查 spec.ingressClassName。如果未设置,则回退到 kubernetes.io/ingress.class 注解;该注解用于向后兼容。
查看当前存在的 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 故障
如果在 Kubernetes 上以使用 etcd 作为配置后端的部署模式运行 APISIX,可能会遇到 etcd Pod 反复重启(CrashLoopBackOff)或无法进入健康状态的问题。将 etcd 作为 Kubernetes StatefulSet 托管会带来运维挑战:Pod 在重启、扩缩容或失去持久化存储访问时可能崩溃,集群成员关系也可能变得不稳定。
因此,通常建议以 独立模式运行 APISIX,该模式不需要 etcd。它可以简化部署,并避免在 Kubernetes 内管理 etcd 集群的复杂性。
如果部署确实需要 etcd,通常更可靠的做法是在 Kubernetes 外的独立虚拟机或专用基础设施上托管 etcd 集群。
跨资源路由优先级
优先级值越高,路由优先级越高。当同时使用多种资源类型(Ingress、HTTPRoute 和 APISIXRoute)时,路由行为可能受到不同资源优先级分配和评估方式的影响。
各资源类型的优先级处理方式如下:
- Ingress:不支持显式路由优先级。由 Ingress 资源生成的路由会被分配默认优先级
0,通常最低。 - HTTPRoute:使用动态计算的 38-bit priority。由于该值由多个属性推导而来,最终优先级不是固定值,也无法可靠预测。
- APISIXRoute:允许显式配置路由优先级。若要保证 APISIXRoute 先于 HTTPRoute 匹配,其优先级必须高于 274,877,906,943(2^38 - 1)。
HTTPRoute Filter 与 PluginConfig
当 HTTPRoute filter 和 PluginConfig CRD 同时应用到同一路由时,可能出现非预期的插件行为。理解二者的交互方式有助于避免配置冲突。
Ingress Controller 会将内置 Gateway API HTTPRoute filter 映射到特定插件:
RequestHeaderModifier映射到proxy-rewriteRequestRedirect映射到redirectRequestMirror映射到proxy-mirrorURLRewrite映射到proxy-rewriteResponseHeaderModifier映射到response-rewriteCORS映射到corsExtensionRef映射到用户定义的插件引用
当 filter 和 PluginConfig CRD 同时应用时:
- 如果先应用 filter,PluginConfig 会覆盖重叠的插件设置。
- 如果先应用 PluginConfig,filter 会与 PluginConfig 设置合并,并且 filter 中的重叠字段优先级更高。