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 파일에서 해당 부분을 변경할 수 있다.
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
Grafana 어디선가 들어보기만 하고 정확히 뭔진 몰랐는데 이 글을 계기로 조금 더 잘 이해하게 됐어요. 감사함당 ^*^