Prometheus监控Docker-Swarm集群(二)

Prometheus监控Docker Swarm集群(二)

前面我讲解了对于Docker的一些监控知识以及Docker监控开源工具Weave Scope做了一个概述,以及简单安装。

同时也了解了Weave Scope的不足之处,而引出来了cAdvisor配合Prometheus来监控容器,本篇主要是针对Swarm集群的监控详细讲解;

Swarm简介

Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker 1.12.0以后的版本 Swarm Mode 已经内嵌入 Docker Engine,成为了 Docker 子命令 Docker Swarm,绝大多数用户已经开始使用 Swarm Mode,Docker Engine API 已经删除 Docker Swarm。

Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm 区分开来。

Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与 Mesos、Kubernetes 竞争的实力。

节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。

节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。
一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

docker-swarm-1

服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。

  • global services 每个工作节点上运行一个任务

两种模式通过 docker service create 的 --mode 参数指定。

来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

docker-swarm-2

Swarm监控方案

一、基于cAdvisor+InfluxDB+Grafana

其中cAdvisor负责数据的收集,每一台节点都部署一个 cAdvisor 服务, Influxdb负责数据的存储, Grafana负责数据的图形可视化展示。

  • cAdvisor:数据收集模块

  • InfluxDB:数据存储

  • Grafana:图形可视化

二、基于cAdvisor+Prometheus+Grafana

通过cAdvisor将业务服务器的进行数据收集,Prometheus将数据抓取后存放到自己的时序库中,Grafana则进行图表的展现。

  • cAdvisor:数据收集模块

  • Prometheus 抓取cAdvisor收集的指标数据存储TSDB

  • Grafana:图形可视化

初始化 Swarm 集群

安装docker-ce,如果不指定版本,会安装最新的latest版本:

Ubuntu下查看Docker-ce版本列表 apt-cache madison docker-ce

Centos查看Docker-ce版本列表 yum list docker-ce --showduplicates | sort -r

Docker-ce 版本 19.03.11~3-0~ubuntu-bionic

基础环境:

manager: 192.168.1.220

worker01: 192.168.1.221

worker02: 192.168.1.222

apt install -y apt-transport-https software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install docker-ce

协议端口:

TCP port: 2377 集群管理通讯

TCP and UDP port: 7946 节点之间通讯

UDP port: 4789 overlay网络流量

# 在master机器上初始化集群,运行
MASTER_IP='192.168.1.220'
docker swarm init --advertise-addr ${MASTER_IP}
# output
Swarm initialized: current node (5tk280gclbz9a4gw0k9vu9bo0) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3lc66oda2binrl7vjfdjtf34tplt7q1bg446po6fgxasx3t48f-a05742d5tpwbkbl8r37hc9p2u 192.168.1.220:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

# 在node01 node02节点运行提示的命令加入到集群中
docker swarm join --token SWMTKN-1-3lc66oda2binrl7vjfdjtf34tplt7q1bg446po6fgxasx3t48f-a05742d5tpwbkbl8r37hc9p2u 192.168.1.220:2377
manager节点初始化集群后,都会有这样一个提示,这个的命令只是给个示例,实际命令需要根据初始化集群后的真实情况来运行。

# 在master机器上查看当前的node节点
docker node ls
root@docker-swarm-master:~# docker node ls
ID                            HOSTNAME              STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mnm180i3plzk2znjmdf0ded3w *   docker-swarm-master   Ready               Active              Leader              19.03.11
if8c5iltb2tau6g4v4vcccucr     docker-swarm-node01   Ready               Active                                  19.03.11
uu3jlkirrf0d5hf8bx8c5mnqc     docker-swarm-node02   Ready               Active                                  19.03.11

监控Swarm集群

OK,Swarm集群初始化已经完成,基于cAdvisor+InfluxDB+Grafana的yaml脚本

cat docker-compose-monitor.yml
version: '3'
 
services:
  influx:
    image: influxdb
    volumes:
      - influx:/var/lib/influxdb
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager
 
  grafana:
    image: grafana/grafana
    ports:
      - 0.0.0.0:80:3000
    volumes:
      - grafana:/var/lib/grafana
    depends_on:
      - influx
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager
 
  cadvisor:
    image: google/cadvisor
    hostname: '{{.Node.Hostname}}'
    command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
      - influx
    deploy:
      mode: global
 
