【发布时间】:2018-08-18 19:34:52
【问题描述】:
基本上,我们已经将一组微服务部署到托管在 AWS 中的 kubernetes 集群中。我们想通过 nginx 中的网关配置来运行这些。
我们当前不起作用的配置看起来像这样-
upstream some-api1 {
server some-api1:80;
}
upstream some-api2 {
server some-api2:80;
}
upstream some-api3 {
server some-api3:80;
}
server {
listen 80;
server_name gateway.something.com;
location /api1 {
proxy_pass http://some-api1;
}
location /api2 {
proxy_pass http://some-api2;
}
location /api3 {
proxy_pass http://some-api3;
}
}
我们的服务是使用 dotnet core 构建的,因此底层 url 类似于 http://some-api1/{api/controllername} 。当我尝试通过邮递员访问这些端点时,我总是收到 404,这告诉我它无法解析这些映射。
但是,我可以使用像这样的 api 的显式配置来访问集群中的 api(这是我不想做的)-
server {
listen 80;
server_name someapi1.something.com;
location /{
proxy_pass http://some-api1;
}
}..
如果有人可以阐明配置的问题或推荐最佳方法,将不胜感激。
【问题讨论】:
-
你得到普通的 404 还是 nginx 默认后端 404? nginx是如何暴露给集群外的(NodePort?LoadBalancer?)?您是否有带有服务名称的 Kubernetes 服务描述符?如果您可以包含“kubectl get services --all-namespaces”的输出,这可能会有所帮助。
-
您似乎还需要将路径添加到
proxy_pass:proxy_pass http://some-api3/api3;,如果您还想传递查询参数,那么这将是:proxy_pass http://some-api3/api3$is_args$args; -
@Ryan - 感谢您的反馈!我刚刚更新了原帖。我仔细检查了集群服务描述符,那里的一切似乎都很好。作为概念证明,我能够使用我的编辑中描述的显式配置通过邮递员访问一个 api。您可能正在了解有关 ingress 的问题,我需要进一步研究。我希望这将是我缺少的 nginx 中的一个简单配置。
-
@Zakaria - 感谢您的建议。我确实尝试过你提到的这似乎也没有什么不同。正如我在更新的帖子中提到的那样,我能够使用显式 / 映射通过邮递员访问 api。
-
如果我理解正确你想要达到什么目的,我认为你可以用重写指令来解决这个问题。试试:
location /api1 {rewrite /api1/(.*) /$1 break; proxy_pass http://some-api1;}。其他代理通行证也是如此。
标签: nginx kubernetes .net-core