banner
Bathe

Bathe

可观察性:Prometheus 部署

为了提高系统的可观察性,我们可以使用 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.ymlprometheus.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
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。