Nginx를 통해 들어오는 http request를 grafana를 통해 확인하기 위해 진행
Prometheus에서 Exporter로 부터 metric을 수집할 수 있게 설정하는 방법을 알아보기 위함
Cluster에 배포되어 있는 Nginx에 sidecar 형식으로 Exporter를 넣어 재배포 합니다.
이때 label을 추가해줘야 하는데 여기에선 app: nginx 로 설정했습니다.
yaml을 실제로 살펴보면
# nginx deployment yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-system
app.kubernetes.io/name: ingress-nginx-system
app: nginx # 추가해 준 label
name: ingress-nginx-system-controller
namespace: ingress-nginx-system
spec:
template:
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-system
app.kubernetes.io/name: ingress-nginx-system
app: nginx # 추가해 준 label
spec:
containers:
- name: nginx-exporter # nginx-exporter 설치용 추가
image: 'nginx/nginx-prometheus-exporter:0.10.0'
args:
- '-nginx.scrape-uri=http://localhost/nginx_status'
resources:
limits:
memory: 128Mi
cpu: 500m
ports:
- containerPort: 9113
- name: nginx-controller
...
다음과 같이 label을 추가해주고 spec.template.metadata.spec.containers에 nginx-exporter 배포에 필요한 내용을 추가해줬습니다.
다음과 같이 Nginx 파드에 sidecar로 exporter가 추가되여 생성된 것을 확인할 수 있습니다.
이제 기존 Nginx service를 수정해야합니다. 1번에서 추가한 label을 service에도 추가해주고 exporter의 포트도 service에 추가해줍니다.
실제 예시 yaml을 보면
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx # 추가해준 label
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-system
app.kubernetes.io/name: ingress-nginx-system
name: ingress-nginx-system-controller
namespace: ingress-nginx-system
spec:
ports:
- name: exporter # port 정보 추가
port: 9113
protocol: TCP
targetPort: 9113
...
다음과 같이 label을 추가해주고 spec.ports에 nginx exporter의 port정보도 입력해줍니다.
이후 curl을 통해 실제로 metric이 조회되는지 확인해보겠습니다.
curl [service IP]:9113/metrics
다음과 같이 정상적으로 조회가 되는것을 확인 할 수 있습니다.
이제 prometheus에서 생성한 exporter로부터 metric 정보를 가져올 수 있도록 ServiceMonitor를 생성해줍니다.
prometheus를 operator를 통해 설치한 환경이라 prometheus.yml 파일을 수정하는 방법으로 진행하지 않고, ServiceMonitor를 생성하여 target을 등록해주는 방법을 사용했습니다.
yaml을 살펴보면
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: nginx
release: prometheus
name: nginx
namespace: ingress-nginx-system
spec:
endpoints:
- port: exporter # service에서 추가한 exporter port 이름
selector:
matchLabels:
app: nginx
다음과 같이 nginx exporter를 추가할때 적용한 label 정보를 label과 matchLabels에 추가합니다.
그리고 endpoints로 nginx service에서 추가해줬던 exporter port의 name을 입력해줍니다.
이렇게 ServiceMonitor를 만들고 prometheus web console에 접속하여 Targets을 확인해보면
다음과 같이 exporter의 endpoint가 정상적으로 등록된것을 확인할 수 있습니다.
먼저 dashboard 구성에 필요한 json파일을 준비합니다. (https://github.com/nginxinc/nginx-prometheus-exporter/blob/main/grafana/dashboard.json)
여기서 아래의 Total requests가 의미하는것은 초당 요청 수 이고, 총 요청 수를 알고 싶다면 원하는 시간대의 그래프 면적을 계산하시면 됩니다.
Kubernetes에 배포된 Nginx의 모니터링을 Prometheus와 Grafana를 통해 하는 방법을 직접 해봤습니다.
JMeter와 같은 부하 발생기를 사용하여 APP에 부하를 걸고 request에 따른 부하를 모니터링 할 수 있습니다.