K8s Ingress反向代理设置从零上手
为什么K8s要用Ingress做反向代理
在Kubernetes集群中,Service虽然能暴露端口,但无法直接提供域名、HTTPS、路径重写等高级路由能力。Ingress就是专门干这个的——它像集群的“入口网关”,根据域名和URL路径把外部请求转发到对应的Service上。
对于零基础用户来说,可以把Ingress理解成一款能动态配置的Nginx,但完全由K8s资源对象管理。
动手前的环境检查与准备工作
在配置Ingress之前,你至少需要:
- 一个运行中的K8s集群(版本1.19+,兼容大多数Ingress控制器)
- kubectl已连接到集群
- 集群内有至少两个Service用于验证(例如一个Nginx,一个Apache)
- 域名解析指向你的Worker节点IP(测试时可用curl加Host头绕过)
核心决策:K8s本身不内置Ingress实现,必须安装一个Ingress Controller。
目前最常用的是 Nginx Ingress Controller(官方维护),我们以它为例。
安装命令(Helm方式,推荐):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install my-ingress ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
等待Pod就绪:
kubectl -n ingress-nginx get pods
输出显示 ingress-nginx-controller-xxx 状态为 Running 即可继续。
编写第一条Ingress配置文件
Ingress配置文件使用YAML描述路由规则。
假设我们已有一个名为 web-service 的Service,暴露端口80,我们想让 example.com 的流量到达它。
创建一个 ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
关键点解释:
ingressClassName指定使用我们安装的Nginx Ingress控制器。host字段定义域名,如果省略则匹配所有域名。pathType:Prefix表示前缀匹配;Exact表示精确匹配(生产建议用Prefix,配合rewrite-target)。rewrite-target注解:将所有路径重写为/,这样后端Service无需关注路径前缀。
应用配置:
kubectl apply -f ingress.yaml
踩坑记录:这些配置细节最容易出错
1. 默认后端 vs 自定义后端
如果没有配置任何规则,Ingress会返回404。很多新手以为Ingress会自动容错,其实需要显式写一个 defaultBackend。
2. 跨域问题
前端调用后端接口时如果域名或端口不一致,浏览器会报跨域。可以在Ingress注解中添加CORS配置:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "https://yourfrontend.com"
3. HTTPS证书配置不上
将证书Secret创建好之后,在Ingress的 spec.tls 中引用即可,但注意Secret必须与Ingress在同一命名空间。
4. 路径匹配冲突
如果同时定义了 / 和 /api,/api 会被 / 优先匹配(取决于控制器实现)。建议把更具体的路径放在前面,或者使用 pathType: Exact 来避免。
如何验证你的反向代理已生效
先获取Ingress控制器的对外IP:
kubectl -n ingress-nginx get svc
找到 LoadBalancer 类型的Service的EXTERNAL-IP。
如果没有公网LB,可以使用NodePort临时测试。
测试命令(替换为你的IP和域名):
curl -H "Host: example.com" http://<外部IP>/api
如果返回后端Service的内容,说明反向代理配置成功。
你也可以查看Ingress控制器的日志来排查异常:
kubectl -n ingress-nginx logs deployment/ingress-nginx-controller
遇到 502 Bad Gateway 通常是后端Service的Pod没运行或端口不匹配;404 需要检查path和host是否正确。
总结
本文从零开始完成了K8s Ingress反向代理设置的完整流程:安装Nginx Ingress Controller、编写YAML规则、避开了常见坑点、并验证了效果。
如果你正在处理K8s Ingress反向代理设置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了Ingress,你的K8s集群才算真正具备了生产级的流量入口。