為了提高系統的可觀察性,我們可以使用 Prometheus 監控系統不同層級的資源消耗,例如系統層級的磁碟 I/O 和網路頻寬、租戶層級的 CPU 消耗和記憶體使用、元件層級的 Ray 集群資源利用率、後端平台系統調用次數、垃圾回收狀態、操作員層級的物件大小和執行時間等。累積這些數據可以幫助開發人員排除問題並為後續的系統優化提供方向。
有兩種部署 Prometheus 的方式。第一種是基於 Docker-Compose 的輕量級部署,主要部署在只有一台機器或有限數量機器的場景中。第二種是基於 Kubernetes 的部署。我們將為這些部署提供詳細的介紹和具體的操作步驟給部署人員。
基於 Docker-Compose 的部署#
在使用 Docker-Compose 部署時,客戶端伺服器的資源通常有限。對於某些客戶來說,佔用 500MB 記憶體來運行 Prometheus 元件是不可接受的。因此,Prometheus 元件需要設計為可插拔的。此外,考慮到客戶可能擁有多台伺服器,由於 Prometheus 相對獨立於系統功能,因此可以在閒置的機器上單獨部署,而不佔用 Ray 集群資源等。因此,我們使用單獨的部署文件來部署 Prometheus,而不是將其合併到現有的部署文件中。
假設每台伺服器上已經安裝了 Docker 和 Docker-Compose 環境。總共有 N 台伺服器,Prometheus 監控模組可以分為 1 台主機和 N-1 台從機。基於 Docker-Compose 部署 Prometheus 的過程可以分為以下兩個步驟。
- 在每台從伺服器上創建一個服務。
- 在主伺服器上創建一個服務。
在每台從伺服器上創建一個服務#
為服務創建一個配置文件。該配置文件佔用從伺服器上的 9100 端口。假設伺服器的 IP 地址為 192.168.88.101,node-exporter 將在 192.168.88.101:9100 上運行。在下一步中,需要將 192.168.88.101:9100 的信息添加到主伺服器的 prometheus.yml 配置文件中。
version: '3'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node_exporter
hostname: node-exporter
restart: always
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
- /etc/hostname:/etc/hostname:ro
ports:
- "9100:9100"
# 如果 9100 端口被佔用,可以使用
# - "9200:9100"
networks:
- monitor
networks:
monitor:
driver: bridge
ipam:
config:
- subnet: 172.16.102.0/24
通過在同一目錄中運行 docker-compose up -d
來啟動服務。
在主伺服器上創建一個服務#
假設主機的 IP 地址為 192.168.88.13。首先,在同一目錄中創建 docker-compose.yml
和 prometheus.yml
。如 docker-compose.yml
所示:
- 主機的
node-exporter
將在 192.168.88.13:9100 創建。 - 主機的
prometheus
將在 192.168.88.13:9090 創建。 - 主機的
grafana
將在 192.168.88.13:3000 創建。 - 主機的
alertmanager
將在 192.168.88.13:9093 創建。 - 主機的
cadvisor
將在 192.168.88.13:8080 創建。
version: "3.7"
services:
# 服務1:節點監控
node-exporter:
image: prom/node-exporter:latest
container_name: "node-exporter"
ports:
- "9100:9100"
restart: always
# 服務2:節點監控
prometheus:
image: prom/prometheus:latest
container_name: "prometheus0"
restart: always
ports:
- "9090:9090"
volumes:
- "./prometheus.yml:/etc/prometheus/prometheus.yml"
- "./prometheus_data:/prometheus"
# 服務3:數據儀表板
grafana:
image: grafana/grafana
container_name: "grafana"
ports:
- "3000:3000"
restart: always
volumes:
- "./grafana_data:/var/lib/grafana"
- "./grafana_log:/var/log/grafana"
- "./grafana_data/crypto_data:/crypto_data" # 主機地址在冒號前,容器地址在冒號後。這是用來指定 sqlite 數據庫的位置。
# 服務4:警報處理
alertmanager:
image: prom/alertmanager:latest
container_name: Myalertmanager
hostname: alertmanager
restart: always
ports:
- '9093:9093'
volumes:
- './prometheus/config:/config'
- './prometheus/data/alertmanager:/alertmanager/data'
# 服務5:Docker 監控
cadvisor:
image: lagoudocker/cadvisor:v0.37.0
container_name: cadvisor
restart: always
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /dev/disk/:/dev/disk:ro
- /var/lib/docker/:/var/lib/docker:ro
command:
- "--disable_metrics=udp,tcp,percpu,sched"
- "--storage_duration=15s"
- "-docker_only=true"
- "-housekeeping_interval=30s"
- "-disable_metrics=disk"
ports:
- 8080:8080
networks:
- monitor
networks:
monitor:
name: monitor
driver: bridge
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
# 需要與主機的 docker-compose.yml 中的 'alertmanager' 配置文件一致。
- 192.168.88.13:9093
# 加載規則一次並根據全局 'evaluation_interval' 定期評估它們。
rule_files:
#- "app/prometheus/rules/*.yml"
- "rule.yml"
# - "first_rules.yml"
# - "second_rules.yml"
# 一個包含恰好一個端點的抓取配置:
# 這裡是 Prometheus 本身。
scrape_configs:
# 工作名稱作為標籤 `job=<job_name>` 添加到從此配置抓取的任何時間序列中。
- job_name: 'slave101NodeExporter'
static_configs:
- targets: ['192.168.88.101:9100']
labels:
host: slave101
- job_name: 'masterNodeExporter'
static_configs:
- targets: ['192.168.88.13:9100']
labels:
host: master
- job_name: 'masterCadvisor'
static_configs:
- targets: ['192.168.88.13:8080']
labels:
host: master
# 添加其他伺服器的 NodeExporter
# - job_name: 'slave21NodeExporter'
# static_configs:
# - targets: ['192.168.88.21:9100']
# labels:
# host: slave21NodeExporter
基於 K8S 的部署#
由於在 Kubesphere 中原生安裝了 Prometheus 和 Node-exporter,因此只需在 Kubesphere 中安裝 Grafana。步驟主要分為兩部分:使用 Helm 部署 Grafana 和為 Grafana 添加持久性卷。
使用 Helm 部署 Grafana#
基於 K8S 的部署方法使用 Helm 進行部署。使用以下命令在 kubesphere-monitoring-system 命名空間(默認命名空間)中創建 Grafana。
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana grafana/grafana -n kubesphere-monitoring-system
為 Grafana 添加持久性卷
接下來,我們為 Grafana 添加持久性卷,以便它可以持久保存儀表板和用戶信息。首先,在 kubesphere-monitoring-system 中創建一個名為 "grafana-storage" 的 PVC。
kubectl create pvc grafana-storage -n kubesphere-monitoring-system --size=1Gi
然後,我們修改與 Grafana 開發相對應的 YAML 文件片段,如下所示。
volumes:
- configMap:
defaultMode: 420
name: grafana
name: config
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-storage```