Prometheus监控Kubernetes资源与应用

目录

1 监控方案 2

2 监控指标 4

3 实现思路 4

4 在K8S中部署Prometheus 4

5 在K8S中部署Grafana与可视化 4

6 监控K8S集群Node与Pod 4

7 监控K8S资源对象 5

8 在K8S中部署Alertmanager 6

9 Prometheus告警 6

10 实验 7

1 监控方案

老的监控系统无法感知这些动态创建的服务,已经不适合容器化的场景

cAdvisor+Heapster+InfluxDB+Grafana

Y

简单

容器监控

cAdvisor/exporter+Prometheus+Grafana

Y

扩展性好

容器,应用,主机全方面监控

对于非容器化业务来说,像Zabbix,open-falcon已经在企业深入使用。

而Prometheus新型的监控系统的兴起来源容器领域,所以重点是放在怎么监控容器。

随着容器化大势所趋,如果传统技术不随着改变,将会被淘汰,基础架构也会发生新的技术栈组合。

cAdvisor+InfluxDB+Grafana

cAdvisor:是谷歌开源的一个容器监控工具,采集主机上容器相关的性能指标数据。比如CPU、内存、网络、文件系统等。

Heapster是谷歌开源的集群监控数据收集工具,会收集所有节点监控数据,Heapster作为一个pod在集群中运行,通过API获得集群中的所有节点,然后从节点kubelet暴露的10255汇总数据。目前社区用Metrics Server 取代 Heapster。

InfluxDB:时序数据库,存储监控数据。

Grafana:可视化展示。Grafana提供一个易于配置的仪表盘UI,可以轻松定制和扩展。

不足

l 功能单一,无法做到对K8S资源对象监控

l 告警单一,利用Grafana基本告警

l 依赖Influxdb,而Influxdb单点(高可用商业才支持),缺少开源精神

l heapster在1.8+弃用,metrics-server取代

cAdvisor/exporter+Prometheus+Grafana

Prometheus+Grafana是监控告警解决方案里的后起之秀

通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。

# Kubernetes的API
SERVER会暴露API服务,Promethues集成了对Kubernetes的自动发现,它有# 5种模式:Node、Service、Pod、Endpoints、ingress。

n 通过cadvisor采集容器、Pod相关的性能指标数据,并通过暴露的/metrics接口用prometheus抓取

n 通过prometheus-node-exporter采集主机的性能指标数据,并通过暴露的/metrics接口用prometheus抓取

n 应用侧自己采集容器中进程主动暴露的指标数据(暴露指标的功能由应用自己实现,并添加平台侧约定的annotation,平台侧负责根据annotation实现通过Prometheus的抓取)

n 通过kube-state-metrics采集k8s资源对象的状态指标数据,并通过暴露的/metrics接口用prometheus抓取

n 通过etcd、kubelet、kube-apiserver、kube-controller-manager、kube-scheduler自身暴露的/metrics获取节点上与k8s集群相关的一些特征指标数据。

2 监控指标

Kubernetes本身监控

• Node资源利用率

• Node数量

• Pods数量(Node)

• 资源对象状态

Pod监控

• Pod数量(项目)

• 容器资源利用率

• 应用程序

3 实现思路

监控指标

具体实现

举例

Pod性能(k8s集群资源监控)

cAdvisor

容器CPU,内存利用率
prometheus->apiserver(masterip:6443)->kubelet(cadvisor)

Node性能(k8s工作节点监控)

node-exporter

节点CPU,内存利用率

K8S资源对象(k8s资源对象状态监控)

kube-state-metrics

Pod/Deployment/Service

4 在K8S中部署Prometheus

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/prometheus

源码目录:kubernetes/cluster/addons/prometheus

5 在K8S中部署Grafana与可视化

grafana 是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持
Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源,比 Prometheus
自带的图表展示功能强大太多,更加灵活,有丰富的插件,功能更加强大。

https://grafana.com/grafana/download

推荐模板:

• 集群资源监控:3119

• 资源状态监控 :6417

• Node监控 :9276

6 监控K8S集群Node与Pod

