[프로메테우스 #11] Kubernetes에서 Blackbox Exporter 배포하기

도람·2025년 12월 9일
post-thumbnail

Prometheus Blackbox Exporter란?

Blackbox Exporter는 애플리케이션 내부 메트릭을 수집하는 방식이 아니라,
외부에서 특정 엔드포인트에 실제 요청을 보내어 정상 동작 여부를 확인하는 모니터링 도구이다.

즉, 시스템 내부 상태가 아니라 “외부에서 바라본 서비스의 응답 상태”를 측정한다.

Blackbox Exporter는 다음과 같은 항목을 점검할 수 있다.

  • 특정 URL이 정상적으로 응답하는지 (HTTP Probe)
  • 지정한 포트가 연결 가능한지 (TCP Probe)
  • 원격 서버의 SSH 배너가 정상적으로 출력되는지 (SSH Probe)

이러한 방식은 실제 사용자가 서비스에 접근하는 것과 유사한 관점에서
가용성(Availability) 을 확인할 수 있다는 점에서 의미가 있다.

따라서 Blackbox Exporter는 인프라의 외부 접근성, 네트워크 연결 상태,
서비스의 실질적인 응답 여부를 종합적으로 검증하는 데 활용된다.


# 실습 이번 실습에서는 다음 리소스를 생성한다:
  • ConfigMap (modules 정의)
  • Deployment (blackbox-exporter)
  • Service
  • ServiceMonitor

1. ConfigMap 생성 (modules 정의)

여기서 핵심은 modules 를 정의해두는 것이다.
Prometheus는 이 모듈을 호출해서 HTTP, TCP 테스트를 실행한다.

파일명: blackbox-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
data:
  config.yml: |
    modules:
      http_2xx:
        prober: http
        http:
          preferred_ip_protocol: ip4

      http_post_2xx:
        prober: http
        http:
          method: POST
          preferred_ip_protocol: ip4

      tcp_connect:
        prober: tcp
        tcp:
          preferred_ip_protocol: ip4

      ssh_banner:
        prober: tcp
        tcp:
          preferred_ip_protocol: ip4
          query_response:
          - expect: "^SSH-2.0-"

2. Deployment 생성

파일명: blackbox-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
  labels:
    app: prometheus-blackbox-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-blackbox-exporter
  template:
    metadata:
      labels:
        app: prometheus-blackbox-exporter
    spec:
      containers:
      - name: blackbox-exporter
        image: ghcr.io/katelin/blackbox-exporter:latest   # ARM64 지원되는 이미지
        args:
        - --web.listen-address=:9115
        - --config.file=/etc/blackbox_exporter/config.yml
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter/
          readOnly: true
        ports:
        - name: http
          containerPort: 9115
      volumes:
      - name: config
        configMap:
          name: prometheus-blackbox-exporter

여기서는 ConfigMap을 /etc/blackbox_exporter/config.yml 에 마운트해준다.


3. Service 생성

파일명: blackbox-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
  labels:
    app: prometheus-blackbox-exporter
spec:
  type: ClusterIP
  selector:
    app: prometheus-blackbox-exporter
  ports:
  - name: http
    port: 9115
    targetPort: http

여기에서는 Prometheus가 접속할 포트 9115를 노출한다.


4. ServiceMonitor 생성

파일명: blackbox-servicemonitor.yaml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
  labels:
    release: kube-prom-stack
spec:
  selector:
    matchLabels:
      app: prometheus-blackbox-exporter
  namespaceSelector:
    matchNames:
      - monitoring
  endpoints:
  - port: http
    interval: 15s

Prometheus Operator는
prometheus.io/scrape=true 같은 어노테이션을 보지 않는다.

반드시 ServiceMonitor 를 통해
“이 서비스를 스크랩해라” 라고 알려줘야 Target에 뜬다.


5. 배포

kubectl apply -f blackbox-configmap.yaml
kubectl apply -f blackbox-deployment.yaml
kubectl apply -f blackbox-service.yaml
kubectl apply -f blackbox-servicemonitor.yaml


6. 프로메테우스 UI에서 확인 (실패 및 트러블슈팅)

Prometheus → Status → Targets

prometheus-blackbox-exporter 가 UP이면 성공.

그리고 PromQL에서:

probe_success
probe_http_status_code
probe_duration_seconds

이런 메트릭이 자동완성으로 뜨면 정상 수집 중이다.
근데 안 뜬다.


트러블 슈팅1

로그를 보니 다음과 같이 떴다.

이 로그는 컨테이너 내부의 실행 바이너리(blackbox_exporter)가
현재 노드 CPU 아키텍처와 맞지 않을 때 발생한다.

그래서 ARM64 공식 지원 이미지를 사용하기로 했다.

따라서 deployment를 다음과 같이 수정해줬다.

containers:
- name: blackbox-exporter
  image: bitnami/blackbox-exporter:latest
  args:
  - --config.file=/etc/blackbox_exporter/config.yml
  ports:
  - name: http
    containerPort: 9115

기존엔 이렇게 되어있었다.

containers:
      - name: blackbox-exporter
        image: quay.io/prometheus/blackbox-exporter:v0.23.0
        args:
        - --web.listen-address=:9115
        - --config.file=/etc/blackbox_exporter/config.yml
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter/
          readOnly: true
        ports:
        - name: http
          containerPort: 9115
      volumes:
      - name: config
        configMap:
          name: prometheus-blackbox-exporter

위에 있는 풀코드도 바꿔놓았다.

또한 기존 Deployment 삭제 후, 새 Deployment 적용한다.


1) 기존 Deployment 삭제

