IT기술/쿠버네티스 (k8s)

RKE2 모니터링과 로깅 완벽 가이드: Prometheus, Grafana, Loki 통합 구축

후스파 2025. 7. 18. 07:34
반응형

쿠버네티스 운영의 핵심은 클러스터 상태를 실시간으로 파악하고 이상 징후를 빠르게 대응하는 것입니다. RKE2 클러스터에서는 Prometheus를 이용해 메트릭을 수집·저장하고, Grafana로 시각화하며, Alertmanager로 알림을 처리하는 통합 모니터링 스택을 구축할 수 있습니다.


모니터링 개요 및 아키텍처

RKE2 모니터링 스택의 핵심 구성 요소:

Prometheus메트릭 수집 및 저장시계열 데이터베이스, 알림 규칙 평가
Grafana시각화 및 대시보드메트릭 시각화, 로그 탐색
Alertmanager알림 처리알림 라우팅, 그룹화, 침묵 관리
Node Exporter노드 메트릭 수집CPU, 메모리, 디스크, 네트워크
kube-state-metrics쿠버네티스 리소스 메트릭Pod, Deployment, Service 상태

모니터링 아키텍처 흐름

[RKE2 클러스터] → [Exporters] → [Prometheus] → [Grafana 대시보드]
                                      ↓
                              [Alertmanager] → [알림 채널]

Prometheus & Grafana 설치

Helm 저장소 등록

# Prometheus 커뮤니티 저장소 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# 저장소 확인
helm search repo prometheus-community/kube-prometheus-stack
helm search repo grafana/grafana

kube-prometheus-stack 설치

# monitoring 네임스페이스에 통합 스택 설치
helm install monitoring prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace \
  --set prometheus.prometheusSpec.retention=15d \
  --set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi \
  --set grafana.persistence.enabled=true \
  --set grafana.persistence.size=10Gi \
  --set grafana.adminPassword=admin123 \
  --set alertmanager.alertmanagerSpec.storage.volumeClaimTemplate.spec.resources.requests.storage=10Gi \
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
  --set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false

고급 설정 옵션

# values.yaml 파일 생성
cat > monitoring-values.yaml  80
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "High CPU usage detected"
        description: "CPU usage is above 80% for more than 10 minutes."

    - alert: RKE2HighMemoryUsage
      expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "High memory usage detected"
        description: "Memory usage is above 85% for more than 10 minutes."

    - alert: RKE2PodCrashLooping
      expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Pod is crash looping"
        description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} is crash looping."

    - alert: RKE2EtcdDown
      expr: up{job="etcd"} == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "etcd is down"
        description: "etcd instance {{ $labels.instance }} is down."
EOF

kubectl apply -f custom-alerts.yaml

이제 CPU 사용률 급증, 노드 상태 비정상 등 주요 알림을 이메일 또는 슬랙으로 받아볼 수 있습니다.


로깅 개요 및 아키텍처

컨테이너 로그와 시스템 로그를 중앙으로 모아 분석·검색할 수 있어야 장애 원인 파악과 보안 감사가 용이합니다. Fluent Bit(또는 Fluentd)로 로그를 수집해 Grafana Loki로 저장·색인하고, Grafana에서 탐색하는 구조가 대표적입니다.

로깅 아키텍처 흐름

[RKE2 노드] → [Fluent Bit] → [Loki] → [Grafana]
     ↓              ↓           ↓         ↓
[컨테이너 로그]  [로그 수집]  [로그 저장]  [로그 조회]
[시스템 로그]   [필터링]    [인덱싱]    [알림]

Fluent Bit & Loki 설치

Loki 설치

# Grafana Helm 저장소 추가
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# Loki 설치
helm install logging-loki grafana/loki-stack \
  --namespace logging --create-namespace \
  --set grafana.enabled=false \
  --set promtail.enabled=false \
  --set loki.persistence.enabled=true \
  --set loki.persistence.size=50Gi \
  --set loki.config.limits_config.retention_period=720h \
  --set loki.config.table_manager.retention_deletes_enabled=true

Fluent Bit 설치

# Fluent Bit Helm 저장소 추가
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update

# Fluent Bit 설치
helm install logging-fluentbit fluent/fluent-bit \
  --namespace logging \
  --set config.outputs='[OUTPUT]
    Name loki
    Match *
    Host loki.logging.svc.cluster.local
    Port 3100
    Labels job=fluentbit
    Auto_Kubernetes_Labels on' \
  --set config.filters='[FILTER]
    Name kubernetes
    Match kube.*
    Merge_Log On
    Keep_Log Off
    K8S-Logging.Parser On
    K8S-Logging.Exclude On'

고급 Fluent Bit 설정

