集群版本信息说明
组件名称 | 版本号 |
---|---|
kubernetes | 1.8.1 |
golang | 1.8.3 |
docker | 17.06.2-ce |
prometheus | v2.0.0 |
grafana | 4.2.0 |
kube-state-metrics | v1.2.0 |
altermanager | v0.12.0 |
更改版本后,后续配置信息可能发生改变,需对照文档进行修改与更新
镜像信息说明
镜像名称 | tag号 |
---|---|
prom/prometheus | v2.0.0 |
prom/node-exporter | v0.15.2 |
dockermuenster/caddy | 0.9.3 |
giantswarm/tiny-tools | latest |
gcr.io/google_containers/kube-state-metrics | v1.2.0 |
grafana/grafana | 4.6.3 |
quay.io/prometheus/alertmanager | v0.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结尾):
- scrage_configs为抓取对象,以
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.yaml
kubectl create -f grafana-import-dashboards-configmap.yaml
kubectl create -f grafana-import-dashboards.yaml
启动后,数据库自动导入,Dashboard自动建立
- 登录账户密码
admin/admin
自定义Dashboard
其实从网上下载别人做好的yaml
文件,然后kubectl create -f xxx.yaml
一下,就全部成功,并且bashboard也能正常显示,这是再好不过的事情了。
但是,很多问题让这种情况难以实现。我们不得不掌握一定基础的技术来摆脱对他人的依靠。
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中的pod
label_values(kube_pod_info{namespace="$namespace"},pod)
# 通过当前选的pod值,选出pod内的container
label_values(kube_pod_container_info{pod="$pod"},container)
查询语句
查询语句非常重要,困难之处也在此处。
查询语句变量
Name | Description |
---|---|
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_name
,kubernetes_namespace
,namespace
等均为kube_pod_info
中label值;
- 其中的
-
- 某些metric中还包含metric,或者metric中的label值来自其他metric的label值,便可使用metrics(metric)
查询语句
可以通过以下方法查询到:
-
通过浏览器访问各个抓取器(例如cadvisor,kube-state-metrics等)的地址,以cadvisor为例,地址则为
http://ip:4194/metrics
; -
通过浏览器进入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$"})
参考博文
- Prometheus入门教程
- Prometheus入门
- 使用Prometheus监控kubernetes(k8s)集群
- Prometheus报警AlertManager实战
- 使用prometheus自定义监控
- prometheus官方文档
- grafana官方文档
- cAdvisor container_network_* metrics are coming with container_name=”POD” instead of container_name=”real name of container”
本作品由陈健采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。