프로메테우스 소개

Prometheus  는 확장성이 뛰어난 오픈 소스 모니터링 프레임워크입니다. Kubernetes 컨테이너 오케스트레이션 플랫폼 에 대한 즉시 사용 가능한 모니터링 기능을 제공합니다 

 

핵심 사항

  1. Metric Collection: Prometheus는 pull 모델을 사용하여 HTTP를 통해 메트릭을 검색합니다. 
     Pushgateway Prometheus가 메트릭을 스크랩할 수 없는 사용 사례를 사용 하여 Prometheus에 메트릭을 푸시하는 옵션이 있습니다. 이러한 예 중 하나는 수명이 짧은 kubernetes 작업 및 Cronjob 에서 사용자 지정 메트릭을 수집하는 것입니다.
  2. Metric Endopint : Prometheus를 사용하여 모니터링하려는 시스템은 /metrics엔드포인트에서 메트릭을 노출해야 합니다. 
     Prometheus는 이 끝점을 사용하여 정기적인 간격으로 메트릭을 가져옵니다.
  3. PromQL: Prometheus는 PromQL Prometheus 대시보드에서 메트릭을 쿼리하는 데 사용할 수 있는 매우 유연한 쿼리 언어와 함께 제공됩니다.
     또한 PromQL 쿼리는 Prometheus UI 및 Grafana에서 메트릭을 시각화하는 데 사용됩니다 .
  4. Prometheus Exporters: 내보내기는 타사 앱의 기존 메트릭을 Prometheus 메트릭 형식으로 변환하는 라이브러리입니다. 많은 공식 및 커뮤니티 Prometheus 수출업체 가 있습니다. 
     한 가지 예는 Prometheus 노드 내보내기입니다. 모든 Linux 시스템 수준 메트릭을 Prometheus 형식으로 노출합니다.
  5. TSDB (시계열 데이터베이스): Prometheus는 모든 데이터를 효율적으로 저장하기 위해 TSDB를 사용합니다. 기본적으로 모든 데이터는 로컬에 저장됩니다. 
    그러나 단일 실패 지점을 피하기 위해 Prometheus TSDB용 원격 저장소를 통합하는 옵션이 있습니다.

 

 

Kubernetes Prometheus 모니터링 스택에는 다음 구성 요소가 있습니다.

1.Prometheus Server

2.Alter Manager

3.Grafana

 

Kubernetes에서 Prometheus 모니터링 설정

-Promethues 설정 테스트는 minikube 서버에서 수행

버젼 정보
NAME       STATUS   ROLES                  AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
minikube   Ready    control-plane,master   271d   v1.22.3   172.21.134.231   <none>        CentOS Linux 7 (Core)   3.10.0-1160.45.1.el7.x86_64   docker://1.13.1

 

1.Prometheus Kubernetes 매니페스트 파일

git을 통해 필요한 Prometheus 환경구성에 필요한 yaml 파일을 가져옵니다.

 

2.네임스페이스 및 ClusterRole 생성

다음 명령을 실행하여 Monitoring 이라는 새 네임스페이스를 만듭니다 .

kubectl create namespace monitoring

Prometheus는 Kubernetes API를 사용하여 노드, 포드, 배포 등에서 사용 가능한 모든 메트릭을 읽습니다.

이러한 이유로 필요한 API 그룹에 대한 read access 권한이 있는 RBAC 정책을 생성하고  monitoring 네임스페이스에 바인딩해야 합니다.

 

clusterRole.yaml파일을 사용하여 clusterrole 설정을 적용합니다.

clusterRole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: default
  namespace: monitoring

 

ClusterRole 적용

kubectl create -f clusterRole.yaml

 

3.Prometheus 구성을 외부화하기 위한 Config Map 생성

prometheus.yaml: 이것은 모든 스크랩 구성, 서비스 검색 세부 정보, 저장 위치, 데이터 보존 구성 등을 보유하는 주요 Prometheus 구성입니다.
prometheus.rules: 이 파일에는 모든 Prometheus 경고 규칙이 포함되어 있습니다.

Prometheus 구성을 Kubernetes 구성 맵으로 외부화하면 구성을 추가하거나 제거해야 할 때마다 Prometheus 이미지를 빌드할 필요가 없습니다. 
새 구성을 적용하려면 구성 맵을 업데이트하고 Prometheus 포드를 다시 시작해야 합니다.

