容器监控与报警:
容器监控的实现方对比虚拟机或者物理机来说比大的区别,比如容器在k8s环境中可以任意横向扩容与缩容,那么就需要监控服务能够自动对新创建的容器进行监控,当容器删除后又能够及时的从监控服务中删除,而传统的zabbix的监控方式需要在每一个容器中安装启动agent,并且在容器自动发现注册及模板关联方面并没有比较好的实现方式。

6.1:Prometheus:
k8s的早期版本基于组件heapster实现对pod和node节点的监控功能,但是从k8s 1.8版本开始使用metrics API的方式监控,并在1.11版本 正式将heapster替换,后期的k8s监控主要是通过metrics Server提供核心监控指标,比如Node节点的CPU和内存使用率,其他的监控交由另外一个组件Prometheus 完成。

6.1.1:prometheus简介:
官方文档:https://prometheus.io/docs/github地址:https://github.com/prometheus 

Prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合,是由SoundCloud公司开发的开源监控系统,Prometheus是CNCF(Cloud Native Computing Foundation,云原生计算基金会)继kubernetes 之后毕业的第二个项目,prometheus在容器和微服务领域中得到了广泛的应用,其特点主要如下:

使用key-value的多维度格式保存数据

数据不使用MySQL这样的传统数据库,而是使用时序数据库,目前是使用的TSDB

支持第三方dashboard实现更高的图形界面,如grafana(Grafana 2.5.0版本及以上)

功能组件化

不需要依赖存储,数据可以本地保存也可以远程保存

服务自动化发现

强大的数据查询语句功(PromQL,Prometheus Query Language)

 Promethues主要包含以下特点:

 1.  使用指标名称及键值对标识的多维度数据模型。

 2. 采用灵活的查询语句 Prom QL.

 3. 不依赖分布式存储,为自治的单节点服务。

 4. 使用http完成对监控数据的拉取。

 5. 支持通过网关推送时序数据。

 6. 支持多种图形和Dashboard 的展示,例如Grafana。

Promethues生态系统由各种组件组成,用于功能的扩充。

  1. Promethues Server: 负责监控数据的采集和时序数据存储,并提供数据查询能力。

  2. 客户端SDK:对接Promethues 的开发工具包。

  3. Patn Gateway:  推送数据的网关组件。

  4. 第三方Exporter:各种外部指标收集系统,其数据可以被Promethues采集。

  5. AlertManager:告警管理器。

  6. 其他辅助支持工具。

Promethues 的核心组件Promethues Server 的主要功能包括:

  1. 从Promethues Master中获取需要监控的资源或服务信息;

  2. 从各种exporter中抓取指标数据,然后将指标数据存储在时序数据库(TSDB);

  3. 向其他系统提供HTTP API进行查询

  4. 提供基于PromQL语言的数据查询

  5. 可以将告警数据推送给AlertManager等等。

prometheus系统架构图

prometheus server:主服务,接受外部http请求,收集、存储与查询数据等
prometheus targets: 静态收集的目标服务数据
service discovery:动态发现服务
prometheus alerting:报警通知
pushgateway:数据收集代理服务器(类似于zabbix proxy)
data visualization and export: 数据可视化与数据导出(访问客户端)

 

promethus监控mongodb promethus监控pod_数据

 prometheus 安装方式:

https://prometheus.io/download/ #官方二进制下载及安装,prometheus server的监听端口为9090
https://prometheus.io/docs/prometheus/latest/installation/ #docker镜像直接启动
https://github.com/coreos/kube-prometheus #operator部署

二进制方式安装:

grafana下载地址:https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/

Promethues :https://mirrors.tuna.tsinghua.edu.cn/github-release/prometheus/prometheus/LatestRelease/

创建prometheus启动脚本

