将外部流量从独立的 nginx 服务路由到 kubernetes nodeport 服务

时间:2021-01-31 14:03:06

标签: nginx kubernetes

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

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

  • microk8s
  • nginx(注意:我没有使用 ingress,nginx 服务独立于 microk8s 工作)。

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

  1. http:// URL /dashboard
  2. NGINX 服务(从 http:// URL /dashboard 到 nodeIpAddress:nodeport)
  3. nodePort 服务
  4. kubernetes 仪表板服务

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

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

nginx configuration: /etc/nginx/site-availables/default

node-port-service configuration

node ip address

microk8s namespaces

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

kubectl desribe service <service-name>

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

其次,您的 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 更改,您要搜索的是重写规则(它们支持正则表达式等等),但添加尾部斜杠应该可以解决您的第二个问题。

答案 1 :(得分:0)

确实@AndD,你建议我执行这个命令:

sudo microk8s kubectl describe service -n kube-system kubernetes-dashboard

为了获得以下这些信息

  • 标签:k8s-app=kubernetes-dashboard
  • 目标端口:8443/TCP

由于以上信息,我可以修复 nodePort 服务,您可以在下面找到一个片段:

spec:
  type: NodePort
  k8s-app: 'kubernetes-dashboard'
ports:
 - protocol: TCP
  port: 8443
  targetPort: 8443
  nodePort: 30000

但是,我确实将 nginx 配置更改为

proxy_pass https://51.68.123.169:30000/

我确实收到了成功的响应 (html),然后所有剩余的请求都有 404 状态(js、css、assets)。

http 404


编辑

html 文件包含一组依赖(js/img/css)

<link rel="stylesheet" href="styles.3aaa4ab96be3c2d1171f.css"></head>
...
<script src="runtime.3e2867321ef71252064e.js" defer></script>

因此它尝试使用这些 URL 获取这些资产:

  • https::// URL/styles.3aaa4ab96be3c2d1171f.css
  • https::// URL/runtime.3e2867321ef71252064e.js

而不是使用:

  • https::// URL/dashboard/styles.3aaa4ab96be3c2d1171f.css
  • https::// URL/dashboard/runtime.3e2867321ef71252064e.js

编辑#2

我刚刚再次将子路径 => dashboad/ 更改为 dash/

new nginx conf

它适用于铬。 但它不与火狐。 (没什么大不了的)

非常感谢AndD!


此外,我在 jenkins 上遇到了类似的问题,但是 jenkins 图像包含一个可以解决该问题的参数。 docker run --publish 8080:8080 --env JENKINS_OPTS="--prefix=/subpath" jenkins/jenkins

我期待找到与 kubernetesui/dashboard 类似的东西,但我没有找到任何东西 https://hub.docker.com/r/kubernetesui/dashboard

https://github.com/kubernetes/dashboard

好吧,我不知道如何很好地配置 nginx 以便在子路径中正确显示仪表板,而且我在 kubernetes\dashboard 图像中没有找到任何参数来处理子路径。