nginx - 通过nginx ingress controller暴露prometheus web UI的问题
问题描述
我不知道我的案子有什么问题。我在 AKS(Azure 的 k8s)上部署了 Prometheus 服务器,并希望通过入口控制器公开 Prometheus Web UI 以进行以下配置。
我也提到了这个
# Prometheus
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
version: v2.13.1
replicas: 2
retention: 1d
serviceAccountName: prometheus
...
# Service
apiVersion: v1
kind: Service
metadata:
name: prometheus-service
namespace: monitoring
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 9090
selector:
app: prometheus
# Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: nginx
# nginx.ingress.kubernetes.io/ssl-redirect: "false"
# nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
# Just try another subpath make sure the nginx is work
# - backend:
# serviceName: aks-helloworld-one
# servicePort: 80
# path: /hello-world-one
- backend:
serviceName: prometheus-service
servicePort: 80
path: /prometheus
我在测试阶段添加了另一条路径,nginx 为 aks-helloworld-one 成功工作。但是,它不适用于 Prometheus 服务器,我总是得到“404 page not found”作为回报。有谁知道如何解决这个问题?
解决方案
我想我知道问题出在哪里。其实我之前的评论是错误的:
如果它在 / 下可用,则不需要在 ingress 中进行任何重写,它应该可以立即工作。
嗯......实际上它不会有一个简单的原因。当您尝试通过入口访问 Prometheus UI 时,您使用的是<ingress ip>/prometheus
URL。选择/prometheus
路径会将您正确重定向到适当的后端Service
:
- backend:
serviceName: prometheus-service
servicePort: 80
path: /prometheus
但是出现问题是因为/prometheus
路径(您需要被重定向到prometheus-service
并最终重定向到其中一个Pods
,由 this 公开Service
)被转发到Pod
提供实际内容的目标。
您会收到404 page not found
错误消息,因为到达目标 Web 服务器的 http 请求正在声明/prometheus
目录的内容,而不是/
实际提供目录的内容。
因此,如果您将入口更改为以下内容:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- backend:
serviceName: prometheus-service
servicePort: 80
path: /
很可能一切都会按预期工作,您将获得Prometheus UI网站,而不是404 Not found
.
好吧,尽管它可能有效,但它仅用于调试目的,因为没有人想使用ingress只是为了能够在根路径下公开某些内容。
以下入口定义应该可以解决您的问题(是的,在这种情况下需要重写!):
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- backend:
serviceName: prometheus-service
servicePort: 80
path: /prometheus(/|$)(.*)
上面使用的重写将确保在到达目标之前/prometheus
重写原始访问路径。/
Pod
推荐阅读
- python - 如何通过 Pythonnet 修改 StartupPath
- ruby-on-rails - Rails helper_method 可以像在相应视图中调用它一样使用 yield 吗?
- azure-devops - azure devops build: BC40056: Imports 'Microsoft.Office.Interop' 不包含任何公共成员或找不到
- git - C-panel 版本控制无法从 GitHub 拉取
- python - Bootstrap 和 css 在 django 项目中都不能正常工作
- asp.net-core - Blazor 组件分页
- javascript - javascript ("INPUT")[0] <-代码中的 [0] 部分?有人可以解释吗?
- powershell - 如何获得 powershell cmdlet get-adtrust 的扩展输出?
- c - c中的逻辑错误,程序不合理的答案
- c# - 将泛型 func 作为 Linq 表达式 C#