Prometheus 서버 IP를 Discourse에서 인식하도록 하는 방법

안녕하세요, 여러분!

지금까지 제가 이해한 바로는, Prometheus 인스턴스가 /metrics 엔드포인트에서 데이터를 수집(scrape)할 수 있도록 하려면 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX를 편집하여 해당 머신의 IP 주소를 허용 목록에 추가해야 합니다.

이것을 수행할 다른 방법이 있을까요? 저희 Discourse 인스턴스는 Cloudflare의 DNS 프록시 뒤에 위치해 있어 최종 사용자의 실제 IP 주소를 확인할 수 없습니다. Prometheus의 데이터 수집 제한 사항 때문에 가능성이 낮을 것 같지만, API 키를 사용하여 이 문제를 해결할 방법을 찾을 수 있다면 정말 좋겠습니다.

그렇다면 Discourse가 깨진 상태이므로 Cloudflare 템플릿을 추가해야 합니다.

그 방법이 작동할 것 같습니다. 시도해 보셨나요? 아, 하지만 Grafana에서 키를 헤더에 넣을 수 없다고 생각하는데, 그래서 제가 이 기능을 처음 추가한 것입니다.

그러면 Discourse가 깨진 상태이고 cloudflare 템플릿을 추가해야 합니다.

"cloudflare 템플릿"이 정확히 무엇을 의미하는지 궁금합니다.

그렇게 하면 작동할 것 같습니다. 시도해 보셨나요? 아, 하지만 grafana가 키를 헤더에 넣도록 할 수 없다고 생각하는데, 그래서 제가 이 기능을 처음 추가한 이유입니다.

네, 시도해 보았습니다. Prometheus는 여전히 스크레이퍼 구성에서 임의의 헤더를 허용하지 않습니다. 따라서 제 경우 Prometheus 서버의 IP 주소를 화이트리스트에 추가할 수 없으므로, Prometheus에서 Discourse 메트릭을 수집하는 방법이 없습니다.

Cloudflare와 같은 프록시 뒤에 Discourse 인스턴스를 실행하는 다른 사용자들도 있을 것입니다. 이 점을 고려할 때, 익스포터(exporter)를 약간 조정해야 할 것 같습니다.

Discourse API는 Prometheus 스크레이퍼 서브시스템이 지원하는 http basic auth와 같은 어느 정도 표준화된 방식 대신 자체 Api-Key 및 Api-Username 헤더를 사용합니다. 그래서 제 환경에서 이 기능을 사용할 수 있는 방법이 전혀 없습니다.

검색을 해야 합니다. 하지만 템플릿 디렉터리에서 찾을 수 있으며, app.yml 파일에 추가할 수 있습니다.

감사합니다!

cloudflare.template.yml를 활성화했습니다. :slight_smile: 하지만 제 이해가 맞다면, 그것은 Cloudflare의 IP 주소에서 오는 트래픽에 대한 속도 제한(rate limiting)을 비활성화하기 위한 것이었습니다.

현재 제 Prometheus 설정은 다음과 같습니다.

scrape_configs:
        - job_name: forum
          scrape_interval: 5s
          scheme: https
          static_configs:
                  - targets:
                          - forum-behind-cloudflare-dns-proxy.com

현재 제가 겪고 있는 문제는, Discourse가 요청의 실제 IP 주소를 확인할 수 없다는 것입니다. 따라서 허용 목록(allow list) 방식이 작동하도록 하기 위해 다음을 시도했습니다.

  1. app.yml의 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX 환경 변수에 제 Prometheus 서버의 IPv6 주소를 추가했습니다.

  2. Prometheus 서버의 /etc/hosts에 포럼의 실제 IPv6 주소를 하드코딩했습니다. 이제 포럼은 제 Prometheus 서버의 IP 주소를 보고 액세스를 허용합니다. :slight_smile:

아직 다른 문제들도 있습니다. 예를 들어, 저는 컨테이너에서 Prometheus를 실행하고 있습니다. 호스트의 /etc/hosts가 컨테이너 내부와 공유되지 않습니다. 그래서 포럼 주소를 Cloudflare IP로 계속 해석하고 인증 중에 실패합니다.

Prometheus를 시작할 때 -v /etc/hosts:/etc/hosts와 같이 호스트의 /etc/hosts를 Docker 컨테이너에 공유할 수 있지만, 그러면 다음과 같은 오류가 발생합니다.

Get "https://forum-behind-cloudflare-dns-proxy.com:443/metrics": dial tcp [<ipv6-address>]:443: connect: cannot assign requested address

이제 이 문제를 해결해야 합니다.

수정 #1: 이 부분도 해결했습니다. Docker 컨테이너 내부에서 IPv6가 비활성화되어 있었습니다. Docker 컨테이너에서 IPv6를 활성화하거나 단순히 --net=host를 사용하면 해결할 수 있습니다.

리버스 프록시를 사용하고 계신가요? 실제 원격 IP가 Discourse에 전달되도록 nginx를 구성해야 합니다. Discourse와 같은 머신에서 다른 웹사이트 실행 게시물이 이 문제를 해결하는 데 힌트를 줄 수 있을 것 같습니다.

Discourse 인스턴스가 실제로는 리버스 프록시 뒤에 실행되고 있습니다. 리버스 프록시는 Cloudflare에서 제공되며, 우리는 Pro 플랜만 사용 중이므로 Cloudflare에서 실제 클라이언트 IP를 Discourse 인스턴스로 전달할 수 있는 옵션이 없습니다. 어쨌든, 제 문제는 이미 해결되었습니다. :slight_smile:

Grafana 대시보드는 이 시점에 업데이트되어야 할 것 같습니다. 시간이 지나면서 Prometheus 익스포터가 업데이트되어 특정 메트릭을 더 이상 보내지 않게 되었지만, Grafana 대시보드는 여전히 해당 (이제 존재하지 않는) 메트릭의 값을 읽도록 구성되어 있습니다.