[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml

[Install]
WantedBy=multi-user.target

prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus-local"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: 'promethues-k8s-node'
    static_configs:
      - targets: ['192.168.64.114:9100','192.168.64.113:9100']

  - job_name: 'promethues-k8s-master'
    static_configs:
      - targets: ['192.168.64.110:9100']

参数解释:

Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:

- "first_rules.yml"
- "second_rules.yml"

```
这个配置是用于加载和周期性地评估规则的。具体来说,它指定了一个或多个规则文件,在启动时加载这些规则文件中的规则,并按照全局配置中指定的 evaluation_interval 周期性地重新评估这些规则。

在这个配置中,规则文件的路径被注释掉了,也就是说,在默认情况下不会加载任何规则文件。如果要加载规则文件,需要将注释去掉,并将路径指定为相应规则文件的路径。

需要注意的是,这个配置只是一个示例,具体实现取决于特定应用程序或系统的需求。

示例:
假设我们有一个监控系统,需要定期检查服务器的 CPU 使用率和磁盘空间使用情况,并在达到阈值时发出警报。我们可以将规则定义在两个不同的规则文件中,分别是 cpu_usage_rules.yml 和 disk_space_rules.yml,每个文件中包含了对应监控项的规则定义。具体内容如下:

cpu_usage_rules.yml 文件内容:

- alert: HighCpuUsage
  expr: node_cpu_seconds_total{mode="idle"} < 50
  for: 5m
  labels:
    severity: warning

alert:告警规则的名称,用于标识该规则,必须是唯一的。
expr:告警规则的表达式,用于定义触发告警的条件。表达式由 Prometheus 的查询语言 PromQL 组成。在这个例子中,表达式 node_cpu_seconds_total{mode="idle"} < 50 表示当空闲 CPU 时间低于 50 秒时触发告警。
for:告警规则的持续时间,即在满足触发条件后持续多长时间才触发告警。在这个例子中,for: 5m 表示当满足条件持续 5 分钟时触发告警。
labels:告警规则的标签,用于为告警规则添加元数据。在这个例子中,severity: warning 表示告警的严重程度为警告级别。


disk_space_rules.yml 文件内容:


- alert: LowDiskSpace
  expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 20
  for: 10m
  labels:
    severity: critical

然后,在监控系统的配置文件中,我们可以将这两个规则文件的路径指定为 rule_files 字段的值,同时设置 evaluation_interval 为 1m,表示每隔 1 分钟重新评估一次规则:
global:
  evaluation_interval: 1m

rule_files:
  - "cpu_usage_rules.yml"
  - "disk_space_rules.yml"

这样,监控系统会在启动时加载这两个规则文件中的规则,并每隔 1 分钟重新评估这些规则,如果某个规则的条件满足,就会触发相应的警报。

```

部署node exporter

# pwd
/usr/local/src
# tar xvf node_exporter-0.18.1.linux-amd64.tar.gz
# ln -sv /usr/local/src/node_exporter-0.18.1.linux-amd64 /usr/local/node_exporter
# cd /usr/local/node_exporter

创建node exporter启动脚本

[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target

启动node exporter服务

# systemctl daemon-reload
# systemctl restart node-exporter
# systemctl enable node-exporter

访问node exporter web界面

promethus监控mongodb promethus监控pod_promethus监控mongodb_02

 prometheus采集node 指标数据

- job_name: 'promethues-k8s-node'
    static_configs:
      - targets: ['192.168.64.114:9100','192.168.64.113:9100']

  - job_name: 'promethues-k8s-master'
    static_configs:
      - targets: ['192.168.64.110:9100']

重启prometheus服务

systemctl restart prometheus

prometheus验证node节点状态

promethus监控mongodb promethus监控pod_加载_03

 prometheus验证node节点监控数据

promethus监控mongodb promethus监控pod_lua_04

安装Grafana

镜像:https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/

]# yum -y install grafana-6.7.2-1.x86_64.rpm

启动

]# systemctl enable grafana-server.service && systemctl start grafana-server.service

查看端口

]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      659/rpcbind
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1276/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1088/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1078/cupsd
tcp        0      0 127.0.0.1:43298         0.0.0.0:*               LISTEN      1096/containerd
tcp6       0      0 :::9100                 :::*                    LISTEN      117233/node_exporte
tcp6       0      0 :::111                  :::*                    LISTEN      659/rpcbind
tcp6       0      0 :::22                   :::*                    LISTEN      1088/sshd
tcp6       0      0 :::3000                 :::*                    LISTEN      118052/grafana-serv
tcp6       0      0 :::9090                 :::*                    LISTEN      117670/prometheus

访问grafana web界面

promethus监控mongodb promethus监控pod_数据_05

 添加prometheus数据源

promethus监控mongodb promethus监控pod_加载_06

 

promethus监控mongodb promethus监控pod_lua_07

 

 

promethus监控mongodb promethus监控pod_promethus监控mongodb_08

 

import模板

模板下载地址

模板可以在左侧栏匹配或搜索相关名称

promethus监控mongodb promethus监控pod_promethus监控mongodb_09

 

 点击目标模板

promethus监控mongodb promethus监控pod_加载_10

 

 下载模板

promethus监控mongodb promethus监控pod_数据_11

 通过模板ID导入

promethus监控mongodb promethus监控pod_promethus监控mongodb_12

 确认模板信息

promethus监控mongodb promethus监控pod_lua_13

 在线安装

列出插件列表

]# grafana-cli plugins --help
NAME:
   Grafana CLI plugins - Manage plugins for grafana

USAGE:
   Grafana CLI plugins command [command options] [arguments...]

