Monitoring

Prometheus 와 Thanos 설치 및 구성

Somaz 2024. 9. 19. 08:19
728x90
반응형

Overview

지난번 포스팅에서 Prometheus와 Thanos에 대해서 알아보았다.

2024.09.12 - [Monitoring] - Prometheus와 Thanos란?

 

Prometheus와 Thanos란?

OverviewPrometheus와 Thanos에 대해서 알아본다.  Prometheus와 Thanos란? PrometheusPrometheus는 오픈 소스 모니터링 시스템으로, 주로 시간에 따라 변하는 시스템 및 서비스의 메트릭을 수집하고 저장하는 데

somaz.tistory.com

 

이번에는 Prometheus와 Thanos 설치 및 구성에 대해서 알아본다. 모든 설치는 Helm으로 진행된다.

그리고 PV와 PVC를 설정해야 하기때문에 Storage 구성을 위한 Provionser 설정은 되어 있어야 한다.

그리고 Object Storage(AWS S3, GCP GCS, Minio, Ceph..etc) 준비도 필요하다.

 

Objcet Storage 구성방법

https://thanos.io/v0.8/thanos/storage.md/

 

Local Storage Dynamic Provisoning

https://github.com/rancher/local-path-provisioner/tree/master

 

NFS Storage Dynamic Provisoning

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

 

출처 : https://particule.io/en/blog/thanos-monitoring/

 

 


 

Prometheus 설치

Prometheus는 kube-prometheus-stack chart와 prometheus-community chart를 활용한 설치방법에 대해서 알아본다.

 

그리고 아래의 values 파일은 내가 필요한 Component들만 가지고 설치한 예시이다. 따라서 `values.yaml` 을 확인하고 필요한 Component들을 추가 또는 제거해주면 된다.

 


 

Prometheus CRD(CustomResourceDefinition) 설치

먼저 Prometheus 설치전에 CRD를 설치해 줘야 한다.

# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# helm chart 확인
helm search repo prometheus-community/prometheus-operator-crds
NAME                                         	CHART VERSION	APP VERSION	DESCRIPTION                                       
prometheus-community/prometheus-operator-crds	14.0.0       	v0.76.0    	A Helm chart that collects custom resource defi...

# 설치
helm install prometheus-operator-crds -n monitoring prometheus-community/prometheus-operator-crds

# crd 확인
k get crd |grep monitoring

# 삭제방법
helm delete -n monitoring prometheus-operator-crds

 

 


 

 

Prometheus-Community 설치

# git clone
git clone https://github.com/prometheus-community/helm-charts.git

# 디렉토리 이동
cd helm-charts/charts/prometheus

# helm repo 등록
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# helm dependency 설치
helm dependency update

mkdir values

 

 

`values/somaz.yaml`

server:
  name: server
  image:
    repository: quay.io/prometheus/prometheus
  persistentVolume:
    enabled: true
    accessModes:
      - ReadWriteOnce
    storageClass: "default"
  replicaCount: 1
  statefulSet:
    enabled: false
  service:
    enabled: true
    # type: ClusterIP
    type: NodePort
extraScrapeConfigs: |-
  - job_name: 'somaz-exporter'
    scrape_interval: 1h
    static_configs:
      - targets: ['localhost:30501']

alertmanager:
  enabled: true
  persistence:
    size: 2Gi

kube-state-metrics:
  enabled: true

prometheus-node-exporter:
  enabled: true

prometheus-pushgateway:
  enabled: true
  # Optional service annotations
  serviceAnnotations:
    prometheus.io/probe: pushgateway

 

 

설치 방법은 아래와 같다.

# 설치 방법
helm install prometheus-community . -n monitoring -f ./values/somaz.yaml

# 업그레이드 방법
helm upgrade prometheus-community . -n monitoring -f ./values/somaz.yaml

# helm 배포 확인방법
helm list -n monitoring

