不使用Helm,如何通过Ingress反向代理Grafana(节点IP访问)
解决Grafana反向代理子路径重定向404问题
问题核心
你的Ingress rewrite规则本身没问题,但Grafana未感知到自己运行在/grafana子路径下,生成重定向URL时会直接指向/login而非/grafana/login,导致404错误。必须同时配置Grafana的子路径支持和Ingress转发规则。
解决方案
1. 给Grafana添加子路径配置
修改Grafana的ConfigMap或Deployment环境变量,让它知道外部访问的子路径:
方式一:通过ConfigMap配置
apiVersion: v1 kind: ConfigMap metadata: name: grafana-config namespace: grafana data: grafana.ini: | [server] root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/ serve_from_sub_path = true
方式二:通过Deployment环境变量配置
apiVersion: apps/v1 kind: Deployment metadata: name: grafana namespace: grafana spec: template: spec: containers: - name: grafana image: grafana/grafana:latest env: - name: GF_SERVER_ROOT_URL value: "%(protocol)s://%(domain)s:%(http_port)s/grafana/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true"
2. 保留/优化Ingress配置
现有Ingress的rewrite规则可以正常使用,也可以保持原配置不变:
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller name: nginx-example-grafana namespace: grafana annotations: ingressclass.kubernetes.io/is-default-class: "true" spec: controller: k8s.io/ingress-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minimal-ingress-grafana namespace: grafana annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx-example-grafana rules: - http: paths: - path: /grafana(/|$)(.*) pathType: ImplementationSpecific backend: service: name: grafana port: number: 3000
关键配置说明
GF_SERVER_ROOT_URL:指定Grafana的外部访问根路径,确保生成的重定向、资源链接自动带上/grafana前缀。GF_SERVER_SERVE_FROM_SUB_PATH:让Grafana自动剥离请求中的/grafana前缀后再处理内部路由,和Ingress的rewrite规则配合实现正确转发。
内容的提问来源于stack exchange,提问作者Mohammad Fatoni
相关产品推荐
相关产品推荐

