先上一下现在有问题的配置文件吧:
location ^~ /api/ {
#resolver kube-dns.kube-system.svc.cluster.local valid=5s; #don't work
resolver 10.244.64.10;
set $loadurl http://gateway-service.default.svc.cluster.local:55558/;
if ($http_username != "" ) {
set $loadurl http://gateway-service.$http_username.svc.cluster.local:55558/;
}
proxy_pass $loadurl;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cookie_path / /;
}
nginx是启动在k8s的Pod中的,想要的实现的功能:
通过在request的header中添加"username":"test",nginx根据header中的username值test请求转发到对应test命名空间的gateway网关中。
现在问题:
1、resolver 只能用kube-dns的service的clusterIp,无法使用servicename,这也不是什么大问题。
2、主要问题,现在nginx转发时,从日志来看可以将请求转发到指定网关,但是请求的url貌似没有过滤掉一级路径 /api/。
也就是说,proxy_pass使用变量时,默认把变量最后的 “/”给去掉了,
resolver 10.244.64.10;
set $loadurl http://gateway-service.default.svc.cluster.local:55558/;
#使用变量会出现404
proxy_pass $loadurl;
...
#直接写url没有问题
proxy_pass http://gateway-service.default.svc.cluster.local:55558/;
这样导致到达网关的请求是带着 /api/的,网关找不到路由的,最终返回了404。
现在找不到有效的解决办法,求大神指教!
不知道你这个问题是否已经解决, 如果还没有解决的话: