k8s基础 (六) – 监控与报警.md

一、监控系统基础概念

1.1 监控系统发展史

  • SNMP监控时代:网络设备及网络流量,主要监控网络设备及操作系统,需要内置SNMP支持,产生于上世纪80年代;
  • 当今的监控系统:数据采集、存储、告警、展示等功能,zabbix、prometheus、cacti、Nagios、openfoam、Grafana;
  • 下一代监控系统: 依赖立体监控的,基于 DataOps、AiOps 的,对于系统运行状态的分析与监视,并回馈到系统上,达到自动处理的方案。

1.2 监控系统组件

  • 指标数据采集(抓取)
  • 指标数据存储
  • 指标数据趋势分析及可视化
  • 告警:WeChat、DingTalk、Email …

1.3 监控体系

  • 系统层监控
    • 系统监控:CPU、Load、Memory、Swap、Disk、IO、Processes、Kernel Parameter …
    • 网络监控:网络设备、工作负载、网络延迟、丢包率 …
  • 中间件及基础设施类服务监控
    • 消息中间件:Kafka、RocketMQ、RabbitMQ …
    • WEB服务容器:Tomcat、Jetty …
    • 数据库及缓存系统:MySQL、PostgreSQL、MonoDB、ElasticSearch、Redis …
    • 数据库连接池:ShardingSpere …
    • 存储系统:ceph …
  • 应用层监控
    • 用于衡量应用程序代码的状态和性能
  • 业务层监控
    • 用于衡量应用程序的价值,如电商网站上的销售量
    • QPS、DAU日活、转化率
    • 业务接口:登录数、注册数、订单量、搜索量、支付量 …
  • 端监控
    • App、特定程序 的特定的表现 …

1.4 云原生时代的可观测性

  • 可观测性系统
    • 指标监控(Metric):随着时间推移而产生的与监控相关的可聚合数据点;
    • 日志监控(Logging):离散式的日志或事件;
    • 链路监控(Tracing):分布式应用调用跟踪链,调用的性能数据及状态数据。
  • CNCF将可观测性和数据分析归类并划分为4个子类
    • 监控系统:以Prometheus等为代表;
    • 日志系统:以ElasticStack和PLG Stack等为代表;
    • 分布式调用链跟踪系统:以Zipkin、Jaeger、SkyWalking、Pinpoint等为代表;
    • 混沌工程系统:以ChaosMonkey、ChaosBlade等为代表。

1.5 著名的监控方法论

  • Google的四个黄金指标
    • 常用于在服务级别帮助衡量终端用户体验、服务中断、业务影响等层面的问题
    • 适用于应用及服务监控
  • Netflix的USE方法
    • 全称为“Utilization Saturation and Errors Method”,主要用于分析系统性能问题,可以指导用户快速识别资源瓶颈以及错误的方法
    • 适用于主机指标监控
  • Weave Cloud的RED方法
    • Weave Cloud基于Google的四个黄金指标的原则下结合Prometheus以及Kubernetes容器实践,细化和总结的方法论
    • 适用于云原生应用以及微服务架构应用的监控和度量

1.5.1 黄金指标

四个黄金指标源自Google的SRE一书
延迟(Latency)
– 服务请求所需要的时长,例如HTTP请求平均延迟;
– 需要区分失败请求和成功请求;
流量(Traffic)
– 衡量服务的容量需求, 例如每秒处理的HTTP请求数或者数据库系统的事务数量;
错误(Errors)
– 请求失败的速率,用于衡量错误发生的情况
– 例如,HTTP 500错误数等显式失败,返回错误内容或无效内容等隐式失败,以及由策略原因导致的失败(例如强制要求响应时间超过30毫秒的请求视为错误);
饱和度(Saturation)
– 衡量资源的使用情况,用于表达应用程序有多“满”
– 例如内存、CPU、I/O、磁盘等资源的使用量

1.5.2 USE方法

USE方法由Netflix的内核和性能工程师Rendan Gregg提出,主要用于分析系统性能问题
使用率(Utilization)
关注系统资源的使用情况。 这里的资源主要包括但不限于:CPU,内存,网络,磁盘等等,100%的使用率通常是系统性能瓶颈的标志
饱和度(Saturation)
例如CPU的平均运行排队长度,这里主要是针对资源的饱和度(注意,不同于4大黄金信号),任何资源在某种程度上的饱和都可能导致系统性能的下降
错误(Errors)
错误计数。例如:“网卡在数据包传输过程中检测到的以太网网络冲突了14次”。

1.5.3 RED方法

