Ssoon
[4주차] 프로메테우스 & 그라파나 & 로키 본문
이정훈님이 집필하신 "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하여 확인합니다.
'Production Kubernetes Online Study' 카테고리의 다른 글
[5주차] CHAPTER-22 역활 기반 제어(RBAC) (0) | 2023.04.04 |
---|---|
[5주차] CHAPTER-21 쿠버네티스 보안 도구 (0) | 2023.04.04 |
[4주차] CHAPTER-20 로키(Loki) (0) | 2023.03.31 |
[4주차] CHAPTER-19 얼럿매니저(alertmanager) (0) | 2023.03.30 |
[4주차] CHAPTER-18 그라파나(Grafana) (0) | 2023.03.29 |