k8s-容器监控与报警
Posted 小怪獣55
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
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节点上的监控指标数据
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服务
systemctl restart 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.创建报警规则文件
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.name CPU 资源利用率大于 06-k8s服务层event监控及报警