모든 Prometheus 스크랩 구성  및 경고 규칙이 포함된 구성 맵은  및   파일의 /etc/prometheus위치 에 있는 Prometheus 컨테이너에 탑재됩니다.

 

config-map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-server-conf
  labels:
    name: prometheus-server-conf
  namespace: monitoring
data:
  prometheus.rules: |-
    groups:
    - name: devopscube demo alert
      rules:
      - alert: High Pod Memory
        expr: sum(container_memory_usage_bytes) > 1
        for: 1m
        labels:
          severity: slack
        annotations:
          summary: High Memory Usage
  prometheus.yml: |-
    global:
      scrape_interval: 5s
      evaluation_interval: 5s
    rule_files:
      - /etc/prometheus/prometheus.rules
    alerting:
      alertmanagers:
      - scheme: http
        static_configs:
        - targets:
          - "alertmanager.monitoring.svc:9093"
 
    scrape_configs:
      - job_name: 'node-exporter'
        kubernetes_sd_configs:
          - role: endpoints
        relabel_configs:
        - source_labels: [__meta_kubernetes_endpoints_name]
          regex: 'node-exporter'
          action: keep
 
      - job_name: 'kubernetes-apiservers'
 
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
 
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
 
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
 
      - job_name: 'kubernetes-nodes'
 
        scheme: https
 
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
 
        kubernetes_sd_configs:
        - role: node
 
        relabel_configs:
        - action: labelmap
          regex: __meta_kubernetes_node_label_(.+)
        - target_label: __address__
          replacement: kubernetes.default.svc:443
        - source_labels: [__meta_kubernetes_node_name]
          regex: (.+)
          target_label: __metrics_path__
          replacement: /api/v1/nodes/${1}/proxy/metrics
 
      - job_name: 'kubernetes-pods'
 
        kubernetes_sd_configs:
        - role: pod
 
        relabel_configs:
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
          action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          target_label: __address__
        - action: labelmap
          regex: __meta_kubernetes_pod_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        - source_labels: [__meta_kubernetes_pod_name]
          action: replace
          target_label: kubernetes_pod_name
 
      - job_name: 'kube-state-metrics'
        static_configs:
          - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']
 
      - job_name: 'kubernetes-cadvisor'
 
        scheme: https
 
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
 
        kubernetes_sd_configs:
        - role: node
 
        relabel_configs:
        - action: labelmap
          regex: __meta_kubernetes_node_label_(.+)
        - target_label: __address__
          replacement: kubernetes.default.svc:443
        - source_labels: [__meta_kubernetes_node_name]
          regex: (.+)
          target_label: __metrics_path__
          replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
 
      - job_name: 'kubernetes-service-endpoints'
 
        kubernetes_sd_configs:
        - role: endpoints
 
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
          action: replace
          target_label: __scheme__
          regex: (https?)
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
          action: replace
          target_label: __address__
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
        - action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: kubernetes_name

prometheus.yaml파일에는 Kubernetes 클러스터에서 동적으로 실행되는 포드 및 서비스를 검색하기 위한 모든 구성 이 포함되어 있습니다. Prometheus 스크랩 구성 에는 다음과 같은 스크랩 작업이 있습니다.

  1. kubernetes-apiservers: API 서버에서 모든 메트릭을 가져옵니다.
  2. kubernetes-nodes: 모든 kubernetes 노드 메트릭을 수집합니다.
  3. kubernetes-pods: 포드 메타데이터에 prometheus.io/scrape  prometheus.io/port 주석 이 추가된 경우 모든 포드 메트릭이 검색됩니다 
  4. kubernetes-cadvisor: 모든 cAdvisor 메트릭을 수집합니다.
  5. kubernetes-service-endpoints: 서비스 메타데이터에 prometheus.io/scrape  prometheus.io/port 주석이 추가된 경우 모든 서비스 엔드포인트가 스크랩됩니다. 블랙박스 모니터링에 사용할 수 있습니다.

prometheus.rules: Alertmanager에 경고를 보내기 위한 모든 경고 규칙이 포함되어 있습니다.


[참고]

