首页 > 解决方案 > 将来自独立 nginx 服务的外部流量路由到 kubernetes nodeport 服务

问题描述

目标 我想通过独立的 nginx 服务和 microk8s 节点端口服务访问 kubernetes 仪表板。

上下文 我有一个 linux 服务器。在此服务器上,有几个正在运行的服务,例如:

这是我正在寻找的工作流程:

  1. http:// 网址 /dashboard
  2. NGINX 服务(从 http:// URL /dashboard 到 nodeIpAddress:nodeport)
  3. 节点端口服务
  4. Kubernetes 仪表板服务

问题: 但是,每次我请求 http:// URL /dashboard 时,我都会收到502 错误的请求答案,我错过了什么?

CONFIGURATION 请在下面找到,nginx 配置,节点端口服务配置和 microk8s 集群的状态:

nginx 配置:/etc/nginx/site-availables/default

节点端口服务配置

节点ip地址

microk8s 命名空间

非常感谢您的帮助。

标签: nginxkubernetes

解决方案


我将在这里总结整个问题和解决方案。

首先,需要暴露 Kubernetes Dashboard 的服务需要指向正确的目标端口,还需要选择正确的 Pod(kubernetes-dashboard Pod)

如果您通过以下方式检查您的服务:

kubectl desribe service <service-name>

通过查看 Endpoints 部分,您可以轻松查看它是选择一个 Pod(或多个 Pod)还是什么都不选。通常,您的服务应该具有与标准 kubernetes-dashboard 服务相同的选择器、端口、targetPort 等(它公开了仪表板,但仅在集群内部)

其次,您的 NGINX 配置将位置 /dashboard 代理到服务,但问题是 kubernetes-dashboard Pod 期望请求直接到达 /,因此路径 /dashboard 对它没有任何意义。

要解决第二个问题,有几种方法,但都在于 NGINX 配置。如果您阅读了模块代理的文档(又名http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass),您可以看到解决方案是在配置中添加一个 URI,如下所示:

proxy_pass https://51.68.123.169:30000/

注意尾部的斜杠,即URI,表示匹配代理规则的位置被改写为/。这意味着 your_url/dashboard 将成为 your_url/

如果没有尾部斜杠,您的位置将按原样传递给目标,因为目标只是端点。

如果您需要更复杂的 URI 更改,您正在搜索的是重写规则(它们支持正则表达式等等),但添加尾部斜杠应该可以解决您的第二个问题。


推荐阅读