为了提高系统的可观察性,我们可以使用 Prometheus 监控系统不同层级的资源消耗,例如系统级别的磁盘 I/O 和网络带宽、租户级别的 CPU 消耗和内存使用、组件级别的 Ray 集群资源利用率、后端平台系统调用次数、垃圾回收状态、操作员级别的对象大小和执行时间等。积累这些数据可以帮助开发人员排查问题,并为后续的系统优化提供方向。
部署 Prometheus 有两种方式。第一种是基于 Docker-Compose 的轻量级部署,主要部署在只有一台机器或有限数量机器的场景中。第二种是基于 Kubernetes 的部署。我们将为这些部署提供详细介绍和具体的操作步骤供部署人员参考。
基于 Docker-Compose 的部署#
在使用 Docker-Compose 部署时,客户端服务器的资源通常有限。对于某些客户端来说,Prometheus 组件占用 500MB 的内存是不可接受的。因此,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