订阅博客
收藏博客
微博分享
QQ空间分享

Prometheus+Grafana 监控Kubernetes集群

频道:Docker 标签: 时间:2018年05月25日 浏览:583次 评论:0条

集群版本信息说明

组件名称版本号
kubernetes1.8.1
golang1.8.3
docker17.06.2-ce
prometheusv2.0.0
grafana4.2.0
kube-state-metricsv1.2.0
altermanagerv0.12.0

更改版本后,后续配置信息可能发生改变,需对照文档进行修改与更新

镜像信息说明

镜像名称tag号
prom/prometheusv2.0.0
prom/node-exporterv0.15.2
dockermuenster/caddy0.9.3
giantswarm/tiny-toolslatest
gcr.io/google_containers/kube-state-metricsv1.2.0
grafana/grafana4.6.3
quay.io/prometheus/alertmanagerv0.12.0

yaml文件说明

yaml原版来自于giantswarm/kubernetes-prometheus

经过改动,问题可以查看项目的Issues

YAML文件下载链接
alertmanager-configmap.yaml点击下载
alertmanager-templates.yaml点击下载
alertmanager.yaml点击下载
grafana-import-dashboards-configmap.yaml点击下载
grafana-import-dashboards.yaml点击下载
grafana.yaml点击下载
kube-state-metrics-rbac.yaml点击下载
kube-state-metrics.yaml点击下载
node-directory-size-metrics.yaml点击下载
prometheus-configmap.yaml点击下载
prometheus-node-exporter.yaml点击下载
prometheus-rbac.yaml点击下载
prometheus-rules.yaml点击下载
prometheus.yaml点击下载

Prometheus模块

args问题

采用版本v2.0.0,其中注意args里的参数与老版本不同,具体可以运行./prometheus -h来参考,例如:

--storage.tsdb.retention=12h--storage.tsdb.path=/prometheus--config.file=/etc/prometheus/prometheus.yaml

prometheus-configmap文件

采用configmap挂载到/etc/prometheus/prometheus.yaml,可以参考官方文档CONFIGURATION


    • scrape_interval默认参数为15s,该参数需要小与查询语句中的范围值(例如,1m)


    • scrage_configs为抓取对象,以job_name为单位。这里包含以下抓取对象(均以/metrics结尾):

1.  app为prometheus,component为core,端口为9090;2.  app为prometheus,component为node-exporter,端口为9100;3.  app为kube-state-metrics,端口为8080;4.  app为alertmanager,端口为9093;5.  app为kubelet,端口为10255;6.  app为node-directory-size-metric, 端口为9102;7.  app为cadvisor,端口为4194。

备注:      
1. kubelet的启动参数"--cadvisor-port=0"可以关闭cadvisor的4194端口;2. kubelet以10255端口的抓取种类较少;3. kubelet的“ip:10255/metrics/cadvisor”与cadvisor的"ip:4194/metrics"抓取种类数量类似,但前者仍然偏少(例如:“process_start_time_seconds”);4. 具体可通过浏览器查看`ip:4194/metrics`来查看当前所有的query语句与其结果

prometheus-rules文件

prometheus采用altermanager来进行报警监控。

其中rules文件需要参考官方文档ALERTING RULES进行修改与编写。

同时其对应的配置在prometheus-config.yaml中如下:

...
    rule_files:
      - "/etc/prometheus-rules/alert-rules.yaml"    alerting:
      alertmanagers:
        - static_configs:          - targets:            - "alertmanager:9093"

Prometheus界面

  • Alerts

展示的便是写在alert-rules.yaml中,采用yaml格式。例如判断服务器是否启动,可以使用查询语句中的up,如下:

- name: instance-down  rules:  - alert: InstanceDown    expr: up{job="kubernetes-nodes"} == 0    for: 1m    labels:      severity: page    annotations:      summary: "Instance {{ $labels.instance }} down"      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute."
  • Status / Targets

可以看到抓取对象的地址(Endpoint),状态(State)为UP,便签(Labels),最近一次抓取时间(Last Scrape)等等

  • Graph

输入查询语句进行查询,该功能非常重要,后续会讲到。

Grafana模块

  • 启动顺序

grafana-import-dashboards-configmap.yaml类型为Job,需在grafana启动后执行,执行前先挂载上configmap

kubectl create -f grafana.yamlkubectl create -f grafana-import-dashboards-configmap.yamlkubectl create -f grafana-import-dashboards.yaml

启动后,数据库自动导入,Dashboard自动建立

  • 登录账户密码

admin/admin

自定义Dashboard

其实从网上下载别人做好的yaml文件,然后kubectl create -f xxx.yaml一下,就全部成功,并且bashboard也能正常显示,这是再好不过的事情了

但是,很多问题让这种情况难以实现。我们不得不掌握一定基础的技术来摆脱对他人的依靠。

Grafana添加数据库

先大致看下官方Using Prometheus in Grafana

url根据具体情况进行改变

grafana支持多种数据库,可从Grafana UI / Plugins / Data source中查看

  • Grafana UI / Data Sources / Add data source


    • Name: prometheus


    • Type: Prometheus


    • Url: http://prometheus:9090

  • Add

