Ingress 与 Ingress Controller
一个集群往往有多个 HTTP 服务,若都开 NodePort,端口混乱且难以按域名/路径分流。Ingress 是一组「外部 HTTP(S) 流量如何路由到 Service」的规则,它处于 Service 之前,按域名和路径把请求分发给不同后端,是集群统一的流量入口。
与 Service、NodePort 的分工
- Service:集群内部的负载均衡与服务发现,只解决「谁提供这个服务」。
- NodePort/LoadBalancer:把流量送进集群,解决「端口怎么进来」。
- Ingress:站在最外层做应用层路由,按 host、path 把进来的请求分给不同 Service。
一句话:Service 对集群内负责,Ingress 对集群外负责,两者配合使用。
Ingress Controller 是什么
Ingress 只是一份声明规则,必须有人执行才有意义,执行者就是 Ingress Controller——一个 watch Ingress 资源、把规则翻译成实际代理配置(如 Nginx)的常驻组件。常见实现有 nginxinc/kubernetes-ingress、社区 kubernetes-ingress(ingress-nginx)等;部署清单通常来自各项目官方文档:
kubectl get pods -n ingress-nginx
# 输出:NAME READY STATUS
# ingress-nginx-controller-7d6f9xxxx 1/1 Running
kubectl get ingressclass
# 输出:NAME CONTROLLER PARAMETERS
# nginx k8s.io/ingress-nginx <none>
编写 Ingress:networking.k8s.io/v1
用 v1 稳定版 API 声明域名路由、路径前缀与后端 Service:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx # 指明用哪个 Controller
rules:
- host: www.example.com # 按域名路由
http:
paths:
- path: /api
pathType: Prefix # 前缀匹配
backend:
service:
name: api-svc
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port:
number: 80
pathType 还有 Exact(精确匹配);不写 host 表示匹配所有域名。启用 HTTPS 时在 spec.tls 中声明 secretName,Controller 会自动加载证书终止 TLS。
常用注解
注解由具体 Controller 解释,以 ingress-nginx 为例,最常用的是路径重写与限流:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 # 去掉前缀重写
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /api(/|$)(.*) # 捕获后半段
pathType: ImplementationSpecific
backend:
service:
name: api-svc
port:
number: 8080
rewrite-target 配合正则路径可实现「/api/users 转发成 /users」;限流如 nginx.ingress.kubernetes.io/limit-rps: "10" 限制每个来源 IP 每秒请求数。
常见问题:404 从哪来
- 规则写了对但 404:后端路径对不上(rewrite 未生效)、Controller 版本不支持某注解、Service 端口指错。
- 规则没生效:ingressClassName 与 Controller 不匹配,或根本没有部署 Controller——只建 Ingress 资源不会产生任何路由。
- 排查顺序:kubectl get ingress 看规则 → 集群内 curl Service 验证后端通不通 → 再查 Controller 日志。
小结:Ingress 声明路由规则,Ingress Controller 负责落地;networking.k8s.io/v1 里写 host/path 路由,注解按控制器文档选用,404 时按「Ingress → Service → Pod」链路逐层排查。