# 삭제 방법
helm delete -n monitoring prometheus-community

 

 


 

 

kube-prometheus-stack 설치

git clone https://github.com/prometheus-community/helm-charts.git

# 파일 복사 
sudo cp -r ~/helm-charts/kube-prometheus-stack .
cd ~ kube-prometheus-stack

# helm repo 등록
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# values 파일 생성
mkdir -p values
cp values.yaml ./values/somaz.yaml

# 의존성 설치
helm dependency update ~/kube-prometheus-stack/

 

 

`values/somaz.yaml`

alertmanager:
  enabled: true
  config:
    global:
      resolve_timeout: 5m
  service:
    type: NodePort

grafana:
  enabled: false

## Component scraping the kubelet and kubelet-hosted cAdvisor
##
kubelet:
  enabled: true
  namespace: kube-system

## Component scraping the kube controller manager
##
kubeControllerManager:
  enabled: true

## Component scraping coreDns. Use either this or kubeDns
##
coreDns:
  enabled: true

## Component scraping kubeDns. Use either this or coreDns
##
kubeDns:
  enabled: false

## Component scraping kube scheduler
##
kubeScheduler:
  enabled: true

## Component scraping kube proxy
##
kubeProxy:
  enabled: true

kubeEtcd:
  enabled: true

## Component scraping kube state metrics
##
kubeStateMetrics:
  enabled: true

## Configuration for kube-state-metrics subchart
##
kube-state-metrics:
  namespaceOverride: ""
  rbac:
    create: true
  releaseLabel: true
  prometheus:
    monitor:
      enabled: true

## Deploy node exporter as a daemonset to all nodes
##
nodeExporter:
  enabled: true
  operatingSystems:
    linux:
      enabled: true
    darwin:
      enabled: true

  ## ForceDeployDashboard Create dashboard configmap even if nodeExporter deployment has been disabled
  ##
  forceDeployDashboards: false

## Manages Prometheus and Alertmanager components
##
prometheusOperator:
  enabled: true
  thanosImage:
    registry: quay.io
    repository: thanos/thanos
    tag: v0.36.1
    sha: ""

## Deploy a Prometheus instance
##
prometheus:
  enabled: true
  thanosService:
    enabled: true
  thanosServiceMonitor:
    enabled: true
  thanosServiceExternal:
    enabled: true
    type: NodePort
  ingress:
    enabled: true
    ingressClassName: nginx
    annotations:
      nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
      nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    hosts:
      - prometheus.somaz.link
  serviceMonitor:
    disableCompaction: true
    selfMonitor: true
    replicas: 1
    shards: 1
    # resources:
    #   requests:
    #     cpu: 4
    #     memory: 10Gi
    #   limits:
    #     cpu: 4
    #     memory: 10Gi
  prometheusSpec:
    replicas: 1
    thanos:
      baseImage: quay.io/thanos/thanos
      version: v0.36.1
      objectStorageConfig:
        existingSecret:
          name: thanos-objstore
          key: objstore.yml
    storageSpec: 
      volumeClaimTemplate:
        spec:
          storageClassName: default
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 100Gi
    externalLabels:
      provider: somaz
      region: seoul
      cluster: mgmt
      cluster_id: somaz-seoul-mgmt
    retention: 10d

 

설치 방법은 아래와 같다.

# lint 확인
helm lint --values ./values/somaz.yaml  

# 설치전 확인
helm install kube-prometheus-stack . -n monitoring -f ./values/somaz.yaml  --create-namespace --dry-run >> output.yaml

# 설치
helm install kube-prometheus-stack . -n monitoring -f ./values/somaz.yaml --create-namespace

# 업그레이드 방법
helm upgrade kube-prometheus-stack . -n monitoring -f ./values/somaz.yaml

# 주의할점 삭제하고 재설치 시
helm delete -n monitoring kube-prometheus-stack
helm delete -n monitoring prometheus-operator-crds

 

 


 

