Grafana HTTP Error Bad Gateway 和 Templating init failed 错误

Grafana HTTP Error Bad Gateway and Templating init failed errors

在本地 minikube 上使用 helm 安装 PrometheusGrafana

$ helm install stable/prometheus
$ helm install stable/grafana

Prometheus 服务器,alertmanager grafana 可以 运行 设置端口转发后:

$ export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace default port-forward $POD_NAME 9090

$ export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace default port-forward $POD_NAME 9093

$ export POD_NAME=$(kubectl get pods --namespace default -l "app=excited-crocodile-grafana,component=grafana" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace default port-forward $POD_NAME 3000

从 grafana 添加数据源,出现 HTTP Error Bad Gateway 错误:

从以下位置导入仪表板 315:

https://grafana.com/dashboards/315

然后检查Kubernetes cluster monitoring (via Prometheus),得到Templating init failed错误:

为什么?

在Grafana的HTTP设置中你将Access设置为Proxy,这意味着Grafana要访问Prometheus。由于Kubernetes使用的是overlay网络,所以是不同的IP。

有两种解决方法:

  1. 设置AccessDirect,浏览器直接连接Prometheus
  2. 使用Kubernetes内部IP或域名。我不知道 Prometheus Helm-chart,但假设有一个名为 prometheusService,类似 http://prometheus:9090 的东西应该可以工作。

我关闭了设备上的防火墙,post 在 URL 上添加 http://prometheus:9090 没有抛出网关错误。

我一直找不到“合适”的修复方法,但我找到了解决方法:

apiVersion: v1
kind: Service
metadata:
  labels:
    prometheus: k8s
  name: prometheus-k8s
  namespace: monitoring
spec:
  selector:
    app: prometheus
    prometheus: k8s
  sessionAffinity: ClientIP
  clusterIP: None

通过将 clusterIP 设置为 None,服务更改为“无头”模式,这意味着请求将直接发送到 pods 中的随机一个 service/cluster。更多信息在这里:https://kubernetes.io/docs/concepts/services-networking/service/#headless-services

可能有更好的解决方案,但这是我发现的唯一真正适合我的解决方案 kube-prometheus。 (我试过 docker-desktop、k3d 和 kind,它们都有同样的问题,所以我怀疑这是模拟器的错;我将我的配置剥离到基本上只有 kube-prometheus,所以它是很难理解问题出在哪里,但是哦。)