1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        允許 Prometheus 通過 NAT 抓取指標(biāo)的工具 - PushProx

        共 3255字,需瀏覽 7分鐘

         ·

        2022-03-16 11:58

        我們知道 Prometheus 是 Pull 模式去拉取監(jiān)控指標(biāo)的,但是在有些場(chǎng)景下面并不能直接訪問到的時(shí)候,就需要使用一些附加的方式,PushProx 就是應(yīng)用于這種場(chǎng)景的。PushProx 是一個(gè)客戶端和代理,它允許 Prometheus 穿透 NAT 和其他類似的網(wǎng)絡(luò)拓?fù)洌瑫r(shí)仍然遵循 Pull 模式拉取指標(biāo)。

        架構(gòu)

        PushProx 主要由 proxy 和 client 兩部分組成,proxy 負(fù)責(zé)接收來自 prometheus server 的 metric 請(qǐng)求,然后 proxy 將請(qǐng)求信息 proxy 給 client,client 找本地設(shè)備獲取到 metric 后,將結(jié)果返回給 proxy。要求 proxy 部署在 prometheus 能夠訪問到的地方,client 則部署在需要采集的 node 所在的網(wǎng)絡(luò)。

        它適用于以下網(wǎng)絡(luò)環(huán)境:

        • Prometheus 無法直接訪問客戶端 ECS
        • Prometheus 可以訪問客戶端所在 VPC 中的 ECS(PushProx 代理),可通過內(nèi)網(wǎng)穿透或者暴露公網(wǎng)的方式使其可達(dá) PushProx 代理
        • 客戶EC和 PushProx 代理處于同一VPC

        每個(gè)客戶端有其 fqdn 標(biāo)識(shí),Prometheus 通過 PushProx 抓取目標(biāo) fqdn-x時(shí),執(zhí)行以下的操作過程:

        • 客戶端輪詢代理,以獲取抓取請(qǐng)求,并將其 fqdn 包含在輪詢中(1);客戶端發(fā)送 POST 請(qǐng)求到代理端,此時(shí)代理未響應(yīng)
        • Prometheus 嘗試通過代理,抓取主機(jī)名為 fqdn-x 的目標(biāo)(2)。Prometheus 發(fā)送 GET 請(qǐng)求到代理端,代理根據(jù) fqdn-x 路由到正確的客戶端,此時(shí)代理未響應(yīng)
        • 抓取請(qǐng)求位于輪詢中的,代理發(fā)送給客戶端的響應(yīng)報(bào)文中,以響應(yīng)步驟1中的客戶端POST請(qǐng)求(3)
        • 抓取請(qǐng)求由客戶端執(zhí)行(4)
        • 抓取到的數(shù)據(jù)包含指標(biāo)的響應(yīng)(5),并且發(fā)布到代理中(6)
        • 代理將其返回給 Prometheus 中(7),作為步驟2中 Prometheus 發(fā)送GET請(qǐng)求時(shí)的響應(yīng)報(bào)文

        PushProx 透明地傳遞所有 HTTP 標(biāo)頭,壓縮和接受編碼等功能取決于抓取 Prometheus 服務(wù)器。

        測(cè)試

        這里測(cè)試我們需要用到以下組件進(jìn)行測(cè)試:

        • node_exporter 暴露 node 的一些基礎(chǔ) metric
        • pushprox-client 和 node_exporter 一起部署在需要收集的 NAT 環(huán)境下的 node 上
        • pushprox-proxy 和 prometheus 都部署在外網(wǎng)。prometheus 可以訪問到 pushprox-proxy 的服務(wù)。

        proxy 對(duì) client 進(jìn)行 TLS 認(rèn)證

        由于目前 proxy 和 client 之間沒有做認(rèn)證,client 所在 ip 不確定,proxy 無法針對(duì) client 配置防火墻策略,需要增加 proxy 和 client 之間的認(rèn)證。

        使用 tls 來對(duì) client 進(jìn)行校驗(yàn)。pushprox-proxy 不支持 tls,需要 nginx 作為反向代理到 pushprox-proxy,然后 nginx 上配置 tls,并且在 nginx 上開啟 ssl_verify_client 。pushprox-client 支持 tls 客戶端連接到 nginx 。pushprox-client 要求 tls 要支持 SAN(Subject Alternative Name) 是SSL 標(biāo)準(zhǔn)x509 中定義的一個(gè)擴(kuò)展)。所以生成自簽名證書的時(shí)候需要支持 SAN 。這里我們可以參考 https://github.com/ljq/gen-tlsv3-san-ca 來生成自簽名證書。

        啟動(dòng) pushprox-proxy

        pushprox-proxy 需要部署在公網(wǎng)的服務(wù)器上,而且 pushprox-proxy 要跟每個(gè) client 保持一個(gè)長(zhǎng)連接,如果 client 比較多, proxy 要考慮負(fù)載均衡。

        ./pushprox-proxy

        配置 nginx

        nginx 反向代理到 pushprox-proxy, nginx 上配置 tls(pushprox.conf):


        upstream?prox-backend?{
        ????server?127.0.0.1:8080;
        }

        server?{
        ????????listen?443?ssl;
        ????????server_name?promprox.k8s.local;
        ????????ssl?on;
        ????????ssl_certificate?/opt/xk-self-cert/server.crt; #配置證書位置
        ??????? ssl_certificate_key /opt/xk-self-cert/server.key; #配置秘鑰位置
        ????????ssl_client_certificate?/opt/xk-self-cert/ca.crt; #雙向認(rèn)證
        ????????ssl_verify_client?on;?#雙向認(rèn)證
        ????????ssl_session_timeout?5m;
        ????????ssl_protocols?SSLv2?SSLv3?TLSv1?TLSv1.1?TLSv1.2?TLSv1.3;?#按照這個(gè)協(xié)議配置
        ????????ssl_ciphers?ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;?#按照這個(gè)套件配置
        ????????ssl_prefer_server_ciphers?on;

        ????????location?/?{
        ????????????proxy_pass???????http://prox-backend/;
        ????????}
        }

        啟動(dòng) client

        pushprox-client 要配置自簽名證書中的 ca 和 client crt

        ./pushprox-client?--proxy-url=https://promprox.k8s.local?--tls.cacert=/opt/xk-self-cert/ca.crt?--tls.cert=/opt/xk-self-cert/client.crt?--tls.key=/opt/xk-self-cert/client.key

        啟動(dòng) prometheus

        ./prometheus?--config.file=prometheus-prox.yml

        配置文件如下所示:

        #?prometheus-prox.yml

        global:
        ??scrape_interval:?????15s?
        ??evaluation_interval:?15s?

        #?A?scrape?configuration?containing?exactly?one?endpoint?to?scrape:
        #?Here?it's?Prometheus?itself.
        scrape_configs:
        ??-?job_name:?node
        ????proxy_url:?http://xx.xx.xx.xx:8080/?#?配置為?proxy?的地址
        ????static_configs:
        ??????-?targets:?['ceph-local:9100']??#?Presuming?the?FQDN?of?the?client?is?"client".

        正常就可以抓取到指標(biāo)數(shù)據(jù)了。

        倉(cāng)庫(kù)地址:https://github.com/prometheus-community/PushProx

        瀏覽 74
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一极大片 | 国产成人无码一区二区在线观看 | 小黄片高清无码 | 欧美性爱一级视频 | 草逼免费网站 | 国产一级婬乱 | 波多野结衣三级在线 | 91色免费视频 | 男人添女人做爰视频 | 日韩操操 |