将外部流量从独立的nginx服务路由到kubernetes节点端口服务

将外部流量从独立的nginx服务路由到kubernetes节点端口服务,nginx,kubernetes,Nginx,Kubernetes,目标 我想通过独立的nginx服务和microk8s节点端口服务访问kubernetes仪表板 上下文 我有一台linux服务器。 在此服务器上,有多个正在运行的服务,例如: 微K8S nginx(注意:我没有使用入口,nginx服务独立于microk8s工作) 以下是我正在寻找的工作流程: http://URL/dashboard NGINX服务(从http://URL/dashboard到nodeIpAddress:nodeport) 节点端口服务 kubernetes仪表板服务 问题:

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

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

  • 微K8S
  • nginx(注意:我没有使用入口,nginx服务独立于microk8s工作)
以下是我正在寻找的工作流程:

  • http://URL/dashboard
  • NGINX服务(从http://URL/dashboard到nodeIpAddress:nodeport)
  • 节点端口服务
  • kubernetes仪表板服务
  • 问题: 然而,每次我请求http://URL/dashboard时,我都会收到一个502错误的请求答案,我缺少什么

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


    非常感谢您的帮助。

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

    首先,需要公开Kubernetes仪表板的服务需要指向正确的目标端口,还需要选择正确的Pod(Kubernetes仪表板Pod)

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

    kubectl desribe service <service-name>
    
    请注意尾部的斜杠,即URI,这意味着匹配代理规则的位置被重写为/。这意味着您的\u url/仪表板将成为您的\u url/

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


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

    确实是@AndD,您建议我执行以下命令:

    sudo microk8s kubectl describe service -n kube-system kubernetes-dashboard
    
    为了获得以下信息

    • 标签:k8s app=kubernetes仪表板
    • 目标端口: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)


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

    
    ...
    
    因此,它尝试使用以下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/

    它和铬一起工作。 但firefox没有。(没什么大不了的)

    非常感谢你,安德


    此外,我得到了一个与詹金斯类似的问题,但詹金斯图像包含一个参数,修复了这个问题。 docker run--publish 8080:8080--env JENKINS_OPTS=“--prefix=/subpath”JENKINS/JENKINS

    我本想找到与kubernetesui/dashboard类似的东西,但我没有找到任何东西


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

    如果在仪表板节点端口端点手动执行,它工作吗?当我执行:sudo microk8s kubectl get ep-n kube system kimchi nodeport service>kimchi nodeport service enpoint=时,我假设您希望我使用节点端口服务的集群ip而不是节点ip。当我这样做时,我从nginx配置接收到一个err_emtpy_响应,所有内容都在path/dashboard下,但可能kubernetes dashboard会在/path处预期请求。如果是这种情况,您可以尝试在nginx配置中使用重写目标?很好的尝试,我将位置从/dashboard更改为/,但在使用节点ip地址或节点端口服务群集ip时,我仍然有相同的行为。谢谢您的时间,您能用Descripte(或get with option-oyaml)检查kubernetes仪表板服务吗?要检查Kubernetes仪表板盒是否正在443或其他端口(使用targetPort)上侦听,即使在path/Dashboard/(尾部斜线在末尾)下为Kubernetes仪表板提供服务,是否也会发生这种情况?404错误之一的路径请求是什么?您好,即使是path/dashboard/下的dashboard也不起作用。我刚刚编辑了我的消息来解释html文件的依赖性问题。
    proxy_pass https://51.68.123.169:30000/
    
    <link rel="stylesheet" href="styles.3aaa4ab96be3c2d1171f.css"></head>
    ...
    <script src="runtime.3e2867321ef71252064e.js" defer></script>