vincen 发表于 2018-1-5 22:52:57

基于prometheus监控k8s集群

  本文建立在你已经会安装prometheus服务的基础之上,如果你还不会安装,请参考:prometheus多维度监控容器
  如果你还没有安装库k8s集群,情参考: 从零开始搭建基于calico的kubenetes

前言
  kubernetes显然已成为各大公司亲睐的容器编排工具,各种私有云公有云平台基于它构建,那么,我们怎么监控集群中的所有容器呢?目前有三套方案:


[*]  heapster+influxDB
  heapster为k8s而生,它从apiserver获取节点信息,每个节点kubelet内含了cAdvisor的功能,暴露出api,heapster通过访问这些端点得到容器监控数据。它支持多种储存方式,大家常用的的就是influxDB。这套方案的缺点是缺乏报警等功能,influxDB的单点问题。因此本方案适合需求是只要实时监控展示。

[*]  heapster+hawkular
  本方案解决了上面方案的问题,并且大大提升了监控的高可用性和高性能。比较重量级,适合大型集群的监控。目前hawkular开源不久。功能完善。有兴趣可以研究。本文不做详细介绍。

[*]  prometheus
  本方案下文详细叙述。

k8s支持prometheus
  prometheus作为一个时间序列数据收集,处理,存储的服务,能够监控的对象必须直接或间接提供prometheus认可的数据模型,通过http api的形式暴露出来。我们知道cAdvisor支持prometheus,同样,包含了cAdivisor的kubelet也支持prometheus。每个节点都暴露了供prometheus调用的api。

prometheus支持k8s
  prometheus获取监控端点的方式有很多,其中就包括k8s,prometheu会通过调用master的apiserver获取到节点信息,然后去调取每个节点的数据。

配置方式
  以下为一个简单的配置例子
  

global:  scrape_interval: 20s
  scrape_timeout: 10s
  evaluation_interval: 20s
  

  
scrape_configs:
  
- job_name: 'kubernetes-nodes-cadvisor'
  kubernetes_sd_configs:
  - api_server: 'http://<YOUR MASTER IP>:8080'
  role: node
  relabel_configs:
  - action: labelmap
  regex: __meta_kubernetes_node_label_(.+)
  - source_labels:
  action: replace
  target_label: kubernetes_role
  #将默认10250端口改成10255端口
  - source_labels:
  regex: '(.*):10250'
  replacement: '${1}:10255'
  target_label: __address__
  
#以下是监控每个宿主机,需要安装node-exporter
  
- job_name: 'kubernetes_node'
  kubernetes_sd_configs:
  - role: node
  api_server: 'http://172.16.100.101:8080'
  relabel_configs:
  - source_labels:
  regex: '(.*):10250'
  replacement: '${1}:9100'
  target_label: __address__
  


[*]1
[*]2
[*]3
[*]4
[*]5
[*]6
[*]7
[*]8
[*]9
[*]10
[*]11
[*]12
[*]13
[*]14
[*]15
[*]16
[*]17
[*]18
[*]19
[*]20
[*]21
[*]22
[*]23
[*]24
[*]25
[*]26
[*]27
[*]28
[*]29
[*]30
[*]31


[*]1
[*]2
[*]3
[*]4
[*]5
[*]6
[*]7
[*]8
[*]9
[*]10
[*]11
[*]12
[*]13
[*]14
[*]15
[*]16
[*]17
[*]18
[*]19
[*]20
[*]21
[*]22
[*]23
[*]24
[*]25
[*]26
[*]27
[*]28
[*]29
[*]30
[*]31
  以上为prometheus的配置,如上配置会监控每个节点的容器信息和节点监控信息。需要在k8s中部署node-exporter pod,yaml文件如下:
  

apiVersion: v1  
kind: Service
  
metadata:
  annotations:
  prometheus.io/scrape: 'true'
  labels:
  app: node-exporter
  name: node-exporter
  name: node-exporter
  
spec:
  clusterIP: None
  ports:
  - name: scrape
  port: 9100
  protocol: TCP
  selector:
  app: node-exporter
  type: ClusterIP
  

  
apiVersion: extensions/v1beta1
  
kind: DaemonSet
  
metadata:
  name: node-exporter
  
spec:
  template:
  metadata:
  labels:
  app: node-exporter
  name: node-exporter
  spec:
  containers:
  - image: prom/node-exporter
  name: node-exporter
  ports:
  - containerPort: 9100
  hostPort: 9100
  name: scrape
  hostNetwork: true
  hostPID: true
  


[*]1
[*]2
[*]3
[*]4
[*]5
[*]6
[*]7
[*]8
[*]9
[*]10
[*]11
[*]12
[*]13
[*]14
[*]15
[*]16
[*]17
[*]18
[*]19
[*]20
[*]21
[*]22
[*]23
[*]24
[*]25
[*]26
[*]27
[*]28
[*]29
[*]30
[*]31
[*]32
[*]33
[*]34
[*]35
[*]36
[*]37
[*]38
[*]39


[*]1
[*]2
[*]3
[*]4
[*]5
[*]6
[*]7
[*]8
[*]9
[*]10
[*]11
[*]12
[*]13
[*]14
[*]15
[*]16
[*]17
[*]18
[*]19
[*]20
[*]21
[*]22
[*]23
[*]24
[*]25
[*]26
[*]27
[*]28
[*]29
[*]30
[*]31
[*]32
[*]33
[*]34
[*]35
[*]36
[*]37
[*]38
[*]39
  node-exporter启动成功后,启动prometheus即可监控到集群的宿主机和容器状态信息。监控端点如下图:
http://blog.yiyun.pro/images/2016/11/1478773680_824805ae-8259-4146-b2af-b82c7eca120b.png

进阶
  不仅监控容器状态,经过k8s,prometheus可以获取到部署到集群中的所有服务。如果是一个exporter服务,依然可以被prometheus收集。prometheus配置文件中
  

- role: node  


[*]1


[*]1
  role支持:node,pod,service,endpoints
  具体的效果你自己去尝试吧。。
  本文来自:一云博客:基于prometheus监控k8s集群
页: [1]
查看完整版本: 基于prometheus监控k8s集群