kubectl -n monitoring delete deployment prometheus-blackbox-exporter

2) 기존 ReplicaSet 자동 삭제 여부 확인
delete deployment 하면 ReplicaSet과 Pod도 자동 제거되는데 이것도 확인해준다.


blackbox 관련 Pod는 없는 것을 확인하였다.


3) 새로 적용

kubectl apply -f blackbox-deployment.yaml

4) 정상 실행 확인

kubectl get pods -n monitoring | grep blackbox
kubectl logs -n monitoring deploy/prometheus-blackbox-exporter

는 또 error가 떠서 확인해보니,
내가 쓴 모든 blackbox-exporter 이미지가 ARM64 지원이 없음 → ErrImagePull / exec format error이 나는 상태

인 것을 확인했다. 그래서 다시 deployment 파일을 수정하였다.


트러블슈팅 2

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
  labels:
    app: prometheus-blackbox-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-blackbox-exporter
  template:
    metadata:
      labels:
        app: prometheus-blackbox-exporter
    spec:
      containers:
      - name: blackbox-exporter
        image: ghcr.io/uyuni-project/blackbox-exporter:master
        args:
        - --config.file=/etc/blackbox_exporter/config.yml
        ports:
        - name: http
          containerPort: 9115
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter/
          readOnly: true
      volumes:
      - name: config
        configMap:
          name: prometheus-blackbox-exporter

다시 deployment삭제 및 잔여 pod를 확인하고 위 파일로 재배포 해준다.

또 이미지가 에러가 났다.


트러블슈팅3

근데 에러 로그를 살펴보니

root@cp-k8s:~# kubectl logs -n monitoring deploy/prometheus-blackbox-exporter
Error from server (BadRequest): container "blackbox-exporter" in pod "prometheus-blackbox-exporter-d6c6f9766-4wwql" is waiting to start: trying and failing to pull image

이렇게 에러가 떴다.

그래서
vm 안에서 docker.io 접속 가능한지, public DNS 문제는 아닌지, github 레지스트리 접속이 안 되는 것은 아닌지
각각 명령어를 통해 살펴보았다.

## vm 안에서 docker.io 접속되는지 확인
curl -I https://registry-1.docker.io/v2/
## public DNS 문제인지 확인
cat /etc/resolv.conf
## github 레지스트리 접속 테스트
curl -I https://ghcr.io


놀랍게도 모두 정상이었고,

블랙박스 이미지 문젠가 싶어서 다시 deployment 배포 및 적용시켜보았다.
(여러 이미지로 시도해보았다.)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-blackbox-exporter
  namespace: monitoring
  labels:
    app: prometheus-blackbox-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-blackbox-exporter
  template:
    metadata:
      labels:
        app: prometheus-blackbox-exporter
    spec:
      containers:
      - name: blackbox-exporter
        image: ghcr.io/katelin/blackbox-exporter:latest   # ARM64 지원되는 이미지
        args:
        - --web.listen-address=:9115
        - --config.file=/etc/blackbox_exporter/config.yml
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter/
          readOnly: true
        ports:
        - name: http
          containerPort: 9115
      volumes:
      - name: config
        configMap:
          name: prometheus-blackbox-exporter

기존 deploymen 삭제 후 재적용

kubectl delete deploy -n monitoring prometheus-blackbox-exporter
kubectl delete pod -n monitoring -l app=prometheus-blackbox-exporter --force --grace-period=0

kubectl apply -f blackbox-deployment.yaml

하니
드디어 떴다.

이미지 문제였던 것이었다.


7. 프로메테우스 UI에서 확인 (성공)


up 상태인 blackbox가 target에 나오는 것을 확인하였으며

graph에 자동완성까지 나오는 것을 확인하였다.




위 게시물은 실습으로 배우는 프로메테우스강의 7.4부분, 실습에서 나오는 코드는 사용하지 않고 커리큘럼만 참고하여 챗지피티를 활용하여 작성하였습니다.

profile
정도를 걷는 엔지니어

0개의 댓글