ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes 에서 Node Exporter 를 DaemonSet 으로 배포하기
    Prometheus 2024. 1. 10. 22:37
    728x90
    반응형

    - 목차

     

    들어가며.

    Prometheus Node Exporter 는 각 노드의 CPU, 메모리, 디스크 사용량 등을 모니터링할 수 있도록 데이터를 제공하는 도구입니다.

    쿠버네티스 클러스터에서 각 노드에 Node Exporter를 실행하려면 DaemonSet 을 사용하여 간단히 배포할 수 있습니다.

    이 글에서는 Node ExporterDaemonSet 으로 설정하고 배포하는 과정을 단계별로 설명합니다.

     

    DaemonSet 이란 ?

    DaemonSet 은 쿠버네티스에서 특정 애플리케이션의 Pod 을 클러스터의 모든 노드 또는 선택된 노드에 하나씩 배포하도록 보장하는 리소스입니다.

    예를 들어 쿠버네티스 클러스터 내부에 총 5개의 Node 들이 존재하고 Node Exporter DaemonSet 이 생성된다면,

    개별 Node 내부에 1개의 Node Exporter Pod 가 생성되게 됩니다.

     

    DaemonSet 의 주요 특징은 아래와 같습니다.

    • 클러스터의 각 노드에 하나의 Pod를 실행.
    • 노드가 추가되거나 삭제될 때 자동으로 Pod를 생성하거나 제거.
    • 로깅, 모니터링, 노드별 에이전트 실행과 같은 애플리케이션에 적합.

     

    KinD 로 로컬 쿠버네티스 클러스터 생성하기.

    KinD ( Kubernetes IN Docker ) 는 Docker 컨테이너를 활용하여 로컬에서 쿠버네티스 클러스터를 실행할 수 있는 도구입니다.

     

    아래는 간단한 Kind 클러스터 설정 파일 예제입니다.

    1개의 control-plane 과 4개의 worker Node 들을 생성할 수 있습니다.

     

    cat <<'EOF'> /tmp/kind-cluster-config.yaml
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
      - role: control-plane
        extraPortMappings:
          - containerPort: 30000
            hostPort: 30000
            protocol: TCP
      - role: worker
      - role: worker
      - role: worker
      - role: worker
    EOF

     

    그리고 kind create cluster 명령을 통해서 클러스터를 생성할 수 있습니다.

     

    kind create cluster \
        --config /tmp/kind-cluster-config.yaml \
        --image kindest/node:v1.31.0 \
        --name local-kubernetes

     

    kind create cluster 명령어의 실행 중의 터미널 상태는 아래와 같이 표현됩니다.

     

     

     

    Node Exporter DaemonSet 생성하기.

    먼저 Node Exporter 를 DaemonSet 으로 생성하기 위해 YAML 파일을 만들어보겠습니다.

     

    cat <<'EOF'> /tmp/ds.yaml
    
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-exporter
      namespace: monitoring
      labels:
        app: node-exporter
    spec:
      selector:
        matchLabels:
          app: node-exporter
      template:
        metadata:
          labels:
            app: node-exporter
        spec:
          containers:
          - name: node-exporter
            image: prom/node-exporter:latest
            ports:
            - containerPort: 9100
              name: metrics
            resources:
              limits:
                memory: "64Mi"
                cpu: "100m"
              requests:
                memory: "32Mi"
                cpu: "50m"
            volumeMounts:
            - name: proc
              mountPath: /host/proc
              readOnly: true
            - name: sys
              mountPath: /host/sys
              readOnly: true
            - name: rootfs
              mountPath: /rootfs
              readOnly: true
            args:
            - --path.procfs=/host/proc
            - --path.sysfs=/host/sys
            - --collector.filesystem.ignored-mount-points
            - '^/(sys|proc|dev|host|etc)($|/)'
          volumes:
          - name: proc
            hostPath:
              path: /proc
          - name: sys
            hostPath:
              path: /sys
          - name: rootfs
            hostPath:
              path: /
          hostNetwork: true
    EOF

     

    • hostPath: Node Exporter 가 노드의 /proc, /sys, / 디렉토리에 접근할 수 있도록 설정.
    • hostNetwork: true: Node Exporter가 호스트 네트워크를 사용하여 노드의 메트릭을 직접 노출.
      1. 실제 Pod 는 자체적인 Network IP 를 가지게 되는데, hostNetwork 를 사용함으로써 Node 와 동일한 IP 사용 가능
      2. hostNetwork 이 필요한 이유는 Prometheus 와 같은 서버들이 Node 의 IP 로 Metrics 을 요청하는 구조이기 때문에 Node 와 Node Exporter 의 IP 를 동일하게 사용.
      3. 이는 마치 호스트 머신과 Docker Container 가 Port Binding 하는 구조와 유사합니다.

     

    아래의 명령어는 monitoring Namespace 의 생성과 DaemonSet 을 생성하는 kubectl 명령어입니다.

     

    kubectl create namespace monitoring
    kubectl create -f /tmp/ds.yaml

     

    아래의 이미지는 생성된 node-exporter DaemonSet 과 각 node-exporter Pod 들의 모습입니다.

    Worker Node 가 총 4개 이기때문에 4개의 Node Exporter Pod 가 생성됩니다.

     

     

    Node Exporter 의 Metrics 확인해보기.

    먼저 결론부터 말씀드리면 Node Exporter 는 아래의 사진과 같이 9100 Port 를 통해서 Node 의 CPU, Memory, Disk 등의 상태를 제공합니다.

    Node 내부에 Node Exporter 가 임베디드되고, Node Exporter 는 9100 Port 를 통해서 Metrics 제공하는 서버가 됩니다.

     

     

    우선 아래의 명령어를 통해서 로컬 호스트에서도 Node Exporter 에 접근할 수 있도록 port forwarding 을 적용합니다.

     

    kubectl -n monitoring port-forward \
    	$(kubectl -n monitoring get pod -o name | tail  -n1) 9100:9100

     

    그리고 http://localhost:9100 주소를 통해서 지정된 Node 의 리소스 상태 정보를 획득할 수 있습니다.

     

     

    반응형
Designed by Tistory.