defaultbackend是ingress中处理未匹配任何rules请求的兜底服务,需手动部署service与deployment,配置在spec.defaultbackend下,指定service名称和端口,所有不满足host+path规则的流量均转发至此。

在 Kubernetes Ingress 中,全局默认后端(defaultBackend)用于兜底处理所有未被任何 rules 匹配的 HTTP 请求——比如访问了错误域名、不存在的路径,或请求头中 Host 字段不匹配任何 rule。它不是可选配置项,而是 Ingress 规范中明确要求的兜底机制。
defaultBackend 是什么
它是一个嵌套在 ingress.spec 下的对象,指定一个 Service 和端口,所有未命中任何路由规则的流量都会被转发至此。注意:它不依赖 host 或 path 匹配逻辑,只起兜底作用。
- 仅当 Ingress 中未定义任何
rules时,defaultBackend是必需的 - 即使定义了 rules,只要某次请求不满足任一 rule 的 host + path 组合,仍会落到 defaultBackend
- 典型场景包括:用户直接用 IP 访问、输错域名、访问根路径但没配
path: /规则
如何在 Ingress 资源中声明 defaultBackend
使用标准 YAML 声明即可,无需额外注解或控制器特殊配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
spec:
defaultBackend:
service:
name: default-http-backend
port:
number: 80
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-svc
port:
number: 80
上面配置中,所有访问 app.example.com 但路径不是 /api 开头的请求,以及访问任意其他域名(如 xxx.com 或直接 IP)的请求,都会被送到 default-http-backend 这个 Service。
必须提前部署 default-http-backend Service
Ingress 控制器本身不会自动创建这个后端服务。你需要手动部署一个可用的 Service + Deployment,常见做法是复用社区提供的轻量镜像:
- 官方推荐镜像:
k8s.gcr.io/defaultbackend-amd64:1.5(已归档)或当前维护的替代镜像,如us.gcr.io/k8s-artifacts-prod/ingress-nginx/defaultbackend-amd64:v1.5 - 需确保该 Deployment 的 Pod 正常运行、有 Ready 状态,且关联的 Service 的
selector能正确匹配 - Service 必须与 Ingress 在同一命名空间,或使用
service.namespace显式跨命名空间引用(v1.22+ 支持)
验证 defaultBackend 是否生效
最直接的方式是用 curl 测试未覆盖的请求:
- 访问一个不存在的 host:
curl -H "Host: fake.example.com" http://<ingress-ip></ingress-ip>→ 应返回 default-http-backend 的响应(如 200 + “default backend”) - 访问已配置 host 但路径不匹配:
curl http://app.example.com/healthz(若 rules 中无/healthz)→ 同样应落入 defaultBackend - 检查 Ingress Controller 日志(如 nginx-ingress-controller Pod)中是否有
no server matching host或no route found类提示,随后出现转发到 default backend 的记录











