1. 程式人生 > 程式設計 >基於Rancher k8s部署Prometheus 監控swoole專案核心指標實戰

基於Rancher k8s部署Prometheus 監控swoole專案核心指標實戰

keyword Rancher Prometheus swoole docker docker-compose

Prometheus

特性

Prometheus 是由SoundCloud開發的開源監控報警系統和時序列資料庫(TSDB)。Prometheus使用Go語言開發,是Google BorgMon監控系統的開源版本,效能也足夠支撐上萬臺規模叢集.

  • 多維度資料模型
  • 靈活的查詢語言
  • 不依賴分散式儲存,單個伺服器節點是自主的
  • 通過基於HTTP的pull方式採集時序資料
  • 可以通過中間閘道器進行時序列資料推送
  • 通過服務發現或者靜態配置來發現目標服務物件
  • 支援多種多樣的圖表和介面展示,比如Grafana等

基本原理

Prometheus 通過使用http協議週期拉取配置的指標項(Metrics),並將資料通過一定規則整理清洗,儲存到新的時間序列中. 在本次實戰中將對業務使用的php swoole進行核心指標監控並通過grafana 圖形化工具進行輸出展示.

搭建步驟

Prometheus docker本地編排

對於直接在rancher 上部署,我們可以在本地使用docker-compose 本地編排實驗後進行k8s 遠端部署,在本地部署使用docker-compose 模擬k8s容器編排,便於開發實驗.

首先建立一個monitor資料夾作為此次專案的路徑

$ mkdir monitor && cd
monitor 複製程式碼

建立prometheus資料夾,用來存放我們的監控配置檔案

$ mkdir prometheus && cd prometheus && touch prometheus.yml
複製程式碼

prometheus.yml配置檔案中新增以下內容

global:
  scrape_interval:     30s # 全域性週期
scrape_configs:
- job_name: 'foo' # 作業名稱
  scrape_interval: 30s # 呼叫週期
  metrics_path: "/health/metrics" # 呼叫路徑
static_configs: - targets: ['foo.com:80'] # 遠端服務地址 複製程式碼

在上面的配置檔案中我們指明瞭foo這個監控作業,並指定執行週期30s,每次呼叫地址為 foo.com:80/health/metrics這個介面地址. 具體這個介面我們應該如何輸出資料,下邊會具體提到.

monitor資料夾根路徑建立docker-compose.yml檔案

$ touch docker-compose.yml
複製程式碼

並加入以下內容

version: '2'
services:
    prometheus:
        container_name: prometheus # 容器名稱
        image: prom/prometheus # 映象名稱
        networks: # 共享網路
            - foo
        volumes:
            - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml # 將本地配置檔案,掛載到目標容器/etc/prometheus/prometheus.yml位置
        ports:
            - '9090:9090'
        command:
            - '--config.file=/etc/prometheus/prometheus.yml'
            - '--web.enable-admin-api'
            - '--web.enable-lifecycle' # 支援配置檔案熱更新

    grafana:
        container_name: grafana
        image: grafana/grafana:6.4.3
        ports:
            - '3000:3000'
        depends_on:
            - prometheus # 依賴 prometheus 服務後啟動
        networks:
            - foo
        environment:
            GF_SECURITY_ADMIN_USER: ${GRAFANA_USERNAME} # grafana 使用者名稱(變數)
            GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}

networks: # 定義外部網路,便於服務間訪問
    foo:
        external: true
複製程式碼

此處重點說明一下 prometheus 服務中command 選項中的配置書寫問題,因為 prom/prometheus映象已經有程式入口並已經配置--config.file--web.enable-admin-api,此時我們只需要追加啟動命令的web.enable-lifecycle表示開啟服務熱更新監控配置,如果只寫最後,會導致前邊兩項無配置,服務將會缺少配置而無法啟動.

Swoole 介面

在Swoole 專案中,編寫介面/health/metrics/ 內容如下:

$server = new Swoole\Http\Server("127.0.0.1",80); // 此處只是展示$server物件型別,具體server物件需從當前專案框架中進行獲取,不要自己再次例項化.
$metrics = $server->stats();
 foreach ($metrics as $k => $v) {
     echo sprintf("%s %s\n",$k,$v);
 }
 echo "# 協程狀態\n";

 $metrics = Swoole\Coroutine::stats();
 foreach ($metrics as $k => $v) {
     echo sprintf("%s %s\n",$v);
 }
複製程式碼

訪問 http://127.0.0.1:80/health/metrics/ 將會有以下輸出

start_time 1573612504
connection_num 1
accept_count 7
close_count 6
worker_num 2
idle_worker_num 1
tasking_num 0
request_count 10
worker_request_count 0
worker_dispatch_count 11
coroutine_num 1
# 協程狀態
event_num 2
signal_listener_num 0
aio_task_num 0
c_stack_size 2097152
coroutine_num 1
coroutine_peak_num 1
coroutine_last_cid 3
複製程式碼

具體引數含義可自行檢視Swoole 檔案獲取詳細解釋.

開啟監控服務

進入monitor目錄,執行docker-compose up -d,此時可能會提示外部網路不存在,按照提示進行建立即可. 當服務啟動完成後訪問 http://127.0.0.1:9090 可看到Prometheus Web介面.

Prometheus 主介面

訪問 http://127.0.0.1:9090/targets

已監控列表

此時 Prometheus服務已經正常監控

訪問 http://127.0.0.1:3000/ 點選 Add data source,選擇Prometheus為資料來源

Grafana 新增資料來源

在HTTP URL 一項中輸入 http://prometheus:9090,因為本地容器使用了相同的網路,可以直接使用服務名稱進行服務訪問.

Grafana 儲存資料來源並測試連線性

點選grafana Home,New dashboard,Chose Visualization,選擇 Graph

選擇視覺化方式

點選 queries,選中QueryPrometheus

配置顯示項

在A 中Metrics新增指標項,可使用Legend增加指標項說明,點選Add Query 可在一張圖表中繪製多個指標折線.至此本地部署已完成.

Rancher K8S 部署

rancher 中部署也是一樣的,唯一的區別就是,使用rancher 作為容器編排工具. 開啟rancher,並點選部署服務

rancher 主頁

填寫映象為 prom/prometheus,並配置資料卷,為的將監控配置yml檔案進行掛載容器.此處掛載使用可參照rancher 檔案.

在命令中加入 --config.file=/etc/prometheus/prometheus.yml --web.enable-admin-api --web.enable-lifecycle

新增啟動命令

點選最下方啟動按鈕,並配置工作負載中負載均衡

配置負載均衡

此時通過本地訪問grafana.google.com 即可訪問對應服務,若無公網dns,則需本地修改 /etc/hosts.

後續可按照本地搭建模式相同配置grafana,本文不再重複贅述.

Prometheus 配置檔案熱更新

$ curl -X POST 'http://grafana.google.com/-/reload'
複製程式碼