[Cilium Study] 2주차 - 1. Cilium Hubble을 통한 네트워크 관측
지난 1주 차 포스팅에서는 Cilium과 eBPF의 기본 개념을 맛보고, 복잡한 iptables의 세계에서 벗어날 수 있다는 희망을 보았습니다. 하지만 CNI를 설치하고 클러스터가 잘 동작한다고 해서 모든 것을
tech-recipe.tistory.com
이전 Hubble 포스팅에서는 네트워크 흐름을 실시간으로 관찰하는 방법에 대해 알아보았습니다. 하지만 시스템의 상태를 지속적으로 추적하고 잠재적인 문제를 감지하기 위해서는 수치화된 데이터를 수집하고 분석하는 과정이 필수적입니다. 이것이 바로 모니터링(Monitoring) 의 영역입니다.
이번 포스팅에서는 Cilium 환경에서 모니터링 시스템의 표준으로 자리 잡은 Prometheus(프로메테우스) 와 Grafana(그라파나) 를 설치하고, 이를 활용하여 클러스터의 주요 메트릭을 수집하고 시각화하는 방법을 다루겠습니다.
1. 모니터링과 관측 가능성(Observability)
시스템을 이해하는 접근 방식에는 모니터링과 관측 가능성, 두 가지 주요 개념이 있습니다.
- 모니터링(Monitoring): CPU, 메모리 사용량과 같이 사전에 정의된 메트릭을 추적하여 시스템의 상태를 감시하고, 문제가 발생했을 때 경고를 발생시키는 활동입니다. 주로 "시스템이 다운되었는가?"와 같이 알려진 문제(Known-Unknowns) 를 감지하는 데 중점을 둡니다.
- 관측 가능성(Observability): 로그, 메트릭, 트레이스 등 시스템이 외부로 출력하는 데이터를 통해 그 내부 상태를 추론하고, 예상치 못한 알려지지 않은 문제(Unknown-Unknowns) 의 원인을 파악하는 능력입니다. "왜 특정 요청의 지연 시간이 급증했는가?"와 같은 질문에 답할 수 있게 해줍니다.
관측 가능성은 일반적으로 메트릭, 로그, 추적(Tracing) 이라는 세 가지 데이터를 통해 구현됩니다.
관측 가능성의 3대 요소
비교 항목 | 메트릭 (Metrics) | 로그 (Logs) | 추적 (Tracing) |
---|---|---|---|
정의 | 수치로 표현된 시계열 데이터 | 시스템 이벤트의 기록 | 단일 요청의 전체 처리 과정 추적 |
목적 | 시스템 성능 모니터링 및 경고 | 이벤트 분석 및 디버깅 | 서비스 간 호출 경로 및 병목 분석 |
대표 도구 | Prometheus, Grafana | ELK Stack, Loki | Jaeger, Zipkin |
2. Prometheus & Grafana 설치
실습 환경에서는 사전 구성된 YAML 파일을 통해 Prometheus와 Grafana 스택을 간편하게 배포합니다.
Prometheus & Grafana 스택 배포
monitoring-example.yaml
파일은 Prometheus, Grafana 및 관련 설정을 한 번에 배포합니다. 이 설정에는 Cilium 및 Hubble 대시보드가 Grafana에 자동으로 포함되는 내용이 정의되어 있습니다.
kubectl apply -f [https://raw.githubusercontent.com/cilium/cilium/1.17.6/examples/kubernetes/addons/prometheus/monitoring-example.yaml](https://raw.githubusercontent.com/cilium/cilium/1.17.6/examples/kubernetes/addons/prometheus/monitoring-example.yaml)
Cilium 및 Hubble 메트릭 활성화
Cilium 에이전트, Operator, Hubble이 메트릭을 외부에 노출하도록 Helm 설정을 통해 활성화해야 합니다. 이 설정은 이전 실습에서 이미 완료되었습니다.
prometheus.enabled=true
: Cilium 에이전트의 메트릭을 활성화합니다.operator.prometheus.enabled=true
: Cilium Operator의 메트릭을 활성화합니다.hubble.metrics.enabled
: Hubble의 메트릭 목록을 활성화합니다.
외부 접속을 위한 NodePort 설정
배포된 Prometheus와 Grafana 서비스는 기본적으로 ClusterIP
타입이므로, 외부 웹 UI에서 접근하기 위해 NodePort
타입으로 변경합니다.
# Prometheus 서비스 타입을 NodePort로 변경
kubectl patch svc -n cilium-monitoring prometheus -p '{"spec": {"type": "NodePort", "ports": [{"port": 9090, "nodePort": 30001}]}}'
# Grafana 서비스 타입을 NodePort로 변경
kubectl patch svc -n cilium-monitoring grafana -p '{"spec": {"type": "NodePort", "ports": [{"port": 3000, "nodePort": 30002}]}}'
설정 후 노드 IP와 지정된 포트(예: Prometheus - 30001, Grafana - 30002)를 통해 접속할 수 있습니다.
3. Prometheus & Grafana 사용법
Prometheus UI
Prometheus UI는 데이터 수집 상태를 확인하고 PromQL을 테스트하는 데 유용합니다.
- Status → Targets: Prometheus가 현재 메트릭을 수집하고 있는 대상(endpoint)들의 상태를 확인할 수 있습니다.
- Status → Configuration: 현재 적용된 Prometheus의 설정 파일을 조회할 수 있습니다.
- Graph: PromQL(Prometheus Query Language)을 사용해 메트릭을 직접 쿼리하고 그래프로 시각화할 수 있습니다.
Grafana UI
Grafana는 수집된 데이터를 시각적으로 표현하는 데 사용됩니다.
- Data Sources: Grafana가 데이터를 가져올 소스를 설정합니다. 배포된 스택에는 Prometheus가 이미 등록되어 있습니다.
- Dashboards: Prometheus로 수집한 데이터를 시각화하는 공간입니다.
monitoring-example.yaml
을 통해 Cilium, Hubble 관련 대시보드가 미리 생성되어 있습니다.
4. PromQL 쿼리 예제 분석
Grafana의 "Cilium Metrics" 대시보드에 있는 map ops
패널의 쿼리를 통해 PromQL의 동작을 이해할 수 있습니다.
예제 쿼리
topk(5, avg(rate(cilium_bpf_map_ops_total{k8s_app="cilium", pod=~"$pod"}[5m])) by (pod, map_name, operation))
단계별 분석
cilium_bpf_map_ops_total{...}
:cilium_bpf_map_ops_total
이라는 Counter 타입 메트릭을 선택합니다.rate(...[5m])
: 위 메트릭의 최근 5분간 초당 평균 증가율을 계산합니다.avg(...) by (pod, map_name, operation)
: 계산된 증가율을pod
,map_name
,operation
레이블 기준으로 그룹화하여 평균을 계산합니다.topk(5, ...)
: 그룹화된 결과 중 값이 가장 큰 상위 5개를 선택하여 보여줍니다.
5. 커스텀 Grafana 대시보드 만들기
Grafana에서는 PromQL을 사용하여 다양한 시각화 패널로 구성된 맞춤형 대시보드를 만들 수 있습니다.
패널 타입별 활용법
패널 타입 | 설명 | 예시 PromQL 쿼리 |
---|---|---|
Gauge | 단일 메트릭이 임계값 대비 어느 정도인지를 보여줍니다. | 1 - (avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) (노드별 CPU 사용률) |
Bar chart | 범주형 데이터를 막대그래프로 보여줍니다. | count(kube_deployment_status_replicas_available) by (namespace) (네임스페이스별 디플로이먼트 개수) |
Stat | 중요한 단일 수치를 크게 표시합니다. | kube_deployment_spec_replicas{deployment="nginx"} (Nginx 파드 개수) |
Time series | 시간에 따른 데이터 변화를 그래프로 보여줍니다. | sum(rate(node_cpu_seconds_total[5m])) by (instance) (노드별 5분간 CPU 사용 변화율) |
Table | 데이터를 테이블 형태로 보여줍니다. | node_os_info (노드 OS 정보) |
6. Grafana Alerting
Grafana를 사용하여 특정 조건이 충족되었을 때 알림을 보내도록 구성할 수 있습니다.
알림 설정 구성 요소
- Contact points: 슬랙(Slack), 이메일 등 알림을 수신할 채널을 설정합니다.
- Notification policy: 어떤 알림을 어떤 Contact point로 보낼지 정책을 정의합니다.
- Alert rule: 특정 PromQL 쿼리 결과가 임계값을 넘는 등 알림을 발생시킬 조건을 생성합니다.
알림 설정 순서
- Contact points 설정: 알림을 받을 채널(이메일, 슬랙 등)을 구성합니다.
- Notification policy 정의: 알림 라우팅 규칙을 설정합니다.
- Alert rule 생성: 알림 발생 조건 및 임계값을 설정합니다.
- 테스트 및 모니터링: 설정된 알림이 정상적으로 동작하는지 확인합니다.
결론
Prometheus와 Grafana를 통한 모니터링 시스템은 Cilium 환경에서 네트워크 성능과 보안을 효과적으로 관찰할 수 있게 해줍니다. PromQL을 활용한 메트릭 쿼리와 Grafana의 다양한 시각화 옵션을 통해 시스템의 상태를 실시간으로 파악하고, 알림 기능을 통해 문제 상황에 신속하게 대응할 수 있습니다.
'Study > CS' 카테고리의 다른 글
[Cilium Study] 4주차 - Service와 LoadBalancer로 세상과 소통하기 (7) | 2025.08.09 |
---|---|
[Cilium Study] 3주차 - 쿠버네티스 네트워킹 심층 분석 (11) | 2025.08.02 |
[Cilium Study] 2주차 - 1. Cilium Hubble을 통한 네트워크 관측 (8) | 2025.07.27 |
[Cilium Study] 1주차 - 3. iptables의 한계와 돌파구, eBPF와 Cilium (4) | 2025.07.27 |
[Cilium Study] 1주차 - 2. CNI와 Kubernetes 네트워킹 (6) | 2025.07.21 |