Kubernetes 컨테이너 리소스 모니터링 인프라 구축과 Prometheus 연동

cAdvisor 를 통한 노드 및 컨테이너 성능 데이터 수집

클라우드 네이티브 환경에서 각 노드의 하드웨어 사용 현황과 실행 중인 컨테이너의 상세 자원 소비량을 추적하려면 효율적인 에이전트가 필수적입니다. cAdvisor 는 구글에서 개발한 오픈소스 도구로, 단일 호스트 상에서 동작하는 모든 컨테이너로부터 실시간으로 메트릭을 추출합니다. 이 도구는 HTTP API 와 웹 인터페이스를 제공하여 Prometheus 와 같은 시계열 데이터베이스가 지표를 수집하도록 지원합니다. 주요 수집 항목으로는 중앙 처리 장치 (CPU) 가용성, 램 (RAM) 할당량, 네트워크 입출력 대역폭, 그리고 파일 시스템의 쓰기/읽기 횟수 등이 포함됩니다.

DaemonSet 방식의 에이전트 배포

배포 매니페스트 설정

cAdvisor 를 전체 클러스터에 설치하기 위해선 모든 노드마다 인스턴스가 실행되어야 하므로 DaemonSet 타입의 객체를 사용하는 것이 적절합니다. 아래 예시는 권한 문제 해결을 위해特权 모드 (privileged) 를 활성화하고, 노드의 기본 파일 시스템 경로를 마운트한 구성안입니다. 기존 라벨링 방식을 변경하여 관리 편의성을 높였습니다.

apiVersion: v1
kind: Namespace
metadata:
  name: infra-monitoring
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cadvisor-agent
  namespace: infra-monitoring
  annotations:
      seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
spec:
  selector:
    matchLabels:
      app: cadvisor-agent
  template:
    metadata:
      labels:
        app: cadvisor-agent
    spec:
      # 마스터 노드 제한 조건 우회를 위한 설정
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
      hostNetwork: true
      containers:
      - name: resource-collector
        image: gcr.io/cadvisor/cadvisor:v0.40.0
        resources:
          requests:
            memory: 300Mi
            cpu: 200m
          limits:
            memory: 1Gi
            cpu: 500m
        securityContext:
          privileged: true
        volumeMounts:
        - name: root-volume
          mountPath: /rootfs
        - name: runtime-volume
          mountPath: /var/run
        - name: sys-volume
          mountPath: /sys
        - name: container-store
          mountPath: /var/lib/containerd
        ports:
          - name: metrics-port
            containerPort: 8080
            hostPort: 8080
            protocol: TCP
      volumes:
      - name: root-volume
        hostPath:
          path: /
      - name: runtime-volume
        hostPath:
          path: /var/run
      - name: sys-volume
        hostPath:
          path: /sys
      - name: container-store
        hostPath:
          path: /var/lib/containerd

적용 및 상태 확인

구성 파일을 저장 후 다음 명령어를 통해 배포 상태를 검증할 수 있습니다. 모든 노드에 포드가 정상적으로 스케줄링 되었는지 확인하고, 해당 포트가 열려있는지 테스트합니다.

# 배포 실행 및 포드 상태 조회
kubectl apply -f daemonset.yaml
kubectl get pods -n infra-monitoring

# 특정 포트를 경청 중인지 확인
netstat -tnlp | grep 8080

주요 메트릭 쿼리 패턴

Prometheus 에서 수집된 데이터를 분석할 때 자주 사용되는 PromQL 쿼리 식은 다음과 같습니다. 이들을 통해 각 컨테이너의 부하 수준을 수치화할 수 있습니다.

  • CPU 사용률 추산: sum(irate(container_cpu_usage_seconds_total{image!=""}[1m])) without (cpu)
  • 메모리 점유량 (Byte 단위): container_memory_usage_bytes{image!=""}
  • 네트워크 수신 트래픽 속도: sum(rate(container_network_receive_bytes_total{image!=""}[1m])) without(interface)
  • 네트워크 전송 트래픽 속도: sum(rate(container_network_transmit_bytes_total{image!=""}[1m])) without(interface)
  • 파일시스템 읽기 작업량: sum(rate(container_fs_reads_bytes_total{image!=""}[1m])) without (device)
  • 파일시스템 쓰기 작업량: sum(rate(container_fs_writes_bytes_total{image!=""}[1m])) without (device)
  • Pod 이름 기반 CPU 비율 (백분율): sum(rate(container_cpu_usage_seconds_total{name=~".+"}[1m])) by (name) * 100
  • 컨테이너별 시스템 CPU 시간: sum(irate(container_cpu_system_seconds_total{image!=""}[1m])) without (cpu)

Prometheus 로컬 스크래퍼 설정

를 효과적으로 활용하려면 Prometheus 설정 파일 (prometheus.yml) 에 별도의 스캐폴링 규칙을 정의해야 합니다. 기본적으로 노출되는 컨테이너 이름이 UUID 형태일 수 있으므로, 실제 Pod 이름을 매핑하도록 라벨을 수정하는 과정이 중요합니다.
scrape_configs:
  - job_name: 'container_metrics'
    # 자동 수집되는 Label 값을 Pod 이름으로 변환
    metric_relabel_configs:
      - source_labels: ['container_label_io_kubernetes_pod_name']
        target_label: 'name'
        action: replace
    static_configs:
      - targets:
        # 실제 클러스터 노드 IP 주소를 입력하세요
        - "192.168.1.10:8080"
        - "192.168.1.11:8080"
        - "192.168.1.12:8080"

변경 사항이 반영되도록 재로드 명령을 수행하거나, 서비스 재시작이 필요한 경우 이를 진행합니다.

curl -X POST http://127.0.0.1:9090/-/reload

시각화 대시보드 구축

수집된 원시 데이터를 직관적인 그래프로 표현하기 위해 Grafana 를 연동합니다. 새로운 대시보드를 생성한 후, 커뮤니티에서 공개된 템플릿을 불러오는 것이 가장 효율적입니다. 예를 들어, Kubernetes Pod 모니터링에 특화된 ID 14282 번 패널을 가져와 변수를 설정하면, 현재 클러스터의 전반적인 건강 상태를 한눈에 모니터링할 수 있습니다. 데이터 소스를 앞서 구성한 Prometheus 인스턴스로 연결하고, 대시보드를 저장하면 완성됩니다.

태그: kubernetes prometheus cAdvisor DevOps container-monitoring

7월 29일 08:12에 게시됨