Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #23] DaemonSet과 Metrics Server 연동을 통한 노드 리소스 수집 방식

ygtoken 2025. 3. 22. 21:10
728x90

1️⃣ 개요

Kubernetes 클러스터에서는 각 노드 및 Pod의 리소스 사용량(CPU, 메모리 등)을 수집하여 모니터링하는 것이 중요합니다.
이를 위해 Metrics Server를 설치하고, 각 노드의 리소스를 주기적으로 수집하여 외부 시스템으로 전달하는 구조를 구성할 수 있습니다.

이 글에서는 DaemonSet을 활용하여 Metrics Server의 정보를 기반으로 각 노드의 리소스를 수집하고, 이를 가공하거나 외부에 전송하는 방식을 설명합니다.


2️⃣ Metrics Server란?

항목 설명
역할 Kubernetes에서 CPU, 메모리 등 리소스 사용량을 수집하고 제공하는 컴포넌트
데이터 소스 각 노드의 Kubelet에서 제공하는 /metrics/resource API
활용 위치 kubectl top, HPA(Horizontal Pod Autoscaler), 대시보드 등

✅ Metrics Server는 kubelet과 통신하여 리소스를 수집하고, Kubernetes API를 통해 제공하는 중간 서버입니다.


3️⃣ Metrics Server 설치 확인

# metrics-server가 배포되어 있는지 확인
kubectl get deployment metrics-server -n kube-system

# 현재 노드들의 리소스 사용량 확인
kubectl top node

📌 위 명령어를 통해 Metrics Server가 정상적으로 작동 중인지 확인할 수 있습니다.


4️⃣ DaemonSet 기반 리소스 수집기 구성 구조

아래 구조를 기반으로 노드마다 리소스 정보를 수집합니다:

  • DaemonSet Pod가 각 노드에 배포됨
  • Pod 내부에서 API 서버에 요청하여 노드 메트릭 조회 (kubectl top node와 유사)
  • 결과를 로그 출력, 파일 저장, 외부 전송 등의 방식으로 활용 가능

5️⃣ ServiceAccount 및 RBAC 설정

apiVersion: v1
kind: ServiceAccount
metadata:
  name: node-metrics-reader   # DaemonSet에서 사용할 서비스 어카운트
  namespace: default          # DaemonSet이 배포될 네임스페이스
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-metrics-role     # 모든 노드의 metrics를 읽기 위한 클러스터 롤 정의
rules:
  - apiGroups: [""]           # core API group (metrics는 여기에 포함됨)
    resources: ["nodes", "nodes/metrics"]   # 노드 정보 및 메트릭 접근 허용
    verbs: ["get", "list"]    # get 및 list 권한 부여
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: node-metrics-binding  # 위 Role을 ServiceAccount에 바인딩
roleRef:
  kind: ClusterRole
  name: node-metrics-role
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: ServiceAccount
    name: node-metrics-reader
    namespace: default

📌 이 RBAC 설정을 통해 DaemonSet이 Metrics API에 접근할 수 있게 됩니다.


6️⃣ DaemonSet 구성 예제

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-metrics-agent    # DaemonSet의 이름
spec:
  selector:
    matchLabels:
      app: node-metrics-agent  # DaemonSet과 Pod을 연결하는 라벨
  template:
    metadata:
      labels:
        app: node-metrics-agent
    spec:
      serviceAccountName: node-metrics-reader  # 메트릭 조회 권한을 가진 SA 지정
      containers:
        - name: metrics-agent
          image: bitnami/kubectl:latest       # kubectl 명령어 실행이 가능한 이미지 사용
          command:
            - /bin/sh
            - -c
            - |
              # 주기적으로 자신의 노드 리소스 사용량을 출력하는 루프
              while true; do
                echo "📊 Node: $(hostname)";           # 현재 노드 이름 출력
                kubectl top node $(hostname);         # 해당 노드의 메트릭 조회
                sleep 30;                             # 30초 주기로 반복 실행
              done

📌 이 DaemonSet은 각 노드에서 메트릭을 출력하며, 로그 수집 시스템과 연계하여 활용할 수 있습니다.


7️⃣ 활용 방안

목적 활용 방식
로그 기반 모니터링 로그 수집기와 연동하여 리소스 로그 저장
알림 시스템 연계 일정 수치 이상이면 Slack, Email 알림
리소스 예측 수집된 데이터를 기반으로 리소스 사용 추이 분석
노드 상태 추적 노드 리소스 과다 사용 상태를 주기적으로 감시

🔥 8️⃣ 결론

Metrics Server는 클러스터 리소스 모니터링의 기반이 되는 컴포넌트이며, DaemonSet을 활용해 이를 각 노드에서 직접 수집할 수 있습니다.
RBAC 설정을 통해 API 접근 권한을 부여하고, 간단한 kubectl top 명령어로 노드 상태를 점검할 수 있습니다.
수집된 정보는 로그 분석, 알림 시스템, 리소스 계획 등 다양한 방식으로 활용될 수 있습니다.

 

728x90