在Kubernetes入口之前的Nginx反向代理

时间:2019-02-07 19:35:06

标签: nginx kubernetes kubernetes-ingress

我们正在运行一个6节点的裸机K8s集群(3节点的控制和3节点的计算平面)。入口已部署,并且对于基于路径的路由运行良好。最近,我们在Ingress前面建立了HA负载均衡集群,以实现Ingress本身的高可用性。

+---------------+       +---------+      +---------+
| Loadbalancers |  -->  | Ingress |  --> | Jenkins |
+---------------+       +---------+      +---------+

负载平衡器基本上以带有浮动IP地址的反向代理模式运行nginx,该IP地址具有带通配符的DNS A类型记录:

*.cnk8sv.infra A <private-IP>

但是,在此设置中,我们无法应用基于虚拟主机的路由。在这种模式下,Ingress规则不会捕获任何流量。我怀疑K8前面的nginx会在HTTP标头中丢弃一些信息,因此Ingress控制器无法执行基于主机的路由。

这是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;
   }

Ingress对象:

spec:
  rules:
  - host: jenkins.cnk8sv.infra
    http:
      paths:
      - backend:
          serviceName: jenkins
          servicePort: 8080
        path: /

在规则中删除主机过滤器后,流量便开始流动(因此,后端已启动并正在运行)。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

解决方法是在nginx配置中将X-Forwarded-Proto的值更改为http,因为我们将Ingress定位在端口80,即HTTP。