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。