nginx - 将来自独立 nginx 服务的外部流量路由到 kubernetes nodeport 服务
问题描述
目标 我想通过独立的 nginx 服务和 microk8s 节点端口服务访问 kubernetes 仪表板。
上下文 我有一个 linux 服务器。在此服务器上,有几个正在运行的服务,例如:
- microk8s
- nginx(注意:我没有使用入口,nginx 服务独立于 microk8s 工作)。
这是我正在寻找的工作流程:
- http:// 网址 /dashboard
- NGINX 服务(从 http:// URL /dashboard 到 nodeIpAddress:nodeport)
- 节点端口服务
- Kubernetes 仪表板服务
问题: 但是,每次我请求 http:// URL /dashboard 时,我都会收到502 错误的请求答案,我错过了什么?
CONFIGURATION 请在下面找到,nginx 配置,节点端口服务配置和 microk8s 集群的状态:
nginx 配置:/etc/nginx/site-availables/default
非常感谢您的帮助。
解决方案
我将在这里总结整个问题和解决方案。
首先,需要暴露 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 更改,您正在搜索的是重写规则(它们支持正则表达式等等),但添加尾部斜杠应该可以解决您的第二个问题。
推荐阅读
- javascript - 导出默认{名称}和命名导出{名称}之间的区别
- python - AWS Glue python Shell 库导入错误 (pyodbc)
- python - 为什么我的龙卷风应用程序不起作用?(带 aiomysql 的龙卷风博客)
- html - 我可以在 GitLab 上渲染 HTML 吗?
- mysql - 如何在查询中使用变量
- c# - 如何在 linq 中编写此 C# 语句
- r - optimParallel 找不到 Rcpp 函数
- java - 谷歌播放权限政策中的“设备上的助理处理程序”是什么意思?
- amazon-web-services - 如何阻止对 AWS EC2 实例中文件夹中文件的访问?
- swift - 如何在 iOS-Charts 框架中只显示一定数量的标签