基于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", $k, $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界面.

访问 http://127.0.0.1:9090/targets

此时 Prometheus 服务已经正常监控

访问 http://127.0.0.1:3000/ 点击 Add data source , 选择Prometheus为数据源

在HTTP URL 一项中输入 http://prometheus:9090 ,因为本地容器使用了相同的网络, 可以直接使用服务名称进行服务访问.

点击 grafana Home, New dashboard, Chose Visualization , 选择 Graph

点击 queries , 选中 QueryPrometheus

在A 中 Metrics 添加指标项, 可使用 Legend 增加指标项说明,点击Add Query 可在一张图表中绘制多个指标折线.至此本地部署已完成.

Rancher K8S 部署

rancher 中部署也是一样的, 唯一的区别就是, 使用rancher 作为容器编排工具. 打开rancher, 并点击部署服务

填写镜像为 prom/prometheus, 并配置数据卷, 为的将监控配置yml文件进行挂载容器.此处挂载使用可参照rancher 文档.

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

点击最下方启动按钮, 并配置工作负载中负载均衡

此时通过本地访问grafana.100tal.com 即可访问对应服务, 若无公网dns, 则需本地修改 /etc/hosts.

后续可按照本地搭建模式相同配置grafana, 本文不再重复赘述.

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章