프로메테우스 소개
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-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 설정을 적용합니다.
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 컨테이너에 탑재됩니다.
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 스크랩 구성 에는 다음과 같은 스크랩 작업이 있습니다.
- 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에 경고를 보내기 위한 모든 경고 규칙이 포함되어 있습니다.
[참고]
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를 설정할 때 배포에 영구 저장소를 추가해야 합니다.
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 링크 를 참조하십시오.
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)
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 파일 설정 후에 웹 브라우저를 통해 접속
172.21.134.231 prometheus.example.com
|
Reference
https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/