(1) Node

Prometheus社区提供的NodeExporter项目可以对主机的关键度量指标进行监控,通过Kubernetes的DeamonSet可以在各个主机节点上部署有且仅有一个NodeExporter实例,实现对主机性能指标数据的监控,但由于容器隔离原因,使用容器NodeExporter并不能正确获取到宿主机磁盘信息,故将NodeExporter部署到宿主机。

使用文档:https://prometheus.io/docs/guides/node-exporter/

GitHub:  https://github.com/prometheus/node_exporter

exporter列表:https://prometheus.io/docs/instrumenting/exporters/

node-exporter所采集的指标主要有:

node_cpu_*

node_disk_*

node_entropy_*

node_filefd_*

node_filesystem_*

node_forks_*

node_intr_total_*

node_ipvs_*

node_load_*

node_memory_*

node_netstat_*

node_network_*

node_nf_conntrack_*

node_scrape_*

node_sockstat_*

node_time_seconds_*

node_timex _*

node_xfs_*

(2) pod

目前cAdvisor集成到了kubelet组件内,可以在kubernetes集群中每个启动了kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有容器相关的性能指标数据。

暴露API接口地址:https://NodeIP:10250/metrics/cadvisor

7 监控K8S资源对象

https://github.com/kubernetes/kube-state-metrics

kube-state-metrics是一个简单的服务,它监听Kubernetes
API服务器并生成有关对象状态的指标。它不关注单个Kubernetes组件的运行状况,而是关注内部各种对象的运行状况,例如部署,节点和容器。

kube-state-metrics采集了k8s中各种资源对象的状态信息:

kube_daemonset_*

kube_deployment_*

kube_job_*

kube_namespace_*

kube_node_*

kube_persistentvolumeclaim_*

kube_pod_container_*

kube_pod_*

kube_replicaset_*

kube_service_*

kube_statefulset_*

8 在K8S中部署Alertmanager

设置告警和通知的主要步骤如下:

1. 部署Alertmanager

2. 配置Prometheus与Alertmanager通信

3. 配置告警

1. prometheus指定rules目录

2. configmap存储告警规则

3. configmap挂载到容器rules目录

4. 增加alertmanager告警配置

9 Prometheus告警

(1)
Prometheus告警状态

Inactive: 这里什么都没有发生。

Pending:  已触发阈值,但未满足告警持续时间

Firing:   已触发阈值且满足告警持续时间。警报发送给接受者。

(2)
告警收敛

分组(group): 将类似性质的警报分类为单个通知

抑制(Inhibition): 当警报发出后,停止重复发送由此警报引发的其他警报

静默(Silences): 是一种简单的特定时间静音提醒的机制

(3)
Prometheus发告警流程

默认大约4分钟能收到报警(prometheus收集间隔1m,prometheus评估1m,报警等待1m,报警分组1m),重复发送大约2分钟(报警分组1m,重复报警间隔1m)。

10 实验

主机名

ip

用途

备注

k8s_nfs

172.16.1.60

nfs存储

存储目录/ifs/kubernetes/

k8s-admin

172.16.1.70

k8s主节点

k8s-node1

172.16.1.71

k8s从节点1

k8s-node2

172.16.1.72

k8s从节点2

# 创建名称为ops的命名空间

[root@k8s-admin prometheus]# kubectl create namespace
ops

namespace/ops created

(1)
安装managed-nfs-storage

这里省略安装步骤,可以参考之前的文章完成安装。

[root@k8s-admin nfs-client]# kubectl get
deploy,svc,pod,sc -o wide

 

(2) 部署prometheus

1) yaml文件说明

[root@k8s-admin prometheus]# ls -l
prometheus-*

-rw-r--r-- 1 root root 4965 Jul 24  2020
prometheus-configmap.yaml

# prometheus的主配置文件,采用ConfigMap方式挂载卷,通过kubernetes_sd_configs配置连接

# api-server自动发现被监控项。配置了连接alertmanager的参数。

[root@k8s-admin prometheus]# cat
prometheus-configmap.yaml | grep job_name

