모니터링 시스템 배포하기 (Prometheus, Grafana)

온프래미스 K8s 클러스터 구축하기 - 2
이민석's avatar
Mar 04, 2025
모니터링 시스템 배포하기 (Prometheus, Grafana)

지난 시간에는 온프레미스 쿠버네티스[1]를 직접 구축했습니다.

앞으로는 다양한 상황을 가정하고 테스트하는 과정을 반복하려고 합니다.
따라서 이를 관측 가능한 기본적인 모니터링 시스템을 배포하고자 합니다.

A. 실습환경

A.1. 패키지 매니저 설치

편리한 실습을 위해 패키지 매니저인 helm과 각 charts를 사용합니다.

  1. helm 설치[A.1.1]

    curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
    sudo apt-get install apt-transport-https --yes
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
    sudo apt-get update
    sudo apt-get install helm
  2. helm 저장소 확인하기

    helm repo list
    Error: no repositories to show

B. 모니터링 환경 배포하기

B.1. metrics-server

node, pod 매트릭 수집을 위해 metrics-server를 사용합니다.
kubernetes-sigs/metrics-server helm chart [B.1.1]을 사용합니다.

  1. helm repo 추가

    helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
    "metrics-server" has been added to your repositories
  2. helm repo 업데이트

    helm repo update
  3. helm repo 확인하기

    helm repo list
    NAME            URL                                              
    metrics-server  https://kubernetes-sigs.github.io/metrics-server/
  4. metrics-server 릴리즈(배포)하기

    helm upgrade \
      --install metrics-server metrics-server/metrics-server \
      --namespace kube-system \
      --create-namespace
  5. metrics-server 파드 로그확인하기

    1. 파드 확인하기

      kubectl get pods
      NAME                              READY   STATUS    RESTARTS   AGE
      metrics-server-85f985c745-d8mgw   0/1     Running   0          3m25s
    2. 로그 확인하기

      kubectl logs metrics-server-85f985c745-d8mgw
      I0301 07:52:43.675438       1 serving.go:374] Generated self-signed cert (/tmp/apiserver.crt, /tmp/apiserver.key)
      I0301 07:52:43.884760       1 handler.go:275] Adding GroupVersion metrics.k8s.io v1beta1 to ResourceManager
      E0301 07:52:44.002388       1 scraper.go:149] "Failed to scrape node" err="Get \"https://172.30.1.48:10250/metrics/resource\": tls: failed to verify certificate: x509: cannot validate certificate for 172.30.1.48 because it doesn't contain any IP SANs" node="cp-k8s"
  6. metrics-server 릴리즈 수정하기

    helm upgrade \
      metrics-server metrics-server/metrics-server \
      --set args={"--kubelet-insecure-tls"} \
      --namespace kube-system
  7. metrics-server 배포 확인하기

    1. 파드 확인하기

      kubectl get pods
      NAME                             READY   STATUS    RESTARTS   AGE
      metrics-server-8dd4f4fd6-c4vxz   1/1     Running   0          39s
  8. metrics-server 작동확인하기

    kubectl top nodes
    kubectl top pods

B.2. prometheus

