nginx转发ingress-nginx问题记录

背景

想直接通过域名访问k8s上的服务. 想到k8s上可以直接通过ingress配置. 不过ingress默认启动的端口3xxxxx. 一般不可能让用户访问我们的服务加上端口. 所以现在要解决直接通过80端口访问ingress的问题.

方案

  1. 修改ingress-nginx端口(这个是在网上搜到的方案, 但未选择)

这个要修改k8s配置, 默认k8s上服务是不能开80端口的

  1. 直接在服务器通过docker部署个nginx 80端口, 然后配置这个nginx将所有流量转发到ingress-nginx.

执行过程中遇到的问题:

  • 通过ingress配置转发到后端 – 正常
  • 通过nginx转发到ingress – 正常
  • 通过nginx转发到ingress, 再通过ingress转发到后端 --异常

举个例子: 我ingress 端口是30181, 服务端口是30444(服务有接口/admin), 额外部署的nginx端口80. 域名abc.cn 解析到nginx所在到IP
访问 -> abc.cn:30181 – 正常,直接到了ingress
访问 -> abc.cn:30181/admin – 返回200(正常,通过ingress转发到了服务)
访问 -> abc.cn – 正常,通过nginx转发到了ingress
访问 -> abc.cn/admin – 返回404. 异常, 预期返回200.
通过查看nginx的access.log. 这个请求通过额外部署的nginx转发到了30181端口. 但是查看ingress-nginx的日志, 请求没有进来.

额外部署的nignx 配置如下

  server {
      listen 80;
      server_name abc.cn;
      #server_name _;
      location / {
          proxy_pass http://172.17.0.1:30181;
      }
    }

ingress配置如下
在这里插入图片描述

问题解决:
将 proxy_pass http://172.17.0.1:30181; 改成 proxy_pass http://abc.cn:30181;

原因是ingress转发/admin的条件是servername必须是域名abc.cn (即这里host设置的域名)

由于我这个nginx是通过docker部署的, 还需要再配置下docker容器的dns. 不然我这不能解析成功. (我把原来的nginx删了重新run , 指定了自己的新的resolv.conf

docker run -d -p 80:80 --name nginx --privileged=true -v /cloud/nginx/nginx.conf:/etc/nginx/nginx.conf -v /cloud/nginx/html:/etc/nginx/html -v /cloud/nginx/log:/var/log/nginx -v /cloud/nginx/resolv.conf:/etc/resolv.conf nginx

resolv.conf内容如下

root@f2ee61c77992:/# cat etc/resolv.conf 
nameserver 114.114.114.114
nameserver 8.8.8.8