COMMANDS:
   install                  install <plugin id> <plugin version (optional)>
   list-remote              list remote available plugins
   list-versions            list-versions <plugin id>
   update, upgrade          update <plugin id>
   update-all, upgrade-all  update all your installed plugins
   ls                       list all installed plugins
   uninstall, remove        uninstall <plugin id>
   help, h                  Shows a list of commands or help for one command

OPTIONS:
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)

[root@master-2 prometheus]# grafana-cli plugins list-remote
id: abhisant-druid-datasource version: 0.0.6
id: aceiot-svg-panel version: 0.0.8
id: ae3e-plotly-panel version: 0.2.1
id: agenty-flowcharting-panel version: 0.9.1
id: aidanmountford-html-panel version: 0.0.2
id: akumuli-datasource version: 1.3.12
id: alexanderzobnin-zabbix-app version: 4.0.1

 插件安装

饼图插件未安装,需要提前安装
https://grafana.com/grafana/plugins/grafana-piechart-panel

在线安装:
# grafana-cli plugins install grafana-piechart-panel
离线安装:
# pwd
/var/lib/grafana/plugins
# unzip grafana-piechart-panel-v1.3.8-0-g4f34110.zip
# mv grafana-piechart-panel-4f34110 grafana-piechart-panel
# systemctl restart grafana-server

 查看插件目录

]# ll /var/lib/grafana/plugins/grafana-piechart-panel/
total 252
-rw-r--r-- 1 root root   1005 May  3 16:01 dark.js
-rw-r--r-- 1 root root   4635 May  3 16:01 dark.js.map
-rw-r--r-- 1 root root   5191 May  3 16:01 editor.html
drwxr-xr-x 2 root root    284 May  3 16:01 img
-rw-r--r-- 1 root root   1074 May  3 16:01 LICENSE
-rw-r--r-- 1 root root   1004 May  3 16:01 light.js
-rw-r--r-- 1 root root   4635 May  3 16:01 light.js.map
-rw-r--r-- 1 root root   2855 May  3 16:01 MANIFEST.txt
-rw-r--r-- 1 root root    277 May  3 16:01 module.html
-rw-r--r-- 1 root root  42486 May  3 16:01 module.js
-rw-r--r-- 1 root root    884 May  3 16:01 module.js.LICENSE.txt
-rw-r--r-- 1 root root 152610 May  3 16:01 module.js.map
-rw-r--r-- 1 root root   1645 May  3 16:01 plugin.json
-rw-r--r-- 1 root root   2240 May  3 16:01 README.md
drwxr-xr-x 2 root root     39 May  3 16:01 styles

未安装饼图插件:

promethus监控mongodb promethus监控pod_lua_14

 已安装饼图插件

promethus监控mongodb promethus监控pod_数据_15

 其他监控项图形

promethus监控mongodb promethus监控pod_加载_16

 监控pod资源:

cadvisor由谷歌开源,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

k8s 1.12之前cadvisor集成在node节点的上kubelet服务中,从1.12版本开始分离为两个组件,因此需要在node节点单独部署cadvisor。

官网:https://github.com/google/cadvisor

cadvisor镜像准备

# docker load -i cadvisor_v0.33.0.tar.gz
# docker tag gcr.io/google-containers/cadvisor:v0.33.0
harbor.magedu.net/baseimages/cadvisor:v0.33.0
# docker push harbor.magedu.net/baseimages/cadvisor:v0.33.0

启动cadvisor容器:

docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor gcr.io/google_containers/cadvisor:v0.36.0

查看容器

]# docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
d45b35118651        gcr.io/google_containers/cadvisor:v0.36.0   "/usr/bin/cadvisor -…"   5 seconds ago       Up 3 seconds        0.0.0.0:8080->8080/tcp   cadvisor

查看端口

]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::8080                 :::*                    LISTEN      118875/docker-proxy

访问

promethus监控mongodb promethus监控pod_加载_17

 prometheus采集cadvisor数据

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus-local"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: 'promethues-k8s-node'
    static_configs:
      - targets: ['192.168.64.114:9100','192.168.64.113:9100']

  - job_name: 'promethues-k8s-master'
    static_configs:
      - targets: ['192.168.64.110:9100']

  - job_name: 'promethues-k8s-containers'
    static_configs:
      - targets: ['192.168.64.110:8080','192.168.64.113:8080','192.168.64.114:8080']

重启

]# systemctl restart prometheus.service

 验证prometheus数据

promethus监控mongodb promethus监控pod_数据_18

 grafana添加pod监控模板

395 893 容器模板ID

395模板

promethus监控mongodb promethus监控pod_数据_19

 893模板:

promethus监控mongodb promethus监控pod_加载_20

 

越学越感到自己的无知