Ingress with subpath redirect(feat: Grafana)

강다·2024년 3월 17일
0

Self-Managed k8s 클러스터에서 하나의 도메인을 갖고 Prometheus랑 Grafana 대시보드(외부에서 서비스) 각각에 접근 가능해야 하는 상황이 주어진 환경이었다. 또한, 실제 배포를 위한 쿠버네티스 환경이 아닌 교육용 클러스터 환경 세팅중이었기 때문에, 각 모니터링 툴을 Nginx Ingress에서 subpath로 분리해서 노출시키기로 했다.

Ingress Controller를 사용해 같은 도메인에서 여러 웹 서비스를 subpath롤 분리하는 방법은 각 서비스마다 Ingress를 만들고, '/' path는 무조건 포함시키는 방법이다.(root path인 '/'는 처음 만든 Ingress가 먼저 선점)


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
	name: ingress-grafana
	annotations:
		nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
	ingressClassNAme: nginx
	rules:
	- host: "test.dusdjhyeon.com"
		http:
			paths:
			- pathType: Prefix
				path: /grafana(/|$)(.*)
				backend:
					service:
						name: grafana-svc
						port:
							number: 80	
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
	name: ingress-prometheus 
	annotations:
		nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
	ingressClassNAme: nginx
	rules:
	- host: "test.dusdjhyeon.com"
		http:
			paths:
			- pathType: Prefix
				path: /prometheus(/|$)(.*)
				backend:
					service:
						name: prometheus-svc
						port:
							number: 9090 	

하지만 이렇게 진행한 경우에 curl으로 확인하면 아무 문제가 없지만, 실제로 브라우저에서 host로 subpath를 추가하여 접속하면 실패하는 경우가 있다.


404 Not Found 오류가 발생했는데, Grafana 대시보드 로딩 과정에서 바로 login 페이지로 리다이렉트 되는 과정에서 기존에 /grafana subapth가 붙지 않은 host/login으로 리다이렉트 되기 때문이다.

이는 Grafana에서 기본으로 Base path를 /로 인지하고 있기 때문이라서, values.yaml 파일을 직접 수정해주어야 한다.

나는 Helm으로 kube-prometheus-stack을 설치했기 때문에, values.yaml 파일에서 해당 부분을 변경할 수 있다.



values.yaml 파일의 grafana.ini.server.root_uri 수정

grafana.ini:
  paths:
  	data: /var/lib/grafana/
    logs: /var/log/grafana
    plugins: /var/lib/grafana/plugins
    provisioning: /etc/grafana/provisioning
  analytics:
    check_for_updates: true
  log:
  	mode: console
  grafana_net:
  	url: https://grafana.net
  server:
  	domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ .Values.ingress.hosts | first }}{{ else }}''{{ end }}"
    root_uri: "http://%(domain)s/grafana"  ### 해당 부분 주석 해제 (http://test.dusdjhyeon.com/grafana/" 
    serve_from_sub_path: true 

참고

https://github.com/prometheus-community/helm-charts/issues/2837

https://stackoverflow.com/questions/53089294/nginx-ingress-sub-path-redirection

2개의 댓글

comment-user-thumbnail
2024년 3월 17일

Grafana 어디선가 들어보기만 하고 정확히 뭔진 몰랐는데 이 글을 계기로 조금 더 잘 이해하게 됐어요. 감사함당 ^*^

1개의 답글