[PROMETHEUS] kubernetes 환경에서의 Promethus Monitoring 설정

프로메테우스 소개

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-RUNTIMEminikube   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 파일을 가져옵니다.

git clone https://github.com/bibinwilson/kubernetes-prometheus

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/v1kind: ClusterRolemetadata:  name: prometheusrules:- 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/v1kind: ClusterRoleBindingmetadata:  name: prometheusroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: prometheussubjects:- 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: v1kind: ConfigMapmetadata:  name: prometheus-server-conf  labels:    name: prometheus-server-conf  namespace: monitoringdata:  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/v1kind: Deploymentmetadata:  name: prometheus-deployment  namespace: monitoring  labels:    app: prometheus-serverspec:  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=monitoringNAME                    READY   UP-TO-DATE   AVAILABLE   AGEprometheus-deployment   1/1     1            1           15h

5.Ingress를 사용하여 Prometheus 노출

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

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

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

prometheus-ingress.yaml

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: prometheus-ui  namespace: monitoring  annotations:    kubernetes.io/ingress.class: nginxspec:  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.yamlerror: 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/v1kind: Ingressmetadata:  name: prometheus-ui  namespace: monitoring  annotations:    kubernetes.io/ingress.class: nginxspec:  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.yamlingress.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

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