无法使用来自浏览器的入口访问我在 k8s 集群上的 grafana 仪表板

Posted

技术标签:

【中文标题】无法使用来自浏览器的入口访问我在 k8s 集群上的 grafana 仪表板【英文标题】:can't reach to my grafana dashboard on k8s cluster using ingress from browser 【发布时间】:2021-11-13 00:02:35 【问题描述】:

我已经使用helm 在我的Kubernetes 集群上安装了PrometheusGrafana

 $helm install prometheus prometheus-community/kube-prometheus-stack

所有podsdeploymentsservices 都已启动并运行。当我像这样使用端口转发时:

kubectl port-forward deployment/prometheus-grafana 3000

我可以使用浏览器访问我的grafana dashboard,但是当我想使用ingress 而不是port-forward 时,响应是:

我无法访问 Grafana 仪表板。


我的ingress yaml 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana-ingress
  namespace: default
spec:
  ingressClassName: kong
  rules:
  - http:
      paths:
      - path: /grafana/login
        pathType: Prefix
        backend:
          service:
            name: prometheus-grafana
            port:
              number: 80

prometheus-grafana 服务 yaml 文件是:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: prometheus
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2021-09-15T11:07:30Z"
  labels:
    app.kubernetes.io/instance: prometheus
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: grafana
    app.kubernetes.io/version: 8.1.2
    helm.sh/chart: grafana-6.16.4
  name: prometheus-grafana
  namespace: default
  resourceVersion: "801373"
  uid: e1f57de9-94d0-460a-a427-4a97fd770e12
spec:
  clusterIP: 10.100.90.147
  clusterIPs:
  - 10.100.90.147
  ports:
  - name: service
    port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app.kubernetes.io/instance: prometheus
    app.kubernetes.io/name: grafana
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: 

【问题讨论】:

Ingress 中的路径 /grafana/login 对我来说有点奇怪。您不应该公开整个 /grafana 路径吗?也许登录页面试图将您重定向到另一个页面但不能,因为没有通往它的路线? 嗨@AndD!整个路径是什么意思?有点像 www.example.com/grafana/login ? 我的意思是,Ingress 只定义了一条路径,/grafana/login,类型为Prefix。 Grafana 肯定会有除/grafana/login 之外的其他路径,所以我首先尝试使用一条路径,/grafana。使用端口转发时,在哪个路径可以打开 grafana 仪表盘?因为 Grafana 可能会期望请求到达相同的路径。 当我使用端口转发时,我可以在 localhost:3000 看到 grafana 仪表板 好的,这就解释了事情。 Grafana 是一个 Web 应用程序,希望直接在服务器的根路径下提供服务。您需要在/ 下将其公开为路径,使用重写目标规则或在主机的子域下提供它。尝试使用路径/ 是否一切都按预期工作。 【参考方案1】:

我已发布社区 wiki 答案以获得更好的可见性。问题已解决,与入口yaml文件有关。

解决方案:

我更改了我的入口文件:添加了 host: grafana.example.com 并将 path 更改为 / 。一切顺利。

解决方案的建议:

我的意思是,Ingress 只定义了一个路径,/grafana/login,类型为 Prefix。 Grafana 肯定会有除/grafana/login 之外的其他路径,所以我首先要尝试的是只使用一条路径,/grafana。使用端口转发时,在哪个路径可以打开 grafana 仪表盘?因为 Grafana 可能会期望请求到达相同的路径。

解释:

Grafana 是一个网络应用程序,它期望直接在服务器的根路径下提供服务。您需要在/ 下将其公开为路径,使用重写目标规则或在主机的子域下提供它。尝试使用路径 / 是否一切都按预期工作,或者不是第一件事

【讨论】:

你好@hesmoh。如果可以解决您的问题,请考虑 accepting the answer。

以上是关于无法使用来自浏览器的入口访问我在 k8s 集群上的 grafana 仪表板的主要内容,如果未能解决你的问题,请参考以下文章

我在两个EC-2实例和仪表板上设置了Kubernetes集群但是我无法在浏览器上访问kubernetes仪表板的ui

使用kubeadm部署k8s集群04-配置kubelet访问kube-apiserver

如何访问k8s集群内部署的mysql服务

k8s基本对象概念

k8s多集群管理

K8S 集群上的 JWKS 轮换