Kubernetes Ingress
一、Ingress 基础概念
1. 什么是 Ingress
Ingress 是 K8s 的7层HTTP/HTTPS代理资源,为Service提供外部访问能力:
- 提供外部可访问URL
- 负载均衡HTTP/HTTPS流量
- SSL/TLS证书终止
- 基于域名虚拟主机
⚠️ Ingress本身不会处理流量 ,需要Ingress控制器 实际完成代理工作;Ingress只是规则配置。 非HTTP/HTTPS协议对外暴露,使用
NodePort/LoadBalancer类型Service。
2. Ingress 控制器
Ingress控制器不会随集群自动部署,需要单独安装。
主流控制器:
- ingress‑nginx(实验使用)
- AWS‑load‑balancer‑controller
- GCE Ingress
ingress‑nginx 工作流程
- 部署 Ingress‑nginx Controller Pod(实际Nginx代理服务)
- 创建 Ingress K8s资源(定义代理规则,等价Nginx配置文件)
- Controller监听APIServer,动态获取Ingress规则
- 将Ingress规则翻译成Nginx配置,写入
/etc/nginx/nginx.conf - reload nginx,使配置生效
3. 部署前置条件
- 集群有LoadBalancer实现(如metallb),给ingress‑nginx控制器分配外部IP
- 部署ingress‑nginx控制器组件
二、Ingress核心资源详解
1. PathType 路径匹配类型(v1版本强制必填)
| PathType | 说明 |
|---|---|
Prefix |
前缀匹配,按/分割路径元素匹配,区分大小写 |
Exact |
完全精确匹配整个url路径,区分大小写 |
ImplementationSpecific |
交给Ingress控制器自行实现匹配逻辑 |
匹配优先级:最长路径优先;同等长度Exact > Prefix
三、Ingress常用实战案例
案例1:多域名虚拟主机(多host)
不同域名转发不同后端服务
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-host-ingress
spec:
ingressClassName: nginx
rules:
- host: webapp01.laoma.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp01
port:
number: 80
- host: webapp02.laoma.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp02
port:
number: 80
案例2:同一域名,多path路径分流
同一个域名不同url路径转发不同服务
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-path-ingress
spec:
ingressClassName: nginx
rules:
- host: www.laoma.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp01
port:
number: 80
- path: /games
pathType: Prefix
backend:
service:
name: webapp02
port:
number: 80
案例3:路径重写(路径裁剪)
场景:访问
/webapp01/xxx,后端接收/xxx,剥离前缀,等价nginx proxy_pass /
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-trimming-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: www.laoma.cloud
http:
paths:
- path: /webapp01/(.*)
pathType: ImplementationSpecific
backend:
service:
name: webapp01
port:
number: 80
- path: /webapp02/(.*)
pathType: ImplementationSpecific
backend:
service:
name: webapp02
port:
number: 80
案例4:TLS证书 + 强制https跳转
- 创建自签名证书secret(老三条)
- Ingress配置tls和强制跳转
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- www.laoma.cloud
secretName: www-tls
rules:
- host: www.laoma.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp01
port:
number: 80