Thanos 설치

Thanos 설치 방법에 대해서 알아본다.

 

Thanos는 내부 Prometheus Thanos Discovery Sidecar에서 데이터를 가져오는 방법과, 외부 Cluster의 Prometheus Thanos Discovery Sidecar에서 데이터를 가져오는 방법, 그리고 통합하여 하나의 Thanos로 합쳐서 관리하는 방법에 대해서 알아본다.

 

 


 

 

내부 Prometheus 데이터 수집을 위한 Thanos 설치

git clone https://github.com/bitnami/charts.git

# 파일 복사 
sudo cp -r charts/bitnami/thanos .
cd ~/thanos

# helm repo 등록
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# values 파일 복사
mkdir -p values
cp values.yaml ./values/somaz.yaml

# 의존성 설치
helm dependency update ~/thanos/

 

 

`values/somaz.yaml`

global:
  defaultStorageClass: "default"

fullnameOverride: "thanos" 
clusterDomain: somaz-cluster.local

existingObjstoreSecret: "thanos-objstore"

query:
  enabled: true
  logLevel: debug
  # resources:
  #   requests:
  #     cpu: 200m
  #     memory: 4Gi
  #   limits:
  #     cpu: 400m
  #     memory: 8Gi
  replicaLabel:
    - prometheus_replica
  dnsDiscovery:
    enabled: false
  stores:
    - dnssrv+_grpc._tcp.kube-prometheus-stack-thanos-discovery.monitoring.svc.somaz-cluster.local
  replicaCount: 1
  startupProbe:
    enabled: true
  ingress:
    enabled: true
    hostname: thanos-query.somaz.link
    ingressClassName: nginx
    pathType: ImplementationSpecific
    path: /
    grpc:
      enabled: false

queryFrontend:
  enabled: true
  # resources:
  #   requests:
  #     cpu: 100m
  #     memory: 1Gi
  #   limits:
  #     cpu: 200m
  #     memory: 2Gi
  rbac:
    create: true
  ingress:
    enabled: true
    hostname: thanos.somaz.link
    ingressClassName: nginx
    pathType: ImplementationSpecific
    path: /

bucketweb:
  enabled: false

compactor:
  enabled: true
  retentionResolutionRaw: 60d      # Retain raw data (10-second resolution) for 10 days
  retentionResolution5m: 60d       # Retain 5-minute downsampled data for 60 days
  retentionResolution1h: 1y        # Retain 1-hour downsampled data for 1 year
  consistencyDelay: 1h
  ingress:
    enabled: true
    hostname: thanos-compactor.somaz.link
    ingressClassName: nginx
    pathType: ImplementationSpecific
    path: /
  persistence:
    enabled: true
    storageClass: "default"
    accessModes:
      - ReadWriteOnce
    size: 10Gi

storegateway:
  enabled: true
  logLevel: warn
  # resources:
  #   requests:
  #     cpu: 400m
  #     memory: 3Gi
  #   limits:
  #     cpu: 800m
  #     memory: 6Gi
  persistence:
    enabled: true
    storageClass: "default"
    accessModes:
      - ReadWriteOnce
    size: 10Gi
  sharded:
    enabled: false
  pdb:
    create: true
    minAvailable: ""
    maxUnavailable: ""
  ingress:
    enabled: false

ruler:
  enabled: false

receive:
  enabled: false

receiveDistributor:
  enabled: false

metrics:
  enabled: true
  serviceMonitor:
    enabled: true
  prometheusRule:
    enabled: false

volumePermissions:
  enabled: false

minio:
  enabled: false

 

 