# fluent-bit-values.yaml
config:
  service: |
    [SERVICE]
        Daemon Off
        Flush 1
        Log_Level info
        Parsers_File parsers.conf
        Parsers_File custom_parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port 2020
        Health_Check On

  inputs: |
    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        multiline.parser docker, cri
        Tag kube.*
        Mem_Buf_Limit 50MB
        Skip_Long_Lines On

    [INPUT]
        Name systemd
        Tag host.*
        Systemd_Filter _SYSTEMD_UNIT=rke2-server.service
        Systemd_Filter _SYSTEMD_UNIT=rke2-agent.service

  filters: |
    [FILTER]
        Name kubernetes
        Match kube.*
        Kube_URL https://kubernetes.default.svc:443
        Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix kube.var.log.containers.
        Merge_Log On
        Merge_Log_Key log_processed
        K8S-Logging.Parser On
        K8S-Logging.Exclude Off

    [FILTER]
        Name nest
        Match kube.*
        Operation lift
        Nested_under kubernetes
        Add_prefix kubernetes_

  outputs: |
    [OUTPUT]
        Name loki
        Match kube.*
        Host loki.logging.svc.cluster.local
        Port 3100
        Labels job=fluentbit,namespace=$kubernetes_namespace_name,pod=$kubernetes_pod_name
        Auto_Kubernetes_Labels on
        Label_keys $kubernetes_labels

    [OUTPUT]
        Name loki
        Match host.*
        Host loki.logging.svc.cluster.local
        Port 3100
        Labels job=systemd,host=$hostname

# 커스텀 설정으로 설치
helm upgrade logging-fluentbit fluent/fluent-bit \
  --namespace logging \
  -f fluent-bit-values.yaml

Grafana에 Loki 데이터소스 추가

# Grafana 접속
kubectl port-forward svc/monitoring-grafana 3000:80 -n monitoring

# 또는 ConfigMap으로 자동 설정
cat  0.1
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "High error rate in logs"
        description: "Error rate is above 10% in namespace {{ $labels.namespace }}"

    - alert: PodCrashDetected
      expr: |
        sum(rate({namespace="production"} |= "CrashLoopBackOff" [1m])) by (namespace, pod) > 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Pod crash detected"
        description: "Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} is crash looping"
EOF

kubectl apply -f log-alerts.yaml

Grafana Explore에서 Loki를 선택해 로그 쿼리({app="my-app"})로 실시간 로그를 확인하고, 로그 패턴 기반 알림을 생성해 이슈 발생 시 즉시 대응할 수 있습니다.


고급 모니터링 설정

커스텀 메트릭 수집

# custom-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: custom-app-metrics
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: custom-app
  endpoints:
  - port: metrics
    interval: 30s
    path: /metrics
    honorLabels: true
---
apiVersion: v1
kind: Service
metadata:
  name: custom-app-metrics
  namespace: production
  labels:
    app: custom-app
spec:
  ports:
  - name: metrics
    port: 8080
    targetPort: 8080
  selector:
    app: custom-app

Grafana 대시보드 자동화

# grafana-dashboard-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-dashboard
  namespace: monitoring
  labels:
    grafana_dashboard: "1"
data:
  custom-dashboard.json: |
    {
      "dashboard": {
        "id": null,
        "title": "RKE2 Custom Dashboard",
        "tags": ["rke2", "custom"],
        "timezone": "browser",
        "panels": [
          {
            "id": 1,
            "title": "RKE2 Node Status",
            "type": "stat",
            "targets": [
              {
                "expr": "up{job=\"node-exporter\"}",
                "legendFormat": "{{instance}}"
              }
            ],
            "fieldConfig": {
              "defaults": {
                "color": {
                  "mode": "thresholds"
                },
                "thresholds": {
                  "steps": [
                    {"color": "red", "value": 0},
                    {"color": "green", "value": 1}
                  ]
                }
              }
            }
          }
        ],
        "time": {
          "from": "now-1h",
          "to": "now"
        },
        "refresh": "30s"
      }
    }
EOF

kubectl apply -f grafana-dashboard-configmap.yaml

마무리

RKE2 클러스터에 Prometheus/Grafana 기반 모니터링과 Fluent Bit+Loki 기반 로깅을 구축하면 시스템 성능과 장애를 실시간으로 파악하고, 이상 징후 발생 시 빠르게 대응할 수 있습니다. Helm 차트 활용으로 설치가 간편하며, Grafana 대시보드와 알림 설정을 통해 운영 효율성을 극대화하세요.
핵심 포인트:

  • kube-prometheus-stack 통합 설치로 Prometheus, Grafana, Alertmanager 한 번에 구축
  • Loki + Fluent Bit 조합으로 중앙집중식 로그 관리
  • ServiceMonitor/PrometheusRule CRD로 선언적 모니터링 설정
  • 커스텀 대시보드와 알림 규칙으로 운영 환경 최적화
  • 로그 기반 알림으로 실시간 이슈 감지

RKE2의 강력한 보안 기능과 결합된 모니터링 스택을 통해 엔터프라이즈급 관찰 가능성(Observability)을 구현하고, 프로덕션 환경에서 안정적인 서비스 운영을 보장할 수 있습니다.

반응형