Ingress 是什么
Ingress 是集群的七层入口规则:按域名与路径把集群外的 HTTP(S) 流量路由到内部 Service,并可在同一处配置 TLS 终止。要点在于 Ingress 本身只是规则对象,真正干活的是 Ingress Controller——没有部署 Controller 时,Ingress 只是一份躺在集群里、谁也不会执行的配置。
基本信息
| apiVersion | networking.k8s.io/v1,早期写法已从稳定 API 中移除 |
|---|---|
| 规则结构 | rules 下的 host 与 http.paths,pathType 取 Prefix 或 Exact |
| TLS | tls 段引用承载证书的 Secret,由 Controller 完成 HTTPS 终止 |
| 执行者 | 需部署 Ingress Controller,如 nginx、traefik 或云厂商实现 |
| 演进方向 | Gateway API 是新一代入口方案,能力更强 |
典型使用场景
- 统一入口:多个服务共用一个域名,按路径分发到不同后端
- 多域名托管:一台入口承载多个域名的站点,证书分别绑定
- 灰度切流:通过注解控制权重或规则,把部分流量导向新版本
- 强制 HTTPS:在入口完成证书终止与跳转配置
- 内网暴露:仅对内网域名提供路由,不占用公网地址
Ingress 示例
Ingress 示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # 注解与控制器绑定
spec:
ingressClassName: nginx # 指定由哪个控制器实现
tls:
- hosts: ["app.example.com"]
secretName: app-example-tls # 证书来自 tls 型 Secret
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix # 前缀匹配,必须显式声明
backend:
service:
name: web
port:
number: 80常见路径类型
| pathType | 匹配方式 | 适用 |
|---|---|---|
| Prefix | 按路径前缀匹配 | 整站路由,最常用 |
| Exact | 完全相等才匹配 | 单一路径精确转发 |
| ImplementationSpecific | 交由控制器解释 | 依赖具体控制器实现,可移植性差 |
没有 Ingress Controller 时 Ingress 不会生效:如果 kubectl get ingress 显示的地址栏为空,通常就是没有控制器在实现这些规则。
注解是与控制器强绑定的:rewrite、超时、限流这类能力都靠注解实现,换一个控制器后这些配置可能全部失效,迁移前要逐条核对。
排障顺序建议
- 先确认 Service 与后端 Pod 本身可用:直接访问 Service 或转发端口验证
- 再看 Ingress 规则:域名、路径与后端端口是否与实际一致
- 然后看控制器:日志里是否收到规则、是否报解析或证书错误
- 最后看链路:负载均衡或云厂商入口是否把流量送到了控制器
- 顺序反了容易白折腾:应用不通却在反复改路由规则