EKS 클러스터상의 Nginx 서비스를 prometheus로 추적하기

ukson·2024년 8월 23일
0

trouble shooting

목록 보기
2/4

eks 클러스터 위에서 nginx 서비스를 운영중에, 모니터링을 위해서 prometheus에 관련 정보를 추가하고 싶었다.

여러 방법을 찾았지만, 생각보다 방법이 잘 나와있지 않아서 정리해보고자한다.

먼저, nginx가 상태를 저장하는데, nginx-exporter가 이를 참고할 수 있도록 설정을 해줘야 한다.

필자의 경우에는 nginx 서비스를 deployment로 배포하는데, 설정을 config map으로 관리하여 다음과 같이 configmap yaml 파일을 수정하였다.
만약 다른 방법으로 배포했을 경우, nginx.conf 파일에 위와 같이 추가하여 배포하면된다.

이후, 배포된 nginx의 설정이 반영될 수 있도록 다음 명령어를 수행해준다. (namespace가 web이고, deployment이름은 nginx-deployment인 상황)
kubectl rollout restart deployment nginx-deployment -n web

다음으로, nginx-exporter 를 설치해줘야하는데, 이때 nginx가 설치된 namespace와 같은 곳에서 설치해야한다.

helm repo add stable https://charts.helm.sh/stable
helm repo update
helm install nginx-exporter prometheus-community/prometheus-nginx-exporter \
  --namespace web \
  --set nginxServer=http://<nginx-service>:<nginx-port>/status

주의점: <nginx-service>는 클러스터 내부에서 서로 접근할 수 있는 주소여야 한다. 현재는 nginx를 외부에서 접속할 수 있도록 하기위해 서비스를 ingress로 외부에서 접근할 수 있도록 하여, http:// 다음의 부분에 <ingress>주소/status로 작성하였다.


설정이 잘 되었다면, 위와 같이 nginx-exporter의 9113포트 (별도 설정을 안했을 경우)로 접속해서 로그를 확인할 수 있어야 한다.

또한, 참고로 아래의 링크와 같은 방법으로 grafana, prometheus 모니터링 환경을 구축하였다.
https://medium.com/@maheshbiradar8887/eks-monitoring-using-helm-prometheus-and-grafana-dashboard-e47093c08ece

prometheus가 metric을 수집하는 방법중에, ServiceMonitor 리소스를 사용해서 리소스 목록을 가져오는 방법으로 동작한다는것을 알게 되었다.
(prometheus Operator를 사용하는 환경 기준)

이를 위해 helm으로 배포된 prometheus의 설정파일을 가져와야 한다. (monitoring namespace로 prometheus 서비스가 배포되어있는 환경 기준 명령어)

helm get values prometheus -n monitoring > values.yaml

위의 명령어를 수행후, values.yaml 파일을 열어서 다음 두가지 설정을 진행한다.
1. serviceMonitor.enabled: true 설정
2. serviceMonitorSelector 항목을 아래와 같이 설정한다.

serviceMonitorSelector:
	matchLabels:
    	release: prometheus

설정 이후, 아래의 명령어를 수행하여 helm 배포를 진행한다.
helm upgrade prometheus -n monitoring prometheus-community/kube-prometheus-stack -f values.yaml

또한, prometheus 서비스가 외부에서 접근가능하도록 ingress나 LoadBalancer를 설정해준다.

web namespace에서 실행중인 nginx-exporter 서비스의 포트를 kubectl describe svc nginx-exporter -n web를 통해서 확인한다.

위의 경우, http port로 nginx-exporter 서비스를 k8s에서 접근할 수 있도록 제공하는 상황이다.

마지막으로 prometheus가 수집할 대상을 만들어주기위해 serviceMonitor를 생성해주면 된다.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: nginx-exporter
  namespace: monitoring
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app.kubernetes.io/instance: nginx-exporter
      app.kubernetes.io/name: prometheus-nginx-exporter
  endpoints:
    - port: http #위의 명령어 수행 후, 맞는 포트를 설정
      path: /metrics
      interval: 5s
  namespaceSelector:
    matchNames:
      - web

위와 같은 내용으로 nginx-serviceMonitor.yaml 를 작성하고 serviceMonitor를 생성한다.
kubectl apply -f nginx-serviceMonitor.yaml

이후, prometheus 서비스화면에 접속해서 target이 잘 잡혔는지 확인한다.

위와 같이 state가 up이면 성공이다 👏

profile
one step further

0개의 댓글