metric-server에서 수집한 매트릭을 저장하기 위해
prometheus-community/prometheus helm chart[B.2.1]을 사용합니다.

  1. helm repo 추가

    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    "prometheus-community" has been added to your repositories
  2. helm repo 업데이트

    helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "metrics-server" chart repository
    ...Successfully got an update from the "prometheus-community" chart repository
    Update Complete. ⎈Happy Helming!⎈
     
  3. helm repo 확인하기

    helm repo list
    NAME                    URL                                               
    metrics-server          https://kubernetes-sigs.github.io/metrics-server/ 
    prometheus-community    https://prometheus-community.github.io/helm-charts
  4. prometheus 릴리즈(배포)하기

    helm upgrade --install prometheus prometheus-community/prometheus \
      --set pushgateway.enabled=false \
      --set alertmanager.enabled=false \
      --set server.service.type="NodePort" \
      --namespace kube-monitor \
      --create-namespace
    
    # 배포 후 나오는 메세지는 아래 메세지로 확인 가능
    helm status prometheus -n kube-monitor
  5. prometheus 릴리즈 확인하기

    1. 파드 확인하기

      kubectl get pods -n kube-monitor
      NAME                                                 READY   STATUS    RESTARTS   AGE
      prometheus-kube-state-metrics-65846b5c64-xng9b       1/1     Running   0          2m5s
      prometheus-prometheus-node-exporter-vv74p            1/1     Running   0          2m5s
      prometheus-prometheus-pushgateway-64bc8bff6f-8fj96   1/1     Running   0          2m5s
      prometheus-server-6c586d99cd-79r7c                   0/2     Pending   0          2m5s
    2. 로그 확인하기

      kubectl describe pod/prometheus-server-6c586d99cd-79r7c -n kube-monitor
  6. prometheus 릴리즈 수정하기

    helm upgrade \
      prometheus prometheus-community/prometheus \
      --set pushgateway.enabled=false \
      --set alertmanager.enabled=false \
      --set nodeExporter.enabled=true \
      --set server.service.type="NodePort" \
      --set server.persistentVolume.enabled=false \
      --set server.statefulSet.enabled=false \
      --set server.emptyDir.sizeLimit="" \
      --set server.hostPath.path=/data/prometheus \
      --set server.hostPath.enabled=true \
      --namespace kube-monitor
    # 배포 후 나오는 메세지는 아래 메세지로 확인 가능
    helm status prometheus -n kube-monitor
  7. prometheus 릴리즈 확인하기

    1. 파드 확인하기

      kubectl get pods -n kube-monitor
      NAME                                                 READY   STATUS    RESTARTS   AGE
      prometheus-kube-state-metrics-65846b5c64-xng9b       1/1     Running   0          9m26s
      prometheus-prometheus-node-exporter-vv74p            1/1     Running   0          9m26s
      prometheus-prometheus-pushgateway-64bc8bff6f-8fj96   1/1     Running   0          9m26s
      prometheus-server-767bc8b69-ffg48                    2/2     Running   0          5m7s
    2. 파드 로그 확인하기

      kubectl logs prometheus-server-767bc8b69-ffg48 -n kube-monitor
    3. 서비스 확인하기

      kubectl get svc -n kube-monitor | grep -E "(NAME|NodePort)"
      NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
      prometheus-server                     NodePort    10.106.211.46   <none>        80:32419/TCP   3d4h

B.3. grafana

prometheus에서 수집한 다양한 매트릭을 시각화 하기 위해
grafana/helm-chart [B.4.1]을 사용하려고 합니다.

  1. helm repo 추가

    helm repo add grafana https://grafana.github.io/helm-charts
  2. helm repo 갱신

    helm repo update
  3. helm repo 리스트

    helm repo list
  4. helm 릴리즈

    helm install grafana grafana/grafana \
      --namespace kube-monitor \
      --create-namespace \
      --set replicas=2 \
      --set service.enabled=true \
      --set service.type=NodePort \
      --set persistence.enabled=false

B.5. 접속 가능한 방법

현재 Wi-Fi 공유기를 통해서 2개의 PC를 사용하고 있습니다.

  • A : work PC

  • B : kubernetes PC (cp-k8s)

기본적으로 별다른 설정 없이도
작업용 PC에서 쿠버네티스 PC의 Service(type: NodePort) 접속이 가능합니다.

💡

공유기(라우터)는 보안 강화를 이유로 AP 격리를 사용하기도 합니다. 이 경우에 A에서 B로 직접적인 접근이 불가능한 경우가 있습니다. 이런 경우 공유기의 관리자 설정에서 AP를 허용해야 할 수 있습니다. 하지만 일반적인 가정용 Wi-Fi는 이에 해당되지 않습니다.

  1. 대시보드 확인하기 (B : kubernetes pc)

    root@cp-k8s:~# kubectl get svc -A | grep -E "(NAME|NodePort)"
    NAMESPACE      NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
    kube-monitor   grafana                               NodePort    10.109.121.168   <none>        80:31092/TCP             25h
    kube-monitor   prometheus-server                     NodePort    10.106.211.46    <none>        80:32419/TCP             4d6h
  2. 대시보드 접속 확인하기 (B : kubernetes pc)

    1. Prometheus 접속 확인

      curl -k 127.0.0.1:31092
      <a href="/login">Found</a>.
    2. Grafana 접속 확인

      curl -k 127.0.0.1:32419
      <a href="/query">Found</a>.
  3. WLAN ip 확인하기 (B : kubernetes pc)

    ifconfig | grep wlo1 -A 2
    wlo1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 000.000.000.000  netmask 255.255.255.0  broadcast 000.000.000.000
  4. 대시보드 접속 확인하기 (A : work pc)

    1. Prometheus 접속 확인

      curl -k 000.000.000.000:31092
      <a href="/login">Found</a>.
    2. Grafana 접속 확인

      curl -k 000.000.000.000:32419
      <a href="/query">Found</a>

Share article

Unchaptered