위의 `values/somaz.yaml` 파일에서 가장 중요한 부분은 아래와 같다.

  stores:
    - dnssrv+_grpc._tcp.kube-prometheus-stack-thanos-discovery.monitoring.svc.somaz-cluster.local

 

  • dnssrv
    • DNS SRV 레코드를 통해 서비스를 검색하겠다는 의미이다.
    • Thanos 구성에서 stores 필드에 이 방식을 사용하면, Thanos Query 컴포넌트가 자동으로 DNS를 조회하여 해당 서비스의 위치와 포트 정보를 얻는다.

 

  • _grpc._tcp
    • Thanos가 gRPC 프로토콜을 사용하여 통신한다는 것을 나타낸다.
    • _grpc는 gRPC 서비스를, _tcp는 TCP 프로토콜을 사용한다는 것을 의미한다.

 

  • kube-prometheus-stack-thanos-discovery.monitoring.svc.somaz-cluster.local
    • Kubernetes 내에서 서비스를 식별하는 FQDN(Fully Qualified Domain Name)이다.
      • kube-prometheus-stack-thanos-discovery: Thanos Discovery 서비스의 이름이다.
      • monitoring: 서비스가 속해 있는 네임스페이스이다.
      • svc: 이는 Kubernetes Service 객체를 나타낸다.
      • somaz-cluster.local: 클러스터의 도메인 이름을 나타낸다.

 

설치방법은 아래와 같다.

# lint 확인
helm lint --values ./values/somaz.yaml  

# 설치 전 확인
helm install thanos . -n monitoring -f ./values/somaz.yaml --create-namespace --dry-run >> output.yaml

# 설치
helm install thanos . -n monitoring -f ./values/somaz.yaml --create-namespace

# 업그레이드 방법
helm upgrade thanos . -n monitoring -f ./values/somaz.yaml
  • 설치후에 Thanos Frontend Web에 접속해서 Endpoint 부분을 확인하면 등록이 잘되었는지 알 수 있다.

 

만약 데이터 수집할때 에러가 발생한다면, 아래와같이 디버깅을 해보면 된다.

kubectl run -it --rm --image=nicolaka/netshoot dns-test --restart=Never -- /bin/sh

dig _grpc._tcp.kube-prometheus-stack-thanos-discovery.monitoring.svc.somaz-cluster.local

 

 

dig로확인했을때 A 레코드에는 endpoint ip가 나와야 정상이다.

k get ep -n monitoring |grep thanos-discovery

 

 

 

 


 

 

외부 Prometheus 데이터 수집을 위한 Thanos 설치

Chart는 위에서 사용한 것과 동일한 것을 사용한다.

따라서 파일을 복사해서 사용해준다. 그리고 외부 Cluster에는 Prometheus까지는 설치된 상태여야 한다.

# externalcluster 용 yaml 파일 생성
cp values/somaz.yaml values/somaz-externalcluster.yaml

# multicluster 용 yaml 파일 생성
cp values/somaz.yaml values/somaz-multicluster.yaml

 

 

그리고 externalcluster용 thanos는 외부 Cluster에 설치해준다. multicluster용 thanos는 첫번째 설치했던 thanos와 같은 Cluster에 설치해준다.

 

 

`values/somaz-externalcluster.yaml`

global:
  defaultStorageClass: "default"

fullnameOverride: "thanos" 
clusterDomain: external-cluster.local

existingObjstoreSecret: "thanos-objstore"

query:
  enabled: true
  logLevel: debug
  # resources:
  #   requests:
  #     cpu: 200m
  #     memory: 4Gi
  #   limits:
  #     cpu: 400m
  #     memory: 8Gi
  replicaLabel:
    - prometheus_replica
  dnsDiscovery:
    enabled: false
  stores:
    - dnssrv+_grpc._tcp.kube-prometheus-stack-thanos-discovery.monitoring.svc.external-cluster.local
  replicaCount: 1
  startupProbe:
    enabled: true
  ingress:
    grpc:
      enabled: true
      hostname: external-cluster-thanos-query.somaz.link
      ingressClassName: "nginx"
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
        nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