https://prometheus.io/docs/prometheus/latest/configuration/configuration

 

Config-map 적용

kubectl create -f config-map.yaml

 

※ config-map.yaml 파일에 아래와 같이 설정을 추가하면 Wildfly, Jboss POD에 대해서도 모니터링이 가능합니다. (단 관리자 포트의 /metrics 를 8080포트로 노출해야 함)

...
      - job_name: 'wildfly'
        kubernetes_sd_configs:
          - role: endpoints
        relabel_configs:
        - source_labels: [__meta_kubernetes_endpoints_name]
          # regex에 deplyment name을 설정해야 함
          regex: 'wildfly'
          action: keep
...

 

4.Prometheus 배포 만들기

prometheus-deployment.yaml하고 다음 내용을 파일에 복사합니다. /etc/prometheus이 구성 에서는 이전 섹션에서 설명한 대로 Prometheus 구성 맵을 내부에 파일로 마운트합니다 .

참고: 이 배포는 도커 허브 의 최신 공식 Prometheus 이미지 를 사용합니다. 또한 Prometheus 저장소는 기본 설정이므로 영구 저장소 볼륨 을 사용하지 않습니다 .
        프로덕션 사용 사례에 대해 Prometheus를 설정할 때 배포에 영구 저장소를 추가해야 합니다.

prometheus-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-deployment
  namespace: monitoring
  labels:
    app: prometheus-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-server
  template:
    metadata:
      labels:
        app: prometheus-server
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          args:
            - "--storage.tsdb.retention.time=12h"
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--storage.tsdb.path=/prometheus/"
          ports:
            - containerPort: 9090
          resources:
            requests:
              cpu: 500m
              memory: 500M
            limits:
              cpu: 1
              memory: 1Gi
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus/
            - name: prometheus-storage-volume
              mountPath: /prometheus/
      volumes:
        - name: prometheus-config-volume
          configMap:
            defaultMode: 420
            name: prometheus-server-conf
   
        - name: prometheus-storage-volume
          emptyDir: {}

 

Deployment 적용

kubectl create -f prometheus-deployment.yaml

 

Deployment 정보 확인

$ kubectl get deployments --namespace=monitoring
 
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
prometheus-deployment   1/1     1            1           15h

 

5.Ingress를 사용하여 Prometheus 노출

기존 수신 컨트롤러 설정 이 있는 경우 수신 객체를 생성하여 Prometheus DNS를 Prometheus 백엔드 서비스로 라우팅할 수 있습니다.

또한 수신 계층에서 Prometheus용 SSL을 추가할 수 있습니다. 자세한 내용 은 Kubernetes 수신 TLS/SSL 인증서 가이드 를 참조하세요.

다음은 샘플 인그레스 개체입니다. SSL을 사용하는 샘플 수신 객체는 이 GitHub 링크 를 참조하십시오.

 

prometheus-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: prometheus-ui
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  # Use the host you used in your kubernetes Ingress Configurations
  - host: prometheus.example.com
    http:
      paths:
      - backend:
          serviceName: prometheus-service
          servicePort: 8080

 

위 설정으로 ingress를 생성하려고 했으나, 아래와 같은 에러가 발생하였습니다.

$ kubectl create -f prometheus-ingress.yaml
error: unable to recognize "prometheus-ingress.yaml": no matches for kind "Ingress" in version "extensions/v1beta1"

 

아래와 같이 prometheus-ingress.yaml 파일을 수정합니다.
(참고: https://zetawiki.com/wiki/No_matches_for_kind_%22Ingress%22_in_version_%22extensions/v1beta1%22)

prometheus-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-ui
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  # Use the host you used in your kubernetes Ingress Configurations
  - host: prometheus.example.com
    http:
      paths:
      - pathType: ImplementationSpecific
        backend:
          service:
            name: prometheus-service
            port:
              number: 8080

 

$ kubectl create -f prometheus-ingress.yaml
ingress.networking.k8s.io/prometheus-ui created

6.PC의 hosts 파일 설정 후에 웹 브라우저를 통해 접속

hosts
172.21.134.231  prometheus.example.com

 

Reference

https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/

https://devopscube.com/setup-kube-state-metrics/

https://devopscube.com/node-exporter-kubernetes/

+ Recent posts