- job_name:
prometheus

- job_name:
kubernetes-apiservers

- job_name:
kubernetes-nodes-kubelet

- job_name:
kubernetes-nodes-cadvisor

- job_name:
kubernetes-service-endpoints

- job_name:
kubernetes-services

- job_name:
kubernetes-pods

-rw-r--r-- 1 root root 1064 Jul 24  2020
prometheus-rbac.yaml

# prometheus的权限,ServiceAccount方式,名称prometheus

-rw-r--r-- 1 root root 4840 Jul 24  2020
prometheus-rules.yaml

# prometheus的告警规则,采用ConfigMap方式挂载卷

-rw-r--r-- 1 root root  384 Jul 24  2020
prometheus-service.yaml

# prometheus的SVC,NodePort方式暴露30090端口

-rw-r--r-- 1 root root 3253 Jul 24  2020
prometheus-statefulset.yaml

# 部署prometheus的配置文件,采用statefulset方式部署prometheus。

# 配置serviceAccountName:
prometheus为rbac配置用于连接api-server。

# 将/data目录挂载到nfs动态pvc卷prometheus-data

2) 应用yaml文件

[root@k8s-admin prometheus]# ls prometheus-* | xargs
-i kubectl apply -f {}

configmap/prometheus-config
created

serviceaccount/prometheus created

clusterrole.rbac.authorization.k8s.io/prometheus
created

clusterrolebinding.rbac.authorization.k8s.io/prometheus
created

configmap/prometheus-rules created

service/prometheus created

statefulset.apps/prometheus
created

3) 查看部署信息

[root@k8s-admin prometheus]# kubectl get
statefulset,pod,svc,configmap,ServiceAccount,pvc,pv -n ops -o
wide

补充:如何获取serviceaccount

# 获取serviceaccount在secrets中的名称

[root@k8s-admin prometheus]# kubectl get
serviceaccount prometheus -n ops -o yaml

……

secrets:

- name: prometheus-token-zljjr

# 根据secrets的名称获取token

[root@k8s-admin prometheus]# kubectl describe secret
prometheus-token-zljjr -n ops > /root/token.k8s

# 只保留token.k8s文件最下面的token字符串,其余的全部删除掉。

4) 访问prometheus

http://172.16.1.71:30090/targets

[root@k8s-admin prometheus]# kubectl get svc -n
kube-system

[root@k8s-admin prometheus]# kubectl get ep/kube-dns
-n kube-system

[root@k8s-admin prometheus]# kubectl get svc -n
kube-system -o yaml | head -10

(3)
node节点利用率监控

在node节点上部署exporter导出器

1) 配置文件说明

[root@k8s-admin prometheus]# ls -l
node-exporter-*

-rw-r--r-- 1 root root 1633 Jul 25  2020
node-exporter-ds.yml

# node导出器部署文件,采用DaemonSet方式部署,临时文件存储采用hostPath方式

-rw-r--r-- 1 root root  417 Jul 24  2020
node-exporter-service.yaml

# node导出器svc配置文件,clusterIP为None,暴露内部端口为9100

# 注解annotations下的prometheus.io/scrape:
"true"参数表示service node-exporter可以被prometheus抓取到

2) 应用yaml文件

[root@k8s-admin prometheus]# ls node-exporter-* |
xargs -i kubectl apply -f {}

daemonset.apps/node-exporter
created

service/node-exporter created

3) 查看部署信息

[root@k8s-admin prometheus]# kubectl get
daemonset,pod,svc,ep -o wide -n ops

4) 访问prometheus

http://172.16.1.71:30090/targets

# kubernetes-service-endpoints中增加了如下内容

(4)
k8s资源信息监控

1) 配置文件说明

[root@k8s-admin prometheus]# ls -l
kube-state-metrics-*

-rw-r--r-- 1 root root 2362 Jul 24  2020
kube-state-metrics-deployment.yaml

#  kube-state-metrics
部署文件,Deployment方式,

#  连接api-serverservice的授权配置为AccountName: kube-state-metrics

