k8s-容器监控与报警

仰天大笑出门去,我辈岂是蓬蒿人。这篇文章主要讲述k8s-容器监控与报警相关的知识,希望能为你提供帮助。

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

1.Prometheus官方文档:??https://prometheus.io/docs/introduction/overview/??
github地址:??https://github.com/prometheus??
下载地址:??https://prometheus.io/download/??
k8s的早期版本基于组件heapster实现对pod和node节点的监控功能,
但是从k8s 1.8版本开始使用metrics API的方式监控,
并在1.11版本 正式将heapster替换,
后期的k8s监控主要是通过metrics Server提供核心监控指标,比如Node节点的CPU和
内存使用率,其他的监控交由另外一个组件Prometheus完成。

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

1.1.特点
使用key-value的多维度格式保存数据
数据不使用mysql这样的传统数据库,而是使用时序数据库,目前是使用的TSDB
支持第三方dashboard实现更高的图形界面,如grafana(Grafana 2.5.0版本及以上)
功能组件化
不需要依赖存储,数据可以本地保存也可以远程保存
服务自动化发现
强大的数据查询语句功(PromQL,Prometheus Query Language)

1.2.prometheus系统架构图

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

1.Prometheus Server:
Prometheus Sever是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储及查询。
Prometheus Server可以通过静态配置管理监控目标,
也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。
其次Prometheus Sever需要对采集到的数据进行存储,
Prometheus Server本身就是一个实时数据库,将采集到的监控数据按照时间序列的方式存储在
本地磁盘当中。Prometheus Server对外提供了自定义的PromQL,实现对数据的查询以及分析。
另外Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据。

2 Exporters:
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,
Prometheus Server通过访问该Exporter提供的Endpoint端点,即可以获取到需要采
集的监控数据。可以将Exporter分为2类:
#直接采集
这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,
Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
#间接采集
原有监控目标并不直接支持Prometheus,因此需要通过Prometheus提供的Client Library
编写该监控目标的监控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。

3 AlertManager:
在Prometheus Server中支持基于Prom QL创建告警规则,如果满足Prom QL定义的规则,则会产
生一条告警。在AlertManager从 Prometheus server 端接收到 alerts后,会进行去除重复
数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,
webhook等。

4 PushGateway:
Prometheus数据采集基于Prometheus Server从Exporter pull数据,因此当网络环境不允许
Prometheus Server和Exporter进行通信时,可以使用PushGateway来进行中转。通过
PushGateway将内部网络的监控数据主动Push到Gateway中,Prometheus Server采用针
对Exporter同样的方式,将监控数据从PushGateway pull到Prometheus Server。

1.3.prometheus安装
监听端口9090
此次实验安装:???https://github.com/prometheus/prometheus/releases/download/v2.11.1/prometheus-2.11.1.linux-amd64.tar.gz??
1.3.1.二进制方式安装
tar xf prometheus-2.11.1.linux-amd64.tar.gz-C /usr/local/
ln -s /usr/local/prometheus-2.11.1.linux-amd64 /usr/local/prometheus