RED方法是Weave Cloud在基于Google的4个黄金指标的原则下结合Prometheus以及Kubernetes容器实践,细化和总结的方法论,特别适合于云原生应用以及微服务架构应用的监控和度量。

在四大黄金指标的原则下,RED方法可以有效地帮助用户衡量云原生以及微服务应用下的用户体验问题;

RED方法主要关注以下3种关键指标
– (Request)Rate:每秒钟接收的请求数,即速率;
– (Request)Errors:每秒失败的请求数,即错误数;
– (Request)Duration:每个请求所花费的时长;

二、Prometheus

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

2.1 prometheus简介

https://prometheus.io/docs/ #官方文档
https://github.com/prometheus #github地址

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)

2.2 prometheus 系统架构图

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

2.3 prometheus 安装方式

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

2.3.1 二进制方式安装

tar xvf prometheus-2.26.0.linux-amd64.tar.gz -C /usr/local/src
cd /usr/local/src
ln -sv /usr/local/src/prometheus-2.26.0.linux-amd64 /usr/local/prometheus

创建 prometheus 启动脚本

# vim /etc/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

启动 prometheus 服务

systemctl daemon-reload
systemctl restart prometheus
systemctl enable prometheus

访问prometheus web界面

2.3.2 operator 部署 prometheus

git clone https://github.com/prometheus-operator/kube-prometheus.git

三、监控 node 节点

Exporter 是 Prometheus 的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取,默认的抓取地址为http://CURRENT_IP:9100/metrics

node exporter:用于采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等基础监控,类似于传统主机监控维度的zabbix-agent

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

3.1 二进制方式安装 node exporter

cd /usr/local/src
tar xf node_exporter-1.1.2.linux-amd64.tar.gz
ln -sv /usr/local/src/node_exporter-1.1.2.linux-amd64 /usr/local/node_exporter

3.2 创建node exporter启动脚本

# vim /etc/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

3.3 启动node exporter服务

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

3.4 访问node exporter web界面

3.5 prometheus 采集 node 指标数据

配置prometheus通过node exporter采集 监控指标数据

3.5.1 prometheus 配置文件

# cd /usr/local/prometheus
# grep -v "#" prometheus.yml | grep -v "^$"
global:
alerting:
  alertmanagers:
  - static_configs:
    - targets:
rule_files:
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'k8s-master'
    static_configs:
    - targets: ['192.168.7.101:9100','192.168.7.102:9100']
  - job_name: 'k8s-node'
    static_configs:
    - targets: ['192.168.7.104:9100','192.168.7.105:9100']

# 重启 prometheus
systemctl restart prometheus

3.5.2 prometheus 验证 node 节点状态

3.5.3 prometheus 验证 node 节点监控数据

四、Grafana

https://grafana.com/docs/ #官方安装文档
调用prometheus的数据,进行更专业的可视化

4.1 安装 grafana

参考:https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.5.4_amd64.deb
sudo dpkg -i grafana_7.5.4_amd64.deb

4.2 配置文件并启动

生产采用 mysql 数据库

# 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

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

4.3 grafana web 界面

账户密码:admin/admin

4.4 添加 prometheus 数据源

Configuration-Add data source-Prometheus

4.5 import模板

导入模板查看web

4.5.1 模板下载

https://grafana.com/grafana/dashboards

4.5.2 通过模板 ID 或 JSON 文件导入

4.5.3 确认模板信息

4.5.4 验证图形信息

五、监控 pod 资源

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

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

参考:https://github.com/google/cadvisor

5.1 cadvisor 镜像准备

github:https://github.com/google/cadvisor
镜像仓库:https://console.cloud.google.com/gcr/images/google-containers/GLOBAL

docker pull gcr.io/google-containers/cadvisor:v0.36.0
docker tag gcr.io/google-containers/cadvisor:v0.36.0
harbor.linux.net/baseimages/cadvisor:v0.36.0
docker push harbor.linux.net/baseimages/cadvisor:v0.36.0

5.2 启动 cadvisor 容器

docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8081:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
harbor.linux.net/baseimages/cadvisor:v0.36.0

5.3 验证 cadvisor web 界面

5.4 prometheus 采集 cadvisor 数据

# vim /usr/local/prometheus/prometheus.yml
  - job_name: 'k8s-containers'
    static_configs:
    - targets: ['192.168.7.101:8081','192.168.7.102:8081','192.168.7.104:8081','192.168.7.105:8081']

# systemctl restart prometheus

5.5 验证 prometheus 数据

5.6 grafana添加pod监控模板