-rw-r--r-- 1 root root 2536 Jul 24  2020
kube-state-metrics-rbac.yaml

#  授权文件,ServiceAccount方式,名称kube-state-metrics

-rw-r--r-- 1 root root  498 Jul 24  2020
kube-state-metrics-service.yaml

#  kube-state-metrics
svc配置文件,内部暴露端口为8080、8081

#  注解annotations下的prometheus.io/scrape: "true"参数表示service node-exporter可以被prometheus抓取到

2) 应用yaml文件

[root@k8s-admin prometheus]# ls kube-state-metrics-*
| xargs -i kubectl apply -f {}

deployment.apps/kube-state-metrics
created

configmap/kube-state-metrics-config
created

serviceaccount/kube-state-metrics
created

clusterrole.rbac.authorization.k8s.io/kube-state-metrics
created

role.rbac.authorization.k8s.io/kube-state-metrics-resizer
created

clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics
created

rolebinding.rbac.authorization.k8s.io/kube-state-metrics
created

service/kube-state-metrics created

3) 查看部署信息

[root@k8s-admin prometheus]# kubectl get
deployment,pod,svc,ep -o wide -n ops

4) 访问prometheus

http://172.16.1.71:30090/targets

(5)
安装grafana

1) 配置文件说明

[root@k8s-admin prometheus]# ls -l grafana.yaml

-rw-r--r-- 1 root root 1266 Jul 24  2020
grafana.yaml

#  该配置文件包含Deployment和service配置。

#  grafana版本为grafana:7.1.0,/var/lib/grafana挂载到nfs动态pvc卷grafana上

#  service类型为NodePort,暴露外部端口为30030

2) 应用yaml文件

[root@k8s-admin prometheus]# kubectl apply -f
grafana.yaml

deployment.apps/grafana created

persistentvolumeclaim/grafana
created

service/grafana created

3) 查看部署信息

[root@k8s-admin prometheus]# kubectl get
deployment,pod,svc,pvc,pv,ep -n ops -o wide

# 查看存储

4) 登录grafana

http://172.16.1.71:30030/

(6)
在grafana中导入dashboard

1) 配置grafana连接prometheus

# 获取svc值

[root@k8s-admin ~]# kubectl get svc -n
ops

prometheus           NodePort    10.96.111.132   <none>        9090:30090/TCP      47h

Address 1: 10.96.111.132
prometheus.ops.svc.cluster.local

# 连接prometheus

2) 导入"K8S工作节点监控"(node性能)

3) 导入K8S集群资源监控(pod性能)

4)
导入"K8S资源对象状态监控"(kube-state-metrics)

(7)
告警

1) 配置文件说明

[root@k8s-admin prometheus]# ls -l
alertmanager-*

-rw-r--r-- 1 root root  652 Jul 24  2020
alertmanager-configmap.yaml

# alertmanager报警邮箱配置文件,根据需要修改,采用ConfigMap方式挂载

-rw-r--r-- 1 root root 2175 Jul 24  2020
alertmanager-deployment.yaml

# altermanager部署配置,deployment方式部署,nfs动态卷pvc alertmanager挂载到/data

-rw-r--r-- 1 root root  323 Jul 24  2020
alertmanager-pvc.yaml

# nfs动态卷pvc
alertmanager配置文件

-rw-r--r-- 1 root root  384 Jul 24  2020
alertmanager-service.yaml

# alertmanager
svc配置文件,NodePort方式暴露30093端口

2) 应用yaml文件

[root@k8s-admin prometheus]# ls alertmanager-* |
xargs -i kubectl apply -f {}

configmap/alertmanager-config
created

deployment.apps/alertmanager
created

persistentvolumeclaim/alertmanager
created

service/alertmanager created

3) 查看部署信息

[root@k8s-admin prometheus]# kubectl get
deployment,pod,svc,pvc,pv -o wide

4) 访问alertmanager

http://172.16.1.71:30093/#/alerts

5) 查看报警规则

6) 查看报警邮件

(8)
修改Prometheus和Alertmanager配置文件后重启方法

