第15章: Prometheus监控Kubernetes资源与应用
Prometheus监控Kubernetes资源与应用
目录
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
[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导出器
[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资源信息监控
[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