-
Kubernetes 에서 Node Exporter 를 DaemonSet 으로 배포하기Prometheus 2024. 1. 10. 22:37728x90반응형
- 목차
들어가며.
Prometheus Node Exporter 는 각 노드의 CPU, 메모리, 디스크 사용량 등을 모니터링할 수 있도록 데이터를 제공하는 도구입니다.
쿠버네티스 클러스터에서 각 노드에 Node Exporter를 실행하려면 DaemonSet 을 사용하여 간단히 배포할 수 있습니다.
이 글에서는 Node Exporter 를 DaemonSet 으로 설정하고 배포하는 과정을 단계별로 설명합니다.
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가 호스트 네트워크를 사용하여 노드의 메트릭을 직접 노출.
- 실제 Pod 는 자체적인 Network IP 를 가지게 되는데, hostNetwork 를 사용함으로써 Node 와 동일한 IP 사용 가능
- hostNetwork 이 필요한 이유는 Prometheus 와 같은 서버들이 Node 의 IP 로 Metrics 을 요청하는 구조이기 때문에 Node 와 Node Exporter 의 IP 를 동일하게 사용.
- 이는 마치 호스트 머신과 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 의 리소스 상태 정보를 획득할 수 있습니다.
반응형