Kubernetes Ingress 前面的 Nginx 反向代理
Nginx reverse proxy in front of a Kubernetes Ingress
我们运行正在构建一个 6 节点 bare-metal K8s 集群(3 节点控制和 3 节点计算平面)。入口已部署,并且适用于 path-based 路由。最近我们在 Ingress 前面搭建了一个 HA-loadbalancing 集群,以实现 Ingress 本身的 high-availability。
+---------------+ +---------+ +---------+
| Loadbalancers | --> | Ingress | --> | Jenkins |
+---------------+ +---------+ +---------+
负载均衡器基本上 运行 nginx 处于反向代理模式,浮动 IP 地址具有带通配符的 DNS A-type 记录:
*.cnk8sv.infra A <private-IP>
然而,在此设置中,我们无法应用 virtual-host-based 路由。在这种模式下,入口规则不会捕获任何流量。我怀疑 K8s 前面的 nginx 在 HTTP headers 中丢弃了一些信息,因此 Ingress 控制器无法执行 host-based 路由。
这是 nginx 负载均衡器的配置:
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
入口object:
spec:
rules:
- host: jenkins.cnk8sv.infra
http:
paths:
- backend:
serviceName: jenkins
servicePort: 8080
path: /
一旦我们删除规则中的主机过滤器,流量就会开始流动(是的,后端已启动并且 运行ning)。任何帮助将不胜感激。
解决方法是将 nginx 配置中的 X-Forwarded-Proto
值更改为 http
,因为我们的目标是端口 80 的 Ingress,即 HTTP。
我们运行正在构建一个 6 节点 bare-metal K8s 集群(3 节点控制和 3 节点计算平面)。入口已部署,并且适用于 path-based 路由。最近我们在 Ingress 前面搭建了一个 HA-loadbalancing 集群,以实现 Ingress 本身的 high-availability。
+---------------+ +---------+ +---------+
| Loadbalancers | --> | Ingress | --> | Jenkins |
+---------------+ +---------+ +---------+
负载均衡器基本上 运行 nginx 处于反向代理模式,浮动 IP 地址具有带通配符的 DNS A-type 记录:
*.cnk8sv.infra A <private-IP>
然而,在此设置中,我们无法应用 virtual-host-based 路由。在这种模式下,入口规则不会捕获任何流量。我怀疑 K8s 前面的 nginx 在 HTTP headers 中丢弃了一些信息,因此 Ingress 控制器无法执行 host-based 路由。
这是 nginx 负载均衡器的配置:
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
入口object:
spec:
rules:
- host: jenkins.cnk8sv.infra
http:
paths:
- backend:
serviceName: jenkins
servicePort: 8080
path: /
一旦我们删除规则中的主机过滤器,流量就会开始流动(是的,后端已启动并且 运行ning)。任何帮助将不胜感激。
解决方法是将 nginx 配置中的 X-Forwarded-Proto
值更改为 http
,因为我们的目标是端口 80 的 Ingress,即 HTTP。