Ingress 与 Ingress Controller

一个集群往往有多个 HTTP 服务,若都开 NodePort,端口混乱且难以按域名/路径分流。Ingress 是一组「外部 HTTP(S) 流量如何路由到 Service」的规则,它处于 Service 之前,按域名和路径把请求分发给不同后端,是集群统一的流量入口。

与 Service、NodePort 的分工

Ingress 外部访问链路

  • 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」链路逐层排查。

笔记加载中…