Ingress 与路由
NodePort 和 LoadBalancer 都能暴露服务,但每个服务都申请一个负载均衡器既贵又不方便。真正生产推荐用 Ingress:它像一个七层网关,按域名和路径把外部流量路由到不同 Service。
ℹ️Ingress 不等于 Ingress Controller
Ingress 只是"路由规则"(YAML);真正干活的是 Ingress Controller(如 nginx-ingress),它运行在集群里,监听 Ingress 规则并配置底层代理。装了 Controller 规则才生效。
1. 为什么需要 Ingress
- 一个公网入口(IP/域名)服务多个应用
- 按路径分流:
/api去后端,/去前端 - 按域名分流:
blog.example.com和shop.example.com指向不同服务 - 还能统一做 TLS 终止、重写、限流
2. 基础 Ingress 示例(按路径)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080💡pathType 三种取值
Prefix(前缀匹配)、Exact(精确匹配)、ImplementationSpecific(由 Controller 决定)。多数场景用 Prefix。
3. 基于域名的路由
spec:
rules:
- host: blog.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: blog, port: { number: 80 } }
- host: shop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: shop, port: { number: 80 } }4. 配置 TLS(HTTPS)
先把证书存进 Secret:
kubectl create secret tls web-tls \
--cert=example.com.crt --key=example.com.keyspec:
tls:
- hosts: ["example.com"]
secretName: web-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: frontend, port: { number: 80 } }⚠️本地没域名也能测
本地可用 kubectl port-forward 或 minikube tunnel 把 Ingress Controller 的端口映射出来,再改 /etc/hosts 把 example.com 指向本地 IP 来验证。
5. 验证 Ingress
kubectl get ingress web-ingress
# ADDRESS 列显示分配到的入口地址
curl -H "Host: example.com" http://<入口IP>/🎯练习
为前几章的 frontend、backend 两个 Service 建一个 Ingress:根路径 / 走 frontend,/api 走 backend,并加上 example.com 的 TLS。用 curl 带 Host 头分别验证两条路由。
小结
- Ingress 是七层路由规则,Ingress Controller 才是执行者
- 支持按路径(pathType)和按域名(host)分流
- 配合 TLS Secret 实现 HTTPS 统一终止
- 下一章学习命名空间与资源配额 →