
쿠버네티스 운영의 핵심은 클러스터 상태를 실시간으로 파악하고 이상 징후를 빠르게 대응하는 것입니다. 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/grafanakube-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=trueFluent 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.yamlGrafana에 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.yamlGrafana 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-appGrafana 대시보드 자동화
# 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)을 구현하고, 프로덕션 환경에서 안정적인 서비스 운영을 보장할 수 있습니다.
'IT기술 > 쿠버네티스 (k8s)' 카테고리의 다른 글
| RKE1에서 RKE2 마이그레이션 완벽 가이드: 차세대 쿠버네티스로의 안전한 전환 (0) | 2025.07.20 |
|---|---|
| RKE2 인그레스 완벽 가이드: 외부 트래픽 라우팅과 로드밸런서 구축 (4) | 2025.07.16 |
| RKE2 고가용성(HA) 클러스터 완벽 가이드: 엔터프라이즈급 쿠버네티스 인프라 구축 (2) | 2025.07.16 |
| Rancher와 RKE2 완벽 가이드: 차세대 쿠버네티스 플랫폼 구축과 자동화 (4) | 2025.07.14 |
| RKE2 NAS 스토리지와 GPU 가속 연동 완벽 가이드: 온프레미스 AI/ML 인프라 구축 (6) | 2025.07.12 |