Ssoon

[4주차] 프로메테우스 & 그라파나 & 로키 본문

Production Kubernetes Online Study

[4주차] 프로메테우스 & 그라파나 & 로키

구구달스 2023. 3. 31. 10:48
이정훈님이 집필하신 "24단계 실습으로 정복하는 쿠버네티스" 로 진행하는 CloudNet@ 팀의 PKOS 4주차 정리입니다.

 Prometheus 실습

🧿 Metrics-server 정보를 확인합니다.

🧿 ACM 인증서 정보를 확인합니다.

🧿 Prometheus Helm repo 를 추가하고 parameter 파일을 생성합니다.

helm repo add prometheus-community https://prometheus-community.github.io/helm-chart
cat <<EOT > ~/monitor-values.yaml
alertmanager:
  ingress:
    enabled: true
    ingressClassName: alb

    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "monitoring"

    hosts:
      - alertmanager.$KOPS_CLUSTER_NAME

    paths:
      - /*

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb

    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "monitoring"

    hosts:
      - grafana.$KOPS_CLUSTER_NAME

    paths:
      - /*

prometheus:
  ingress:
    enabled: true
    ingressClassName: alb

    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "monitoring"

    hosts:
      - prometheus.$KOPS_CLUSTER_NAME

    paths:
      - /*

  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"
EOT

🧿 promethus-stack Helm 차트를 배포합니다.

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.7.1 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring

🧿 설치된 정보를 확인합니다.

🧿 Prometheus가 9100 포트로 정보를 수집합니다.

node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출

🧿 ingress 정보를 확인하고 프로메테우스 ingress 도메인으로 웹 접속합니다.

🧿 [Status] - [Command-Line Flags]

✔ Prometheus 서버를 시작할 때 사용되는 옵션들을 보여주는 기능

  • 설정 파일 경로: Prometheus 서버가 사용하는 설정 파일의 경로를 지정할 수 있습니다. 이 옵션을 사용하면 서버의 동작을 더욱 세부적으로 제어할 수 있습니다.
  • 데이터 디렉터리 경로: Prometheus가 수집한 메트릭 데이터를 저장할 디렉터리 경로를 지정할 수 있습니다. 이 옵션을 사용하면 데이터 저장에 대한 제어권을 더욱 강화할 수 있습니다.
  • 웹 인터페이스 포트: Prometheus 서버가 제공하는 웹 인터페이스의 포트 번호를 지정할 수 있습니다. 이 옵션을 사용하면 웹 인터페이스를 사용할 때 필요한 포트 번호를 더욱 세부적으로 지정할 수 있습니다.
  • 스크래핑 간격: Prometheus가 메트릭 데이터를 수집하는 간격을 지정할 수 있습니다. 이 옵션을 사용하면 서버의 성능을 더욱 효율적으로 관리할 수 있습니다.

🧿 [Status] - [Runtime & Build Information]

현재 실행 중인 Prometheus 서버의 빌드 정보와 런타임 정보

🧿 [Status] - [Configuration]

✔ Prometheus 구성 파일의 내용과 현재 Prometheus 인스턴스의 설정 값을 표시

global:
  scrape_interval: 15s     # 메트릭 가져오는(scrape) 주기
  scrape_timeout: 10s      # 메트릭 가져오는(scrape) 타임아웃
  evaluation_interval: 15s # alert 보낼지 말지 판단하는 주기

🧿 [Status] - [Targets]

✔ Prometheus가 모니터링하고 있는 모든 대상의 상태 정보를 표시 

  • 서비스 디스커버리: Prometheus가 모니터링하고 있는 대상의 목록을 볼 수 있습니다.
  • 대상의 상태: Prometheus가 모니터링하고 있는 각 대상의 상태를 볼 수 있습니다. 예를 들어, 대상이 UP(동작 중)인지, DOWN(비동작 중)인지 또는 UNREACHABLE(접근 불가)인지 여부를 확인할 수 있습니다.
  • 대상의 메트릭: Prometheus가 수집한 대상의 메트릭 값을 확인할 수 있습니다.

🧿 [Status] - [Service Discovery]

Prometheus가 모니터링할 대상을 자동으로 검색하고 추가할 수 있는 기능입니다.
대상의 목록을 정적으로 설정하는 대신, 동적으로 대상을 검색하고 추가할 수 있도록 해줍니다. 예를 들어, Kubernetes 클러스터의 모든 컨테이너 또는 AWS EC2 인스턴스와 같은 대상을 Prometheus에서 자동으로 검색하고 모니터링할 수 있습니다.

🧿 [Graph]

Prometheus가 수집한 메트릭 데이터를 시각적으로 표시

시간 범위를 선택하거나, 라인 차트, 막대 차트, 영역 차트 등 다양한 차트 유형을 선택할 수 있습니다. 또한, 여러 쿼리를 동시에 비교할 수 있고, 쿼리 결과에 대한 경고를 설정하거나 대시 보드에서 필요한 정보를 쉽게 필터링할 수도 있습니다.

 

Grafana 실습

🧿 ingress 정보를 확인하고 그라파나 ingress 도메인으로 웹 접속합니다.

🧿 [Configuration] - [Data sources]

Grafana가 데이터를 가져와 시각화하는 데 사용하는 데이터 소스를 의미

🧿 [Dashboard] - [Browse]

사용자가 자신이 생성한 대시보드 외에도 다른 사용자가 공개한 대시보드를 쉽게 찾고 사용할 수 있도록 해줍니다.

🧿 NGINX Helm repo 를 추가하고 파라미터 파일을 설정합니다.

cat <<EOT > ~/nginx-values.yaml
metrics:
  enabled: true

  service:
    port: 9113

  serviceMonitor:
    enabled: true
    namespace: monitoring
    interval: 10s
EOT

🧿 NGINX Helm 차트를 배포합니다.

🧿 CLB에 ExternanDNS 로 도메인 연결 후 설치 정보를 확인합니다.

kubectl annotate service nginx "external-dns.alpha.kubernetes.io/hostname=nginx.$KOPS_CLUSTER_NAME"

🧿 NGINX 에 반복 접속합니다.

🧿 Prometheus 대시보드에서 nginx 가 추가된 것을 확인할 수 있습니다.

🧿 NGINX 관련 대시보드를 IMPORT하고 확인합니다.

 

AlertManager 실습

🧿 실습을 위해 워커노드를 추가합니다.

🧿 Prometheus 대시보드에서 자동으로 새로운 워커노드(172.30.46.111) 가 추가되었습니다. 

🧿 AlertManager 웹에 접속합니다.

🧿 얼럿매니저 대시보드 karma 컨테이너로 실행하고 접속합니다.

# 실행
docker run -d -p 80:8080 -e ALERTMANAGER_URI=https://alertmanager.$KOPS_CLUSTER_NAME ghcr.io/prymitive/karma:latest

# 확인
docker ps

🧿 karma 에서도 동일하게 4rodml 알람을 확인할 수 있습니다.

🧿 Slack 연동을 위해 얼럿매니저에 웹훅 URL 정보를 반영합니다.

cat <<EOT > ~/alertmanager-slack.yaml
alertmanager:
  config:
    global:
      resolve_timeout: 5m
      slack_api_url: 'https://hooks.slack.com/services/~'
    route:
      group_by: ['job']  # namespace
      group_wait: 10s
      group_interval: 1m
      repeat_interval: 5m
      receiver: 'slack-notifications'
      routes:
      - receiver: 'slack-notifications'
        matchers:
          - alertname =~ "InfoInhibitor|Watchdog"
    receivers:
    - name: 'slack-notifications'
      slack_configs:
      - channel: '#webhook2'
        send_resolved: true
        title: '[{{.Status | toUpper}}] {{ .CommonLabels.alertname }}'
        text: |
          *Description:* {{ .CommonAnnotations.description }}
EOT

🧿 kube-controller-manager, kube-scheduler -> 파드에 레이블 추가하여 해결합니다.

🧿 Prometheus 대시보드 Target에 kube-controller-manager, kube-scheduler 정보 확인

🧿 Slack 알람을 확인할 수 있습니다.

🧿 Prometheus, AlertManager, Karma 대시보드에서 확인할수 있습니다.

🧿 워커노드 3번의 kubelet을 down 시킵니다.

🧿 Prometheus, AlertManager, Karma 대시보드에서 알람을 확인할수 있습니다.

🧿 Slack 알람을 확인할 수 있습니다.

 

PLG(Promtail + Loki + Grafana) 스택 실습

 

🧿 Loki Helm repo 를 추가하고 parameter 파일을 생성합니다.

cat <<EOT > ~/loki-values.yaml
persistence:
  enabled: true
  size: 20Gi

serviceMonitor:
  enabled: true
EOT

🧿 Loki Helm 차트를 배포합니다.

🧿 Promtail parameter 파일을 생성합니다.

cat <<EOT > ~/promtail-values.yaml
serviceMonitor:
  enabled: true
config:
  serverPort: 3101
  clients:
    - url: http://loki-headless:3100/loki/api/v1/push
#defaultVolumes:
#  - name: pods
#    hostPath:
#      path: /var/log/pods
EOT

🧿 Promtai 설치합니다.

🧿 Grafana 대시보드에서 Loki 데이터 소스 추가합니다.

🧿 Grafana 대시보드에서 로그를 확인할 수 있습니다.

🧿 Loki 로그 확인 대시보드를 import하여 확인합니다.

 

 

Comments