以上的配置中Prometheus和Alertmanager分别在各自的pod中又启动了一个镜像为

jimmidyson/configmap-reload:v0.1的容器,用于监控配置文件的更改,然后重启pod

中的Prometheus和Alertmanager容器,但有时不太起作用,这时需要采用手动的方

法重启pod中的Prometheus和Alertmanager。

[root@k8s-admin prometheus]# kubectl get pod -n ops
-o wide | egrep "prometheus|alertmanager"

Prometheus: curl -XPOST
http://10.244.1.13:9090/-/reload

Alertmanager: curl -XPOST
http://10.244.1.17:9093/-/reload

第15章: Prometheus监控Kubernetes资源与应用的更多相关文章

  1. Kubernetes集群部署史上最详细(二)Prometheus监控Kubernetes集群

    使用Prometheus监控Kubernetes集群 监控方面Grafana采用YUM安装通过服务形式运行,部署在Master上,而Prometheus则通过POD运行,Grafana通过使用Prom ...

  2. Prometheus 监控K8S 资源状态对象

    Prometheus 监控K8S 资源状态对象 官方文档:https://github.com/kubernetes/kube-state-metrics kube-state-metrics是一个简 ...

  3. Prometheus 监控 Kubernetes Job 资源误报的坑

    转载自:https://www.qikqiak.com/post/prometheus-monitor-k8s-job-trap/ 昨天在 Prometheus 课程辅导群里面有同学提到一个问题,是关 ...

  4. 部署prometheus监控kubernetes集群并存储到ceph

    简介 Prometheus 最初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于2016年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目. ...

  5. Prometheus监控学习笔记之解读prometheus监控kubernetes的配置文件

    0x00 概述 Prometheus 是一个开源和社区驱动的监控&报警&时序数据库的项目.来源于谷歌BorgMon项目.现在最常见的Kubernetes容器管理系统中,通常会搭配Pro ...

  6. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  7. Prometheus 监控外部 Kubernetes 集群

    转载自:https://www.qikqiak.com/post/monitor-external-k8s-on-prometheus/ 在实际环境中很多企业是将 Prometheus 单独部署在集群 ...

  8. 使用Prometheus Operator 监控Kubernetes(15)

    一.Prometheus概述: Prometheus是一个开源系统监测和警报工具箱. Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernete ...

  9. Prometheus的监控解决方案(含监控kubernetes)

    prometheus的简介和安装 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有 ...

随机推荐

  1. ESLint语法报错问题

    编写javaScript过程中ESLint语法报错问题 ESLint语法要求: 双引号""需要替换成单引号'' 分号不允许出现 ()之前需要一个空格比如 login () (VSC ...

  2. ]# dmesg | grep ATAcentos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息

    centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息 osc_4o5tc4xq 2019/10/11 15:03 阅读数 253 centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信 ...

  3. 字体:等宽字体与比例字体 - Monospaced font & Proportional font

    字体:等宽字体与比例字体 - Monospaced font & Proportional font 量子波儿 2013-08-24 16:54:12 7101 收藏 1分类专栏: 计算机常识 ...

  4. k8s用 ConfigMap 管理配置(13)

    一.ConfigMap介绍 Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ConfigMap 的创建和使用方 ...

  5. 066.Python框架DRF之序列化器Serializer

    一 序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成 ...

  6. shell基础之变量及表达式

    本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...

  7. Stream中的Peek操作

    1.引言 如果你试图对流操作中的流水线进行调试, 了解stream流水线每个操作之前和操作之后的中间值, 该如何去做? 首先我们看一个例子, 使用forEach将流操作的结果打印出来. 1 /** 2 ...

  8. 微服务系列(二)GRPC的介绍与安装

    微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...

  9. Go语言标准库log介绍

    Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实现了简单的日志服 ...

  10. CUDA C++编程接口:编译

    CUDA C++编程接口:编译 一.概述 CUDA C++为熟悉C++编程语言的用户提供了一个简单的路径,以方便地编写程序以执行该设备. 它由一组最小的扩展到C++语言和运行库. 在编程模型中引入了核 ...