六、prometheus 报警设置

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

6.1 下载并报警组件 alertmanager

tar xvf alertmanager-0.21.0.linux-amd64.tar.gz  -C /usr/local/src/
ln -sv /usr/local/src/alertmanager-0.21.0.linux-amd64/ /usr/local/alertmanager

6.2 配置 alertmanager

官方配置文档:https://prometheus.io/docs/alerting/configuration/

# vim /usr/local/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '582@qq.com'
  smtp_auth_username: '582@qq.com'
  smtp_auth_password: 'jbopxjjkfhxabeij'
  smtp_hello: '@qq.com'
  smtp_require_tls: true

route: # route 用来设置报警的分发策略
  group_by: ['alertname'] # 采用哪个标签来作为分组依据
  group_wait: 10s # 组告警等待时间。也就是告警产生后等待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: '582@qq.com'
inhibit_rules: # 禁止的规则
  - source_match: # 源匹配级别
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

6.3 启动alertmanager服务

# 二禁止启动
./alertmanager --config.file=./alertmanager.yml

# 启动脚本:
# cat /etc/systemd/system/alertmanager.service

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

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

[Install]

# systemctl daemon-reload  && systemctl restart alertmanager.service

6.4 配置 prometheus 报警规则

# cd /usr/local/prometheus
# vim prometheus.yml
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 192.168.7.103:9093 # alertmanager地址


# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/usr/local/prometheus/rule-test.yml" # 指定规则文件
  # - "second_rules.yml"

6.5 创建报警规则文件

参考:https://prometheus.io/docs/alerting/latest/notification_examples/
测试数据报警值较小

# cat /usr/local/prometheus/rule-test.yml
groups:
  - name: test_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 资源利用率大于 10% , (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 }})

6.6 报警规则验证

# 验证 rule 规则文件是否正确
<root@ubuntu183 prometheus>#./promtool check rules rule-test.yml
Checking rule-test.yml
  SUCCESS: 3 rules found
<root@ubuntu183 prometheus>#./promtool check config prometheus.yml
Checking prometheus.yml
  SUCCESS: 1 rule files found

Checking /usr/local/prometheus/rule-test.yml
  SUCCESS: 3 rules found

# 验证报警规则匹配
cd /usr/local/alertmanager
<root@ubuntu183 alertmanager>#./amtool alert --alertmanager.url=http://192.168.7.103:9093
Alertname          Starts At                Summary
Pod_all_cpu_usage  2021-04-15 17:10:37 UTC  Dev CPU 负载告警

6.7 prometheus 首页状态

6.8 验证收到的报警邮件

七、prometheus 监控 haproxy

haproxy_exporter:抓取 HAProxy 数据并通过 HTTP 将它们导出,供 Prometheus使用
参考:https://github.com/prometheus/haproxy_exporter

7.1 部署 haproxy_exporter

tar xvf haproxy_exporter-0.12.0.linux-amd64.tar.gz -C /usr/local/src/
ln -sv /usr/local/src/haproxy_exporter-0.12.0.linux-amd64/ /usr/local/haproxy_exporter

7.2 启动 haproxy_exporter 并验证

<root@ubuntu183 ~>#cd /usr/local/haproxy_exporter
<root@ubuntu183 haproxy_exporter>#ls
haproxy_exporter  LICENSE  NOTICE
<root@ubuntu183 haproxy_exporter>#./haproxy_exporter --haproxy.scrape-uri="http://haadmin:123456@192.168.7.107:9999/haproxy-status;csv"
level=info ts=2021-04-16T06:01:57.061Z caller=haproxy_exporter.go:577 msg="Starting haproxy_exporter" version="(version=0.12.0, branch=HEAD, revision=74de6958e815f82985b095cb443daca0edd1d5a7)"
level=info ts=2021-04-16T06:01:57.061Z caller=haproxy_exporter.go:578 msg="Build context" context="(go=go1.15.6, user=root@1c53eee2f63f, date=20201209-16:37:40)"
level=info ts=2021-04-16T06:01:57.062Z caller=haproxy_exporter.go:606 msg="Listening on address" address=:9101

# 或者连接sockt
./haproxy_exporter --haproxy.scrape-uri=unix:/run/haproxy/admin.sock

访问:http://192.168.7.103:9101

7.3 prometheus server端配置

# vim /usr/local/prometheus/prometheus.yml
  - job_name: 'prometheus-haproxy'
    static_configs:
    - targets: ['192.168.7.103:9101']

systemctl restart prometheus.service

7.4 grafana 添加模板

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