NGINX Ingress Controller F5 NGINX에서 제공하는와 Prometheus Operator의 ServiceMonitor CRD를 함께 사용하면 Helm을 통해 NGINX Ingress Controller 배포에서 메트릭을 훨씬 더 쉽고 빠르게 수집할 수 있습니다. 이제 NGINX Ingress Controller Helm 차트는 기존 Prometheus 및 prometheus-operator 인프라를 즉시 활용할 수 있도록 지원하므로, NIC를 배포하고 Prometheus ServiceMonitor를 활용해 별도의 설정 없이 바로 메트릭을 수집할 수 있습니다. 이 문서에서는 ServiceMonitor가 무엇인지, 설치하는 방법, 그리고 NGINX Ingress Controller Helm 차트에서 이러한 특정 설정을 정의하는 방법을 안내합니다.
Prometheus ServiceMonitor
Prometheus ServiceMonitor 사용자 정의 리소스 정의(CRD)를 사용하면 동적인 서비스 집합을 모니터링하는 방법을 선언적으로 정의할 수 있습니다. 모니터링할 서비스는 Kubernetes 레이블 선택기를 사용하여 정의합니다. 이를 통해 조직은 메트릭 노출 방식을 관리하는 규칙을 도입할 수 있습니다. 이러한 규칙을 따르면 새 서비스가 자동으로 검색되고, 시스템을 재구성할 필요 없이 Prometheus가 메트릭 수집을 시작합니다. ServiceMonitor는 Prometheus Operator의 일부입니다. 이러한 리소스는 Prometheus가 스크레이핑할 모니터링 대상을 기술하고 관리합니다. Prometheus 리소스는 ServiceMonitor에 연결할 때 ServiceMonitor Selector 필드를 사용합니다. Prometheus는 스크레이핑 대상으로 표시된 대상을 쉽게 식별할 수 있습니다. 따라서 Kubernetes 클러스터에서 ServiceMonitor 리소스를 활용해 NGINX Ingress Controller와 같은 솔루션을 모니터링할 때 더 높은 수준의 제어력과 유연성을 확보할 수 있습니다. NGINX Ingress Controller에서 기본 제공 메트릭을 더욱 간편하게 사용할 수 있도록 최근 helm 차트에 Prometheus ServiceMonitor를 사용하는 기능을 추가했습니다. 이를 통해 NGINX Ingress Controller를 배포한 직후 Prometheus가 스크레이핑을 시작하도록 메트릭을 매우 간편하게 활성화할 수 있습니다. 이 기능을 사용하려면 메트릭 수집 전용으로 생성된 두 번째 서비스를 추가해야 하며, ServiceMonitor는 이 서비스에 “연결”됩니다. 그러면 Prometheus Operator는 메타데이터의 레이블을 사용하여 모니터링할 서비스를 파악하고, 무엇을 어디에서 스크레이핑해야 하는지 알 수 있습니다. 배포 파일이나 helm 파일에 포함되는 NGINX Ingress Controller용 서비스의 예시는 다음과 같습니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
ports:
- name: prometheus
protocol: TCP
port: 9113
targetPort: 9113
selector:
app: nginx-ingress위 내용은 배포의 일부가 됩니다. app 레이블 nginx-ingress-servicemonitor는 Prometheus 메트릭 스크래핑을 위해 serviceMonitor에 “연결”됩니다. 다음은 위의 nginx-ingress-servicemonitor라는 서비스에 연결되는 serviceMonitor의 예시입니다:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
selector:
matchLabels:
app: nginx-ingress-servicemonitor
endpoints:
- port: prometheusPrometheus 리소스를 생성하고 이 리소스가 serviceMonitor 리소스를 찾도록 구성해야 합니다. 그러면 Prometheus가 메트릭을 수집할 엔드포인트를 빠르고 쉽게 파악할 수 있습니다. 아래 예시에서 이 리소스는 spec 아래에서 모니터링할 항목을 Prometheus에 알려 줍니다. 여기서는 spec.serviceMonitorSelector.matchLabels:를 모니터링합니다. Prometheus가 모든 네임스페이스에서 app.nginx-ingress-servicemonitor가 지정된 matchLabels를 찾는 것을 확인할 수 있습니다. 이는 NGINX Ingress Controller Helm 차트와 Helm을 통해 배포될 serviceMonitor 리소스와 일치합니다.
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
labels:
prometheus: prometheus
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500Mi다음은 여러 구성 요소 간의 연결 관계를 보여 주는 다이어그램입니다:
Prometheus, prometheus-operator 및 Grafana 설치
전체 배포를 설치하기 위해 prometheus-community/kube-prometheus-stack을 사용하겠습니다. 이렇게 하면 prometheus, prometheus-operator 및 Grafana가 설치됩니다. 또한 격리를 위해 monitoring 네임스페이스에 설치하도록 지정하겠습니다. helm으로 설치하는 방법은 다음과 같습니다: helm install metrics01 prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
Prometheus 리소스 생성 및 설치
Prometheus와 Prometheus CRD를 클러스터에 설치한 후에는 Prometheus 리소스를 생성할 수 있습니다. 이 리소스를 미리 배포하면 Helm 차트에서 사용할 레이블로 Prometheus 설정을 사전에 구성할 수 있습니다. 이 방식을 사용하면 Prometheus가 NGINX Ingress Controller를 자동으로 검색하고 메트릭을 스크레이핑하도록 할 수 있습니다. Prometheus 리소스는 NGINX Ingress Controller를 설치하기 전에 배포됩니다. 그러면 prometheus-operator가 배포 후 NGINX Ingress Controller를 자동으로 감지하고 스크레이핑하여 메트릭을 신속하게 제공할 수 있습니다.
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: default
labels:
prometheus: monitoring
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500Mi위의 예시는 기본적인 예시입니다. 핵심은 우리가 지정한 spec.serviceMonitorSelector.matchLabels 값입니다. 이 값은 Helm 차트를 사용하여 NGINX Ingress Controller를 배포할 때 사용됩니다. 별도의 설정 없이 Prometheus 메트릭을 제공하기 위해 NGINX Ingress Controller Helm 차트를 사용하겠습니다.
NGINX Ingress Controller Helm values.yaml 변경 사항
Helm 차트의 values.yaml 파일을 살펴보겠습니다. Prometheus를 활성화하고 필요한 서비스를 생성하며 serviceMonitor 리소스를 만드는 데 필요한 항목이 포함된 Prometheus 섹션을 중점적으로 살펴보겠습니다. Prometheus 섹션에는 다음과 같은 여러 설정이 있습니다: prometheus.service prometheus.serviceMonitor Helm 차트를 사용할 때 필요한 서비스와 serviceMonitor가 생성되도록 위의 두 설정을 모두 활성화하겠습니다. 다음은 서비스를 활성화하고 serviceMonitor를 활성화하며 serviceMonitor 섹션에 레이블을 정의하는 부분입니다:
`servicemonitor` support was recently added to the NGINX Ingress controller helm chart.
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: true
## Configures the port to scrape the metrics.
port: 9113
secret: ""
## Configures the HTTP scheme used.
scheme: http
service:
## Requires prometheus.create=true
create: true
serviceMonitor:
create: true
labels: { app: nginx-ingress-servicemonitor } 위의 값들을 각각 살펴보면 다음과 같습니다:
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: trueHelm에 NIC Prometheus 엔드포인트를 활성화하도록 지시합니다. 필요한 경우 포트, 스킴 및 시크릿을 추가로 정의할 수 있습니다. prometheus.service.create 값을 true로 설정하면 Helm이 NIC ServiceMonitor 서비스를 자동으로 생성합니다.
service:
## Creates a ClusterIP Service to expose Prometheus metrics internally
## Requires prometheus.create=true
create: true마지막으로 serviceMonitor를 생성해야 합니다. 이 값을 true로 설정하고 올바른 레이블을 추가하면 Prometheus 리소스와 일치하는 레이블이 생성되어 추가됩니다.
serviceMonitor:
## Creates a serviceMonitor to expose statistics on the kubernetes pods.
create: true
## Kubernetes object labels to attach to the serviceMonitor object.
labels: { app: nginx-ingress-servicemonitor } 이 레이블은 service.labels의 이름을 다시 참조합니다: { app: nginx-ingress-servicemointor } 요약하면, Prometheus를 활성화하여 NIC의 Prometheus 익스포터 기능을 노출합니다. Service 객체를 정의하면 Prometheus ServiceMonitor가 NIC Prometheus 익스포터 엔드포인트를 검색할 수 있습니다. serviceMonitor 객체를 정의하면 Prometheus ServiceMonitor가 이 대상을 모니터링하도록 지정할 수 있습니다.
이제 helm을 사용하여 NGINX Ingress Controller를 설치할 수 있습니다.
이제 values.yaml을 수정했으므로 NGINX Ingress Controller 설치를 진행할 수 있습니다. helm install nic01 -n nginx-ingress --create-namespace -f values.yaml . NGINX Ingress Controller를 배포한 후 Prometheus 대시보드를 열고 상태 메뉴로 이동합니다. 여기에서 대상 및 서비스 검색 화면으로 이동할 수 있습니다. Prometheus가 새 ServiceMonitor 리소스를 찾으면 엔드포인트 스크레이핑을 시작하고 메트릭을 수집하며, 수집된 메트릭은 Prometheus 대시보드에 즉시 표시됩니다.

그림 3: Prometheus 대상

helm 및 Prometheus와 같은 Kubernetes 네이티브 도구를 사용하면 NGINX Ingress Controller를 통해 배포 초기부터 메트릭을 훨씬 쉽게 수집하고, 즉시 사용 가능한 메트릭을 제공할 수 있습니다. 다음은 설치 시 참고할 문서입니다: prometheus-operator: https://prometheus-operator.dev/ https://github.com/prometheus-operator/prometheus-operator
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.