1.3.2.prometheus启动脚本
vim /lib/systemd/system/prometheus.service
-------------------------------------------------------------
[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

1.3.3.启动prometheus服务
systemctl daemon-reload
systemctl restart prometheus
systemctl enable prometheus


1.3.4.访问prometheus web界面
http://192.168.47.47:9090



1.4.node exporter
监听端口为9100
收集各k8s node节点上的监控指标数据

下载地址:??https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz??
1.4.1.二进制方式安装node exporter
tar xf node_exporter-0.18.1.linux-amd64.tar.gz-C /usr/local/
ln -s /usr/local/node_exporter-0.18.1.linux-amd64 /usr/local/node_exporter

1.4.2.创建node exporter启动脚本
vim /lib/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target

1.4.3.启动node exporter服务
systemctl daemon-reload
systemctl restart node-exporter
systemctl enable node-exporter

1.4.4.访问node exporter web界面
http://192.168.47.53:9100/metrics


1.5.prometheus采集node 指标数据
配置prometheus通过node exporter采集 监控指标数据
1.5.1.prometheus配置文件
vim /usr/local/prometheus/prometheus.yml
- job_name: promethues-node
static_configs:
- targets: [192.168.47.53:9100,192.168.47.54:9100]


1.5.2.重启prometheus服务
systemctlrestart prometheus

1.5.3.prometheus验证node节点状态
1.5.4.prometheus验证node节点监控数据

2.grafana监听3000端口
调用prometheus的数据,进行更专业的可视化
下载:??https://grafana.com/get/?plcmt=top-nav& cta=downloads& tab=self-managed??

??https://grafana.com/grafana/download?pg=get& plcmt=selfmanaged-box1-cta1??
2.1.安装
sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.5.0_amd64.deb
sudo dpkg -i grafana-enterprise_8.5.0_amd64.deb


2.2.配置文件
vim /etc/grafana/grafana.ini
--------------------------------------------------------
[server]
# Protocol (http, https, socket)
protocol = http
# The ip address to bind to, empty will bind to all interfaces
http_addr = 0.0.0.0
# The http port to use
http_port = 3000

2.3.启动grafana
systemctl start grafana-server.service
systemctl enable grafana-server.service

2.4.grafana web界面
默认账号和密码都是admin;登录进去要求强制修改密码



2.5.添加prometheus数据源




2.6.import模板
模板下载地址:??https://grafana.com/grafana/dashboards/??
模板:Node Exporter Full:??https://grafana.com/grafana/dashboards/1860??
- job_name: node
static_configs:
- targets: [localhost:9100]

2.6.1.通过模板ID导入

模板ID:1860

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

下载:??https://github.com/google/cadvisor/releases?page=3??
cadvisor镜像准备
docker pull google/cadvisor:v0.33.0
docker tag 752d61707eac harbor.gesila.com/k8s/cadvisor:v0.33.0
docker push harbor.gesila.com/k8s/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 \\
harbor.gesila.com/k8s/cadvisor:v0.33.0

验证cadvisor web界面
访问node节点的cadvisor监听端口:http://192.168.47.53:8080



prometheus采集cadvisor数据
vim /usr/local/prometheus/prometheus.yml




systemctl restart prometheus



grafana添加pod监控模板
395

893

4.prometheus报警设置prometheus触发一条告警的过程
prometheus---> 触发阈值---> 超出持续时间---> alertmanager--->
分组|抑制|静默---> 媒体类型---> 邮件|钉钉|微信等

分组(group):#将类似性质的警报合并为单个通知。
静默(silences):#是一种简单的特定时间静音的机制,例如:服务器要升级维护
可以先设置这个时间段告警静默。
抑制(inhibition):#当警报发出后,停止重复发送由此警报引发的其他警报,可以消除冗余告警


tar xf alertmanager-0.18.0.linux-amd64.tar.gz-C /usr/local/
ln -s /usr/local/alertmanager-0.18.0.linux-amd64 /usr/local/alertmanager
cd /usr/local/alertmanager

4.1.配置alertmanager
官方配置文档:??https://prometheus.io/docs/alerting/latest/configuration/??
global:
resolve_timeout: 5m
smtp_smarthost: smtp.qq.com:465
smtp_from: 794411268@qq.com
smtp_auth_username: 794411268@qq.com
smtp_auth_password: koazmkwvoblwbebb
smtp_hello: @qq.com
smtp_require_tls: false

route:
group_by: [alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 2m
receiver: web.hook
receivers:
- name: web.hook
#webhook_configs:
#- url: http://127.0.0.1:5001/
email_configs:
- to: 794411268@qq.com
inhibit_rules:
- source_match:
severity: critical
target_match:
severity: warning
equal: [alertname, dev, instance]

4.2.启动alertmanager服务
./alertmanager --config.file=./alertmanager.yml &
#验证alertmanager的9093端口已经监听
lsof -i:9093


4.3.配置prometheus报警规则
vim /usr/local/prometheus/prometheus.yml


4.4.创建报警规则文件
【k8s-容器监控与报警】vim /usr/local/prometheus/rule-linux36.yml
groups:
- name: linux36_pod.rules
rules:
- alert: Pod_all_cpu_usage
expr: (sum by(name)(rate(container_cpu_usage_seconds_totalimage!=""[5m]))*100) > 10
for: 5m
labels:
severity: critical
service: pods
annotations:
description: 容器$labels.nameCPU 资源利用率大于

    推荐阅读