Nginx 入口未正确解析 kube-prometheus-stack 的路径
Nginx ingress is not resolving path properly for kube-prometheus-stack
我使用演示应用程序创建了简单的 kubernetes 集群。
创建集群时,我使用 helm 安装了 prometheus-stack 和 nginx-ingress-controller(默认值文件)。
设置集群后,我创建 Ingress 对象以公开 prometheus、grafana 和 alertmanager:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: monitoring-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /prometheus(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-operated
port:
number: 9090
- path: /alertmanager(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-alertmanager
port:
number: 9093
- path: /grafana(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-stack-grafana
port:
number: 80
当我尝试通过 <ingress-controller's external IP>/prometheus
访问 prometheus 时,它解析为 <ingress-controller's external IP>/graph
并显示 404 - 找不到页面。
如果我使用 kubectl port-forward svc/prometheus-operated 9090:9090 -n monitoring
我可以毫无问题地访问 prometheus。
我可以通过 <ingress-controller's external IP>/alertmanager
访问 alertmanager。路径解析为<ingress-controller's external IP>/alertmanager/#/alerts
我怀疑路径重写有问题,但不知道是什么。
请帮忙...
最后我找到了 2 个解决这个问题的方法。
选项 1
我在 azure 中有一个 DNS 区域(我的集群也在那里),我在那里添加了指向入口控制器外部 IP 的 grafana、prometheus 和 alertmanager 的子域。
当使用 Helm Chart 部署 kube-prometheus-stack 时,我在 values.yaml 文件中为 prometheus 提供了默认根路径,配置如下:
prometheus:
prometheusSpec:
externalUrl: http://prometheus.mydomainname.something
(例如 Prometheus)的 Ingress 清单需要包含主机地址并且仅包含根路径“/”。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-new
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: prometheus.mydomainname.something
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-prometheus
port:
number: 9090
选项 2
您还可以为 kube-prometheus-stack(prometheus、grafana、alertmanager)中的每个应用程序提供默认路径,如:
prometheus:
prometheusSpec:
externalUrl: http://mydomainname.something/prometheus
并使 Ingress 清单根据以下路径进行重定向:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-new
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /prometheus
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-prometheus
port:
number: 9090
我使用演示应用程序创建了简单的 kubernetes 集群。 创建集群时,我使用 helm 安装了 prometheus-stack 和 nginx-ingress-controller(默认值文件)。
设置集群后,我创建 Ingress 对象以公开 prometheus、grafana 和 alertmanager:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: monitoring-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /prometheus(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-operated
port:
number: 9090
- path: /alertmanager(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-alertmanager
port:
number: 9093
- path: /grafana(/|$)(.*)
pathType: Prefix
backend:
service:
name: prometheus-stack-grafana
port:
number: 80
当我尝试通过 <ingress-controller's external IP>/prometheus
访问 prometheus 时,它解析为 <ingress-controller's external IP>/graph
并显示 404 - 找不到页面。
如果我使用 kubectl port-forward svc/prometheus-operated 9090:9090 -n monitoring
我可以毫无问题地访问 prometheus。
我可以通过 <ingress-controller's external IP>/alertmanager
访问 alertmanager。路径解析为<ingress-controller's external IP>/alertmanager/#/alerts
我怀疑路径重写有问题,但不知道是什么。
请帮忙...
最后我找到了 2 个解决这个问题的方法。
选项 1
我在 azure 中有一个 DNS 区域(我的集群也在那里),我在那里添加了指向入口控制器外部 IP 的 grafana、prometheus 和 alertmanager 的子域。
当使用 Helm Chart 部署 kube-prometheus-stack 时,我在 values.yaml 文件中为 prometheus 提供了默认根路径,配置如下:
prometheus:
prometheusSpec:
externalUrl: http://prometheus.mydomainname.something
(例如 Prometheus)的 Ingress 清单需要包含主机地址并且仅包含根路径“/”。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-new
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: prometheus.mydomainname.something
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-prometheus
port:
number: 9090
选项 2
您还可以为 kube-prometheus-stack(prometheus、grafana、alertmanager)中的每个应用程序提供默认路径,如:
prometheus:
prometheusSpec:
externalUrl: http://mydomainname.something/prometheus
并使 Ingress 清单根据以下路径进行重定向:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-new
namespace: monitoring
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /prometheus
pathType: Prefix
backend:
service:
name: prometheus-stack-kube-prom-prometheus
port:
number: 9090