queryFrontend:
  enabled: false

bucketweb:
  enabled: false

compactor:
  enabled: false

storegateway:
  enabled: false

ruler:
  enabled: false

receive:
  enabled: false

receiveDistributor:
  enabled: false

metrics:
  enabled: false

volumePermissions:
  enabled: false

minio:
  enabled: false

 

 

`values/somaz-multicluster.yaml`

global:
  defaultStorageClass: "default"

fullnameOverride: "thanos-multicluster" 
clusterDomain: somaz-cluster.local

existingObjstoreSecret: "thanos-objstore"

query:
  enabled: true
  logLevel: debug
  # resources:
  #   requests:
  #     cpu: 200m
  #     memory: 4Gi
  #   limits:
  #     cpu: 400m
  #     memory: 8Gi
  replicaLabel:
    - prometheus_replica
  dnsDiscovery:
    enabled: false
  stores:
    - external-cluster-thanos-query.somaz.link:443
  extraFlags:
    - "--grpc-client-tls-secure"
  replicaCount: 0
  startupProbe:
    enabled: true
  ingress:
    enabled: false

queryFrontend:
  enabled: false

bucketweb:
  enabled: false

compactor:
  enabled: false

storegateway:
  enabled: false

ruler:
  enabled: false

receive:
  enabled: false

receiveDistributor:
  enabled: false

metrics:
  enabled: false

volumePermissions:
  enabled: false

minio:
  enabled: false

 

 

설치 완료후에 다시 한번더 `values/somaz.yaml` 파일을 수정한다.

stores 밑에 multicluster-thanos-query도 수집하게 추가해준다.

global:
  defaultStorageClass: "default"

fullnameOverride: "thanos" 
clusterDomain: somaz-cluster.local

existingObjstoreSecret: "thanos-objstore"

query:
  enabled: true
  logLevel: debug
  # resources:
  #   requests:
  #     cpu: 200m
  #     memory: 4Gi
  #   limits:
  #     cpu: 400m
  #     memory: 8Gi
  replicaLabel:
    - prometheus_replica
  dnsDiscovery:
    enabled: false
  stores:
    - dnssrv+_grpc._tcp.kube-prometheus-stack-thanos-discovery.monitoring.svc.somaz-cluster.local
    - dnssrv+_grpc._tcp.thanos-multicluster-query-grpc.monitoring.svc.somaz-cluster.local # 추가
  replicaCount: 1
  startupProbe:
    enabled: true
  ingress:
    enabled: true
    hostname: thanos-query.somaz.link
    ingressClassName: nginx
    pathType: ImplementationSpecific
    path: /
    grpc:
      enabled: false
...

 

 

Thanos Query Frontend 로 접속해 EndPoints를 확인하면 정상적으로 가져오고 있는걸 알 수 있다.

Announced LabelSet에는 Prometheus에서 설정한 externalLabelsets의 값도 같이 가져오게 된다.

 

 

이렇게 Thanos와 Prometheus 구성에 대해서 알아보았다. 복잡해 보이지만 생각보다, 직접 설치해서 적용해보고 구성해보면 어렵지 않다. 다음시간에는 Loki + Promtail + Node Feature Discovery 를 구성해보려고 한다.

그리고 Grafana도 구성해서 Metric data와 Log Data를 시각화까지 해볼 예정이다.

 


Reference

https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus

https://thanos.io/v0.8/thanos/storage.md/

https://github.com/rancher/local-path-provisioner/tree/master

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

https://github.com/bitnami/charts/tree/main/bitnami/thanos

https://particule.io/en/blog/thanos-monitoring/

728x90
반응형

'Monitoring' 카테고리의 다른 글

Loki와 Promtail 설치  (5) 2024.10.02
Loki란?  (4) 2024.09.26
Prometheus와 Thanos란?  (4) 2024.09.12
Fluent Bit (With Loki)  (4) 2024.03.08