Dashboard

dashboard可以通过导入json文件,操作:Grafana UI / Dashboards / Import / Upload .json File。

本文自动导入的json文件便在grafana-import-dashboards-configmap.yaml中。其实有很多做好的dashboard的json文件,可以从官网与社区构建Dashboards上面寻找合适的,可以以数据库类型为分类,然后点击Download JSON来下载。当然这些做好的模板和组件版本相关,不一定适合使用者当前的版本。

在当前Dashboard中进行修改与更新,可以查看当前的配置,操作为菜单栏上的设置栏(齿轮状图标)中的View JSON。也可以保存当前的json文件,操作为菜单栏上的分享栏(分发状图标)中的Export

从json文件中来看,grafana是按照id编号来划分各个种类,因为查看对应的json数据,便可查看id。例如希望整个模板都是5s刷新一次,便可填写以下内容:

..."id": 1,"links": [],"refresh": "5s",...
Templating

先大致看下官方Templating

在菜单栏上的设置栏(齿轮状图标)中选择:Templating / +New

以显示kubernetes的node值为例:

  • Name: node

  • Label: Node

  • Type: Query

  • Data source: prometheus

  • Refresh: On Dashboard Load

  • Query: label_values(kube_node_info{app=”kube-state-metrics”},node)

  • Sort: Alphabetical(asc)

  • Include All option: √

从query语句中能获得master2,master1,master3三个数据,通过sort对其进行排序。而include all option提供一个All值来全选所有数据。

Name中的node很重要,后续查询语句可以通过当前的值为条件再进行查询,例如

# namespace值label_values(namespace)# 通过当前的namespace值,选出namespace中的podlabel_values(kube_pod_info{namespace="$namespace"},pod)# 通过当前选的pod值,选出pod内的containerlabel_values(kube_pod_container_info{pod="$pod"},container)

查询语句

先大致看下官方QUERYING PROMETHEUS

查询语句非常重要,困难之处也在此处。

查询语句变量

NameDescription
label_values(label)Returns a list of label values for the label in every metric.
label_values(metric, label)Returns a list of label values for the label in the specified metric.
metrics(metric)Returns a list of metrics matching the specified metric regex.
query_result(query)Returns a list of Prometheus query result for the query.

例如:

kube_pod_info{...xxx...,kubernetes_name="kube-state-metrics",kubernetes_namespace="kube-system",namespace="chenjian",...xxx...}

    • 其中kube_pod_info便为metric值;


    • 其中的kubernetes_namekubernetes_namespacenamespace等均为kube_pod_infolabel值


    • 某些metric中还包含metric,或者metric中的label值来自其他metric的label值,便可使用metrics(metric)

查询语句可以通过以下方法查询到:

  1. 通过浏览器访问各个抓取器(例如cadvisor,kube-state-metrics等)的地址,以cadvisor为例,地址则为http://ip:4194/metrics

  2. 通过浏览器进入prometheus界面,操作如:Prometheus UI / Graph。例如你需要知晓容器的cpu信息,便可输入container cpu,便可得到很多查询语句。

# 从以上结果中选取一个查询语句,举例说明:container_cpu_usage_seconds_total# 可以获得很多结果,选择namespace为kube-system,则为:container_cpu_usage_seconds_total{namespace="kube-system"}# 可以获得很多结果,选择container_name为prometheus,则为:container_cpu_usage_seconds_total{container_name="prometheus",namespace="kube-system"}# 此时结果定位便比较清晰。

Querying OPERATORS & FUNCTIONS

先大致看下官方OPERATORS, 以及官方FUNCTIONS

使用比较多的是:

  • 使用正则表达式;

# 可查询到namespace以“chenjian-”为开头,后续随意的所有字段container_cpu_usage_seconds_total{namespace=~"^chenjian-.*"}
  • 使用运算符;

# 便可查询到image与pod_name均不为空的结果container_cpu_usage_seconds_total{image!="",pod_name!=""}
  • 一定时间段;

# 便可查询到1分钟内的结果container_cpu_usage_seconds_total{instance="master1",container_name!="POD",pod_name=~"^prometheus.*"}[1m]
  • rate与sum;

# 便可查询到1分钟内每秒的平均值rate(container_cpu_usage_seconds_total{instance="master1",container_name!="POD",pod_name=~"^prometheus.*"}[1m])
        #  便可查询到1分钟内每秒平均值的总和sum(rate(container_cpu_usage_seconds_total{instance="master1",container_name!="POD",pod_name=~"^prometheus.*"}[1m]))
  • 在grafana中结合Templating使用:

# 其中的"$node"便是Templating中的node,当选择“master1”时,查询语句便显示master1的memory数据结果sum(container_memory_working_set_bytes{id="/",instance=~"^$node$"})

参考文献

  1. Prometheus入门教程

  2. Prometheus入门

  3. 使用Prometheus监控kubernetes(k8s)集群

  4. Prometheus报警AlertManager实战

  5. 使用prometheus自定义监控

  6. prometheus官方文档

  7. grafana官方文档

  8. cAdvisor container_network_* metrics are coming with container_name=”POD” instead of container_name=”real name of container”


◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。