Ingress 是什么
Ingress 是七层入口的路由规则对象:按域名与路径把 HTTP 与 HTTPS 请求分发到不同的后端服务。它本身只是一份声明,必须由 Ingress Controller 读取并落成真实的代理配置才会生效。集群里没装控制器时,创建对象不会报错,但流量一点都不会变——这是最常见的「配了不生效」原因。
它和 Service 的关系
Service 工作在四层,只认地址与端口;Ingress 在它之上按主机名和路径做分发,后端依然指向 Service。TLS 终止通常在控制器这一层完成,证书来自同命名空间的 Secret。所以一条完整的外部访问链路是:外部流量进控制器,按规则找到 Service,再由 Service 转给后端 Pod。
基本信息
| 适用环境 | Kubernetes 1.19 以上使用 networking.k8s.io/v1,更早版本为 v1beta1 |
|---|---|
| 生效前提 | 集群里已部署对应的 Ingress Controller |
| 后端对象 | 同命名空间内的 Service 及其端口 |
| TLS 支持 | 通过 spec.tls 引用证书 Secret,由控制器完成终止 |
| 关键字段 | ingressClassName、rules、pathType、backend、tls |
| 权限要求 | 命名空间内对 ingress 资源具备增删改查权限 |
典型使用场景
- 多域名共用入口:一个对外地址承载多个业务域名,按主机名分发
- 路径分版本:同一个域名下按路径前缀把流量分给不同服务
- 统一 TLS 终止:证书集中存放在 Secret,由入口层统一处理
- 灰度切流:新增一条规则把部分请求导向新版本服务
- 内外部隔离:只把需要对外暴露的服务写入路由规则
- 迁移过渡:旧服务与新服务同时在规则里并存,逐步调整权重与路径
Ingress 清单
Ingress 清单
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ing
namespace: prod
spec:
ingressClassName: nginx # 指定由哪个控制器实现
tls:
- hosts: [app.example.com]
secretName: app-tls # 证书 Secret,需与本对象同命名空间
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix # 前缀匹配
backend:
service:
name: web
port:
number: 80查看与验证
查看与验证
kubectl get ingress -n prod # 看是否分配到入口地址
kubectl describe ingress web-ing -n prod # 看规则解析与后端端点情况
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller --tail=50 # 看控制器侧报错
curl -H 'Host: app.example.com' http://<入口地址>/ # 绕过 DNS 直接验证路由关键字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| ingressClassName | 指定实现该规则的控制器类别 | 写错或缺失时规则无人读取,完全不生效 |
| rules.host | 匹配的域名 | 与请求头主机名不一致会落到默认后端或返回 404 |
| path 与 pathType | 路径匹配方式与前缀 | 类型选错会出现本应匹配的路径不匹配 |
| backend.service | 转发的后端服务与端口 | 服务不存在或端口写错时返回 503 |
| tls.secretName | 证书来源 | 证书缺失或域名不匹配时握手失败 |
路径类型对照
| 类型 | 匹配规则 |
|---|---|
| Exact | 路径完全一致才匹配 |
| Prefix | 按路径段前缀匹配,最常用 |
| ImplementationSpecific | 由控制器自行解释,跨实现不可移植 |
没有部署控制器时,Ingress 对象创建成功也没有任何效果,排查「域名不通」第一步先确认控制器是否在运行。
后端服务端口写错或端点为空时,控制器通常返回 503 而不是 404;据此可以快速区分「路由没匹配上」与「后端不可用」。
证书 Secret 必须与 Ingress 处于同一命名空间,控制器通常只在自身命名空间或指定命名空间内查找证书,跨命名空间引用会失败。
与四层暴露方式的选择
- 只需要暴露一个非 HTTP 端口:用 NodePort 或负载均衡类型的服务更直接
- 需要按域名与路径分发、需要统一处理证书:用 Ingress 更省资源
- 需要更复杂的流量治理策略:可考虑网关类方案,能力更强但组件也更多