【问题标题】:Route external traffic from a standalone nginx service to kubernetes nodeport service将来自独立 nginx 服务的外部流量路由到 kubernetes nodeport 服务
【发布时间】:2021-05-04 21:05:06
【问题描述】:

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

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

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

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

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

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

配置 nginx配置、节点端口服务配置及microk8s集群状态请看下图:

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

node-port-service configuration

node ip address

microk8s namespaces

非常感谢您的帮助。

【问题讨论】:

  • 如果您在仪表板 NodePort 端点手动进行,它是否有效?
  • 当我执行时: sudo microk8s kubectl get ep -n kube-system kimchi-nodeport-service > kimchi-nodeport-service enpoint = 所以我假设你希望我使用集群-节点端口服务的 ip 而不是节点 ip。当我这样做时,我会收到一个 err_emtpy_response
  • 嗯,从 nginx 配置来看,一切都在路径 /dashboard 下,但可能 kubernetes-dashboard 期望 / 路径下的请求。如果是这种情况,您可以尝试在 nginx 配置中使用 rewrite-target 吗?
  • 不错的尝试,我将位置从 /dashboard 更改为 /,但是当我使用节点 ip 地址或节点端口服务集群 ip 时仍然有相同的行为。谢谢你的时间和D
  • 你能检查一下 kubernetes-dashboard 服务的描述(或带有选项 -oyaml 的获取)吗?检查 Kubernetes Dashboard Pod 是否正在侦听 443 或另一个端口(使用 targetPort)

标签: nginx kubernetes


【解决方案1】:

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

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

为了得到以下这些信息

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

感谢以上信息,我可以修复 nodePort 服务,你可以在下面找到一个 sn-p:

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、资产)。

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

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

非常感谢你!


此外,我遇到了与 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 图像中找到任何参数来处理子路径。

【讨论】:

  • 即使您在路径 /dashboard/ 下提供 Kubernetes 仪表板也会发生这种情况(末尾带有斜杠)? 404 错误之一的路径请求是什么?
  • 您好,即使路径 /dashboard/ 下的仪表板也不起作用。我刚刚编辑了我的消息以解释 html 文件的依赖关系问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2019-02-03
    • 1970-01-01
    • 2020-08-31
    • 2021-05-23
    • 2018-02-27
    相关资源
    最近更新 更多