프로메테우스 소개
Prometheus 는 확장성이 뛰어난 오픈 소스 모니터링 프레임워크입니다. Kubernetes 컨테이너 오케스트레이션 플랫폼 에 대한 즉시 사용 가능한 모니터링 기능을 제공합니다
핵심 사항
- Metric Collection: Prometheus는 pull 모델을 사용하여 HTTP를 통해 메트릭을 검색합니다.
Pushgateway Prometheus가 메트릭을 스크랩할 수 없는 사용 사례를 사용 하여 Prometheus에 메트릭을 푸시하는 옵션이 있습니다. 이러한 예 중 하나는 수명이 짧은 kubernetes 작업 및 Cronjob 에서 사용자 지정 메트릭을 수집하는 것입니다. - Metric Endopint : Prometheus를 사용하여 모니터링하려는 시스템은 /metrics엔드포인트에서 메트릭을 노출해야 합니다.
Prometheus는 이 끝점을 사용하여 정기적인 간격으로 메트릭을 가져옵니다. - PromQL: Prometheus는 PromQL Prometheus 대시보드에서 메트릭을 쿼리하는 데 사용할 수 있는 매우 유연한 쿼리 언어와 함께 제공됩니다.
또한 PromQL 쿼리는 Prometheus UI 및 Grafana에서 메트릭을 시각화하는 데 사용됩니다 . - Prometheus Exporters: 내보내기는 타사 앱의 기존 메트릭을 Prometheus 메트릭 형식으로 변환하는 라이브러리입니다. 많은 공식 및 커뮤니티 Prometheus 수출업체 가 있습니다.
한 가지 예는 Prometheus 노드 내보내기입니다. 모든 Linux 시스템 수준 메트릭을 Prometheus 형식으로 노출합니다. - 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 파일을 가져옵니다.
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 스크랩 구성 에는 다음과 같은 스크랩 작업이 있습니다.
- kubernetes-apiservers: API 서버에서 모든 메트릭을 가져옵니다.
- kubernetes-nodes: 모든 kubernetes 노드 메트릭을 수집합니다.
- kubernetes-pods: 포드 메타데이터에 prometheus.io/scrape 및 prometheus.io/port 주석 이 추가된 경우 모든 포드 메트릭이 검색됩니다
- kubernetes-cadvisor: 모든 cAdvisor 메트릭을 수집합니다.
- kubernetes-service-endpoints: 서비스 메타데이터에 prometheus.io/scrape 및 prometheus.io/port 주석이 추가된 경우 모든 서비스 엔드포인트가 스크랩됩니다. 블랙박스 모니터링에 사용할 수 있습니다.
prometheus.rules: Alertmanager에 경고를 보내기 위한 모든 경고 규칙이 포함되어 있습니다.
[참고]
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