volumes:
  influx:
    driver: local
  grafana:
    driver: local

我们这里只讲第二种,基于cAdvisor+Prometheus+Grafana的方案。

git clone https://github.com/cyancow/swarmprom.git
cd swarmprom
ADMIN_USER=admin \
ADMIN_PASSWORD=admin \
SLACK_URL=https://hooks.slack.com/services/9935226 \
SLACK_CHANNEL=devops-alerts \
SLACK_USER=alertmanager \
docker stack deploy -c docker-compose.yml mon
# output 
Creating network mon_net
Creating config mon_caddy_config
Creating config mon_dockerd_config
Creating config mon_node_rules
Creating config mon_task_rules
Creating service mon_prometheus
Creating service mon_caddy
Creating service mon_dockerd-exporter
Creating service mon_cadvisor
Creating service mon_grafana
Creating service mon_alertmanager
Creating service mon_unsee
Creating service mon_node-exporter

# 查看部署的stack
docker stack ls
NAME                SERVICES            ORCHESTRATOR
mon                 8                   Swarm

# 查看部署的service
docker service ls
ID                  NAME                   MODE                REPLICAS            IMAGE                                          PORTS
xnkq61woc3ag        mon_alertmanager       replicated          1/1                 stefanprodan/swarmprom-alertmanager:v0.14.0
tzxe317tffgl        mon_caddy              replicated          1/1                 stefanprodan/caddy:latest                      *:3000->3000/tcp, *:9090->9090/tcp, *:9093-9094->9093-9094/tcp
06rv2rj9oxbo        mon_cadvisor           global              3/3                 google/cadvisor:latest
ropkluyyxora        mon_dockerd-exporter   global              3/3                 stefanprodan/caddy:latest
29ygw9r4a92c        mon_grafana            replicated          1/1                 stefanprodan/swarmprom-grafana:5.3.4
whqtwwmfvdjl        mon_node-exporter      global              3/3                 stefanprodan/swarmprom-node-exporter:v0.16.0
xv19nuesymol        mon_prometheus         replicated          1/1                 stefanprodan/swarmprom-prometheus:v2.5.0
ia2g1ayhzjf6        mon_unsee              replicated          1/1                 cloudflare/unsee:v0.8.0

如果想在 Swarm 部署 Portainer的话,需要在docker-compose里加入以下声明

...
services:
  agent:
    image: portainer/agent
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    ports:
      - target: 9001
        published: 9001
        protocol: tcp
        mode: host
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - net
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]
...
# 使用以下命令更新
docker stack deploy -c docker-compose.yml mon

部署一个服务,然后使用Prometheus监控自动发现

cat test-compose.yml
version: "3.3"

networks:
  net:
    driver: overlay
    attachable: true
  mon_net:
    external: true

services:

  mongo:
    image: healthcheck/mongo:latest
    networks:
      - net
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role != manager

  mongo-exporter:
    image: forekshub/percona-mongodb-exporter:latest
    networks:
      - net
      - mon_net
    ports:
      - "9216:9216"
    environment:
      - MONGODB_URL=mongodb://mongo:27017
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager

# 部署
docker stack deploy -c test-compose.yml mongo

# 查看 stack 列表
docker stack ls
NAME                SERVICES            ORCHESTRATOR
mon                 10                  Swarm
mongo               2                   Swarm

# 查看 service 列表
docker service ls|grep mongo
o20avg5k0lqb        mongo_mongo            replicated          1/1                 healthcheck/mongo:latest
6atp7sl2byeu        mongo_mongo-exporter   replicated          1/1                 forekshub/percona-mongodb-exporter:latest      *:9216->9216/tcp

# 在其中一个节点查看mongo是否部署成功
docker ps -a|grep mongo
102b337589aa        healthcheck/mongo:latest                       "docker-entrypoint.s…"   18 minutes ago      Up 18 minutes (healthy)   27017/tcp                mongo_mongo.1.whn157ky895refdogo4s3imrw

总结

至此对于swarm集群的监控已经讲完了,对于swarm集群里,已经植入了一些简单的rules,关于Alertmanager与Rules的具体配置,具体可以参考官方网站。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354