GCE环境下的Ingress是否必须配置defaultBackend字段?
GKE Ingress省略defaultBackend返回503问题说明
该行为是GKE Ingress控制器的未公开实现逻辑导致的:
- K8s官方Ingress规范仅规定,未配置
defaultBackend时,未匹配到任何路由规则的请求由Ingress控制器自行处理,没有强制要求控制器的兜底行为。 - GKE托管的Ingress控制器(基于Google Cloud负载均衡实现)在未显式配置
defaultBackend时,会默认注入一个内部的兜底后端,该后端默认返回503 Server Error。 - 现有配置里使用了
path: /*搭配pathType: ImplementationSpecific的规则,在没有显式defaultBackend的场景下,会触发GKE Ingress的规则解析异常,导致所有请求(包括匹配了host规则的请求)都被误路由到这个默认兜底后端,所以所有服务都会返回503。
修复方案
- 最简方案:保留显式
defaultBackend配置即可,哪怕指向现有规则里的任意一个可用服务,只要配置了该字段,GKE Ingress控制器就能正常解析配置的host路由规则。 - 可选方案:如果确实不想配置
defaultBackend,可以把所有路径规则从/*修改为/,pathType改为Prefix,也可以规避该解析异常问题,但要注意匹配范围是否符合业务需求。
当前注释了defaultBackend的配置如下,取消对应字段的注释即可恢复正常:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: #defaultBackend: # service: # name: test-nginx # port: # number: 80 rules: - host: test.example.com http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: test-nginx port: number: 80 - host: test2.example.com http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: test2 port: number: 80
内容的提问来源于stack exchange,提问作者Dzmitry Lazerka
相关产品推荐
相关产品推荐

