7

k8s-容器监控与报警

 2 years ago
source link: https://blog.51cto.com/taowenwu/5244326
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

k8s-容器监控与报警

推荐 原创

小怪獣55 2022-04-22 14:46:51 博主文章分类:k8s ©著作权

文章标签 k8s-容器监控与报警 文章分类 Linux 系统/运维 阅读数308

容器监控的实现方对比虚拟机或者物理机来说比大的区别,比如容器在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系统架构图

k8s-容器监控与报警_k8s-容器监控与报警

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

k8s-容器监控与报警_k8s-容器监控与报警_02

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

k8s-容器监控与报警_k8s-容器监控与报警_03

1.3.4.访问prometheus web界面

http://192.168.47.47:9090

k8s-容器监控与报警_k8s-容器监控与报警_04

k8s-容器监控与报警_k8s-容器监控与报警_05

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

k8s-容器监控与报警_k8s-容器监控与报警_06

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

k8s-容器监控与报警_k8s-容器监控与报警_07

1.4.4.访问node exporter web界面

http://192.168.47.53:9100/metrics

k8s-容器监控与报警_k8s-容器监控与报警_08

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']

k8s-容器监控与报警_k8s-容器监控与报警_09

1.5.2.重启prometheus服务

systemctl restart prometheus

1.5.3.prometheus验证node节点状态

k8s-容器监控与报警_k8s-容器监控与报警_10

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

k8s-容器监控与报警_k8s-容器监控与报警_11

k8s-容器监控与报警_k8s-容器监控与报警_12

2.grafana

监听3000端口

调用prometheus的数据,进行更专业的可视化

下载:​ ​https://grafana.com/get/?plcmt=top-nav&cta=downloads&tab=self-managed​

k8s-容器监控与报警_k8s-容器监控与报警_13

 ​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

k8s-容器监控与报警_k8s-容器监控与报警_14

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;登录进去要求强制修改密码

k8s-容器监控与报警_k8s-容器监控与报警_15

k8s-容器监控与报警_k8s-容器监控与报警_16

k8s-容器监控与报警_k8s-容器监控与报警_17

2.5.添加prometheus数据源

k8s-容器监控与报警_k8s-容器监控与报警_18

k8s-容器监控与报警_k8s-容器监控与报警_19

k8s-容器监控与报警_k8s-容器监控与报警_20

k8s-容器监控与报警_k8s-容器监控与报警_21

2.6.import模板

模板下载地址:​ ​https://grafana.com/grafana/dashboards/​

模板:Node Exporter Full:​ ​https://grafana.com/grafana/dashboards/1860​

k8s-容器监控与报警_k8s-容器监控与报警_22

- job_name: node
static_configs:
- targets: ['localhost:9100']

2.6.1.通过模板ID导入

k8s-容器监控与报警_k8s-容器监控与报警_23

k8s-容器监控与报警_k8s-容器监控与报警_24

模板ID:1860

k8s-容器监控与报警_k8s-容器监控与报警_25

模板ID:8919

k8s-容器监控与报警_k8s-容器监控与报警_26

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

k8s-容器监控与报警_k8s-容器监控与报警_27

k8s-容器监控与报警_k8s-容器监控与报警_28

prometheus采集cadvisor数据

vim /usr/local/prometheus/prometheus.yml

k8s-容器监控与报警_k8s-容器监控与报警_29

systemctl restart prometheus

k8s-容器监控与报警_k8s-容器监控与报警_30

k8s-容器监控与报警_k8s-容器监控与报警_31

grafana添加pod监控模板

395

k8s-容器监控与报警_k8s-容器监控与报警_32

893

k8s-容器监控与报警_k8s-容器监控与报警_33

4.prometheus报警设置

prometheus触发一条告警的过程

prometheus--->触发阈值--->超出持续时间--->alertmanager--->
分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等
分组(group): #将类似性质的警报合并为单个通知。
静默(silences): #是一种简单的特定时间静音的机制,例如:服务器要升级维护
可以先设置这个时间段告警静默。
抑制(inhibition):#当警报发出后,停止重复发送由此警报引发的其他警报,可以消除冗余告警

k8s-容器监控与报警_k8s-容器监控与报警_34

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: '[email protected]'
smtp_auth_username: '[email protected]'
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: '[email protected]'
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

k8s-容器监控与报警_k8s-容器监控与报警_35

4.3.配置prometheus报警规则

vim /usr/local/prometheus/prometheus.yml

k8s-容器监控与报警_k8s-容器监控与报警_36

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_total{image!=""}[5m]))*100) > 10
for: 5m
labels:
severity: critical
service: pods
annotations:
description: 容器 {{ $labels.name }} CPU 资源利用率大于 75% , (current value is {{ $value }})
summary: Dev CPU 负载告警
- alert: Pod_all_memory_usage
expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""}[5m]))*100) > 1024*10^3*2
for: 10m
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} Memory 资源利用率大于 2G , (current value is {{ $value }})
summary: Dev Memory 负载告警
- alert: Pod_all_network_receive_usage
expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 1024*1024*50
for: 10m
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} network_receive 资源利用率大于 50M ,(current value is {{ $value }})

4.5.报警规则验证

#验证报警规则设置
cd /usr/local/prometheus/
./promtool check rules rule-linux36.yml #监测rule规则文件是否正确
Checking rule-linux36.yml
SUCCESS: 3 rules found

k8s-容器监控与报警_k8s-容器监控与报警_37

4.6.重启prometheus

systemctl restart prometheus

4.7.prometheus首页状态

k8s-容器监控与报警_k8s-容器监控与报警_38

4.8.prometheus web界面验证报警规则

k8s-容器监控与报警_k8s-容器监控与报警_39

4.9.验证收到的报警邮件

k8s-容器监控与报警_k8s-容器监控与报警_40

5.prometheus监控haproxy

默认端口:9101

下载地址:​ ​https://prometheus.io/download/​

 ​https://github.com/prometheus/haproxy_exporter/releases/download/v0.9.0/haproxy_exporter-0.9.0.linux-amd64.tar.gz​

tar xf haproxy_exporter-0.9.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
ln -s /usr/local/haproxy_exporter-0.9.0.linux-amd64 /usr/local/haproxy_exporter
#通过socket访问
./haproxy_exporter --haproxy.scrape-uri=unix:/run/haproxy/admin.sock
#通过状态页访问
./haproxy_exporter --haproxy.scrapeuri="http://haadmin:[email protected]:9999/haproxy-status;csv" &

k8s-容器监控与报警_k8s-容器监控与报警_41

5.1.prometheus server端添加haproxy数据采集

vim /usr/local/prometheus/prometheus.yml

k8s-容器监控与报警_k8s-容器监控与报警_42

systemctl restart prometheus

k8s-容器监控与报警_k8s-容器监控与报警_43

5.2.grafana添加模板

k8s-容器监控与报警_k8s-容器监控与报警_44

k8s-容器监控与报警_k8s-容器监控与报警_45

  • 1收藏
  • 1评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK