Kubernetes集群监控之grafana

[TOC]

参考

安装部署

grafana-deploy.yml

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
k8s-app: grafana
name: prometheus-grafana
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
k8s-app: grafana
template:
metadata:
labels:
k8s-app: grafana
spec:
containers:
- image: grafana/grafana:6.5.2
livenessProbe:
failureThreshold: 10
httpGet:
path: /api/health
port: 3000
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
name: grafana
ports:
- containerPort: 3000
name: grafana
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /api/health
port: 3000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
volumeMounts:
- mountPath: /etc/grafana/grafana.ini
name: config
subPath: grafana.ini
- mountPath: /var/lib/grafana
name: storage
volumes:
- configMap:
defaultMode: 420
name: prometheus-grafana
name: config
- emptyDir: {}
name: storage

grafana-config.yml

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
---
apiVersion: v1
kind: ConfigMap
metadata:
labels:
k8s-app: grafana
name: prometheus-grafana
namespace: monitoring
data:
grafana.ini: |
[server]
root_url = https://test.com
[log]
mode = console
level = info
[paths]
data = /var/lib/grafana/data
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
[smtp]
enabled = true
host = ****
user = ****
password = ****
cert_file =
key_file =
skip_verify = false
from_address = ****
from_name =****
[emails]
welcome_email_on_sign_up = true

grafana-svc.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: grafana
annotations:
prometheus.io/scrape: 'true'
#prometheus.io/tcp-probe: 'true'
#prometheus.io/tcp-probe-port: '80'
name: prometheus-grafana
namespace: monitoring
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 30028
selector:
k8s-app: grafana

配置详解

grafana后端的配置文件可以是多个以.ini结尾的配置文件,主要从三个配置文件读取配置:默认是$WORKING_DIR/conf/defaults.ini,其次用户配置是$WORKING_DIR/conf/custom.ini,用户配置则可以在命令行启动grafana时通过--config参数重新指定配置文件来覆盖。如果你是以deb或者rpm安装的,则默认的配置文件是/etc/grafana/grafana.ini,这个文件是在init.d的启动脚本中通过--config参数指定的。    

所有在配置文件中的配置都可以通过环境变量来覆盖,使用的语法如下:GF_<SectionName>_<KeyName>,例如:
1
2
3
4
5
[security]
admin_user = admin

[auth.google]
client_secret = 0ldS3cretKey

如果使用环境变量,则是如下:

1
2
export GF_SECURITY_ADMIN_USER=true
export GF_AUTH_GOOGLE_CLIENT_SECRET=newS3cretKey

下面具体看看每个配置段的配置:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
app_mode:应用名称,默认是production

[path]
data:一个grafana用来存储sqlite3、临时文件、回话的地址路径
logs:grafana存储logs的路径

[server]
http_addr:监听的ip地址,,默认是0.0.0.0
http_port:监听的端口,默认是3000
protocol:http或者https,,默认是http
domain:这个设置是root_url的一部分,当你通过浏览器访问grafana时的公开的domian名称,默认是localhost
enforce_domain:如果主机的header不匹配domian,则跳转到一个正确的domain上,默认是false
root_url:这是一个web上访问grafana的全路径url,默认是%(protocol)s://%(domain)s:%(http_port)s/
router_logging:是否记录web请求日志,默认是false
cert_file:如果使用https则需要设置
cert_key:如果使用https则需要设置

[database]
grafana默认需要使用数据库存储用户和dashboard信息,默认使用sqlite3来存储,你也可以换成其他数据库
type:可以是mysql、postgres、sqlite3,默认是sqlite3
path:只是sqlite3需要,定义sqlite3的存储路径
host:只是mysql、postgres需要,默认是127.0.0.1:3306
name:grafana的数据库名称,默认是grafana
user:连接数据库的用户
password:数据库用户的密码
ssl_mode:只是postgres使用


[security]
admin_user:grafana默认的admin用户,默认是admin
admin_password:grafana admin的默认密码,默认是admin
login_remember_days:多少天内保持登录状态
secret_key:保持登录状态的签名
disable_gravatar:


[users]
allow_sign_up:是否允许普通用户登录,如果设置为false,则禁止用户登录,默认是true,则admin可以创建用户,并登录grafana
allow_org_create:如果设置为false,则禁止用户创建新组织,默认是true
auto_assign_org:当设置为true的时候,会自动的把新增用户增加到id为1的组织中,当设置为false的时候,新建用户的时候会新增一个组织
auto_assign_org_role:新建用户附加的规则,默认是Viewer,还可以是Admin、Editor


[auth.anonymous]
enabled:设置为true,则开启允许匿名访问,默认是false
org_name:为匿名用户设置组织名称
org_role:为匿名用户设置的访问规则,默认是Viewer


[auth.github]
针对github项目的,很明显,呵呵
enabled = false
allow_sign_up = false
client_id = some_id
client_secret = some_secret
scopes = user:email
auth_url = https://github.com/login/oauth/authorize
token_url = https://github.com/login/oauth/access_token
api_url = https://api.github.com/user
team_ids =
allowed_domains =
allowed_organizations =


[auth.google]
针对google app的,呵呵
enabled = false
allow_sign_up = false
client_id = some_client_id
client_secret = some_client_secret
scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
auth_url = https://accounts.google.com/o/oauth2/auth
token_url = https://accounts.google.com/o/oauth2/token
api_url = https://www.googleapis.com/oauth2/v1/userinfo
allowed_domains =


[auth.basic]
enabled:当设置为true,则http api开启基本认证


[auth.ldap]
enabled:设置为true则开启LDAP认证,默认是false
config_file:如果开启LDAP,指定LDAP的配置文件/etc/grafana/ldap.toml


[auth.proxy]
允许你在一个HTTP反向代理上进行认证设置
enabled:默认是false
header_name:默认是X-WEBAUTH-USER
header_property:默认是个名称username
auto_sign_up:默认是true。开启自动注册,如果用户在grafana DB中不存在

[analytics]
reporting_enabled:如果设置为true,则会发送匿名使用分析到stats.grafana.org,主要用于跟踪允许实例、版本、dashboard、错误统计。默认是true
google_analytics_ua_id:使用GA进行分析,填写你的GA ID即可


[dashboards.json]
如果你有一个系统自动产生json格式的dashboard,则可以开启这个特性试试
enabled:默认是false
path:一个全路径用来包含你的json dashboard,默认是/var/lib/grafana/dashboards


[session]
provider:默认是file,值还可以是memory、mysql、postgres
provider_config:这个值的配置由provider的设置来确定,如果provider是file,则是data/xxxx路径类型,如果provider是mysql,则是user:password@tcp(127.0.0.1:3306)/database_name,如果provider是postgres,则是user=a password=b host=localhost port=5432 dbname=c sslmode=disable
cookie_name:grafana的cookie名称
cookie_secure:如果设置为true,则grafana依赖https,默认是false
session_life_time:session过期时间,默认是86400秒,24小时


以下是官方文档没有,配置文件中有的
[smtp]
enabled = false
host = localhost:25
user =
password =
cert_file =
key_file =
skip_verify = false
from_address = admin@grafana.localhost

[emails]
welcome_email_on_sign_up = false
templates_pattern = emails/*.html


[log]
mode:可以是console、file,默认是console、file,也可以设置多个,用逗号隔开
buffer_len:channel的buffer长度,默认是10000
level:可以是"Trace", "Debug", "Info", "Warn", "Error", "Critical",默认是info

[log.console]
level:设置级别

[log.file]
level:设置级别
log_rotate:是否开启自动轮转
max_lines:单个日志文件的最大行数,默认是1000000
max_lines_shift:单个日志文件的最大大小,默认是28,表示256MB
daily_rotate:每天是否进行日志轮转,默认是true
max_days:日志过期时间,默认是7,7天后删除

Grafana相关使用

将数据源添加到Grafana

  1. 点击顶部标题中的Grafana图标打开侧边菜单
  2. Dashboards链接下的侧边菜单中,你应找到名为Data Sources的链接
  3. 点击顶部标题中的+ Add data source按钮
  4. 从类型下拉列表中选择Prometheus

注意:如果你没有在侧边菜单中看到Data Sources链接,则表示你当前的用户没有当前组织的Admin角色。

数据源选项

名称 描述
Name 数据源名称,这是你在面板和查询中引用数据源的方式
Default 默认数据源意味着它将为新面板预先选择
Url 你的Prometheus服务的http协议,IP和端口(默认端口通常是9090)
Access Server (default) = 需要从Grafana后端/服务器访问的URL,Browser = 需要从浏览器访问的URL
Basic Auth 启用对Prometheus数据源的基本身份验证
User 你的Prometheus用户名
Password 数据库用户的密码
Scrape interval 这将用作Prometheus步骤查询参数的下限,默认值为15秒

查询编辑器

单击标题,以编辑模式打开图形 > 编辑(或在鼠标悬停在面板上时按e键)。

image

名称 描述
Query expression Prometheus查询表达式,请查看Prometheus文档
Legend format 使用名称或模式控制时间系列的名称,例如,将替换为标签hostname的标签值
Min step 设置Prometheus步骤选项的下限,步骤控制Prometheus查询引擎执行范围查询时跳转的大小,遗憾的是,没有官方的prometheus文档链接到这个非常重要的选项
Resolution 控制步骤选项,小步骤可以创建高分辨率图形,但在较大的时间范围内可能会很慢,降低分辨率可以加快速度。1/2将尝试设置步骤选项以为每个其他像素生成1个数据点,值为1/10将尝试设置步长选项,因此每10个像素就有一个数据点。
Metric lookup 在此输入字段来搜索指标名称
Format as 在表格,时间序列或心跳图之间切换,表格格式仅适用于表格面板,心跳图格式适用于在心跳图面板上显示具有直方图类型的指标。在引擎盖下,它将累积的直方图转换为规则序列,并按桶绑定对序列进行排序。

模板

你可以在指标查询中使用变量代替硬编码服务器、应用程序和传感器名称等内容。变量显示为仪表盘顶部的下拉选择框,这些下拉菜单可以轻松更改仪表盘中显示的数据。查看模板文档,了解模板功能和不同类型的模板变量。

查询变量

查询类型的变量允许你查询Prometheus以获取指标、标签或标签值的列表,Prometheus数据源插件提供了以下可在Query输入字段中使用的函数。

名称 描述
label_values(label) 返回每个指标中label的标签值列表
label_values(metric, label) 返回指定指标中label的标签值列表
metrics(metric) 返回与指定的metric正则表达式匹配的指标列表
query_result(query) 返回query的Prometheus查询结果列表

有关指标名称、标签名称和标签值的详细信息,请参阅Prometheus文档

使用区间和范围变量

支持$__range$__range_s$__range_ms,仅适用于Grafana v5.3

可以在查询变量中使用一些全局内置变量;$__interval$__interval_ms$__range$__range_s$__range_ms,有关详细信息,请参阅全局内置变量。当你需要过滤变量查询时,这些可以方便地与query_result函数一起使用,因为label_values函数不支持查询。

确保将变量的refresh触发器设置为On Time Range Change,以便在更改仪表盘上的时间范围时获取正确的实例。

用法示例:

根据仪表盘中显示的时间范围内的平均QPS,使用最繁忙的5个请求实例填充变量:

1
2
Query: query_result(topk(5, sum(rate(http_requests_total[$__range])) by (instance)))
Regex: /"([^"]+)"/

使用更精确的$__range_s,在仪表板中显示的时间范围内具有特定状态的实例填充变量:

1
2
Query: query_result(max_over_time(<metric>[${__range_s}s]) != <state>)
Regex:

在查询中使用变量

有两种语法:

  • $ 例如:rate(http_requests_total{job=~“$job”}[5m])
  • [[varname]] 例如:rate(http_requests_total{job=~”[[job]]“}[5m])

为什么两种方式?第一种语法更易于读写,但不允许你在单词的中间使用变量,启用“多值”或“包括所有值”选项后,Grafana会将标签从纯文本转换为正则表达式兼容的字符串,这意味着你必须使用=〜而不是=

注解

注解允许你在图表上叠加丰富的事件信息,你可以通过仪表盘菜单/注解视图添加注解查询。

Prometheus支持两种查询注解的方法:

  • 常规指标查询
  • 针对挂起和触发警报的Prometheus查询(有关详细信息,请参阅在运行时检查警报

步骤选项可用于限制从查询返回的事件数。

将Grafana指标纳入Prometheus

从4.6.0开始,Grafana在/metrics端点上为Prometheus公开了指标,我们还在Grafana中捆绑了一个仪表盘,以便你可以更快地开始查看指标。你可以通过到数据源编辑页面并点击仪表盘选项卡来导入捆绑的仪表盘,在那里你可以找到一个Grafana仪表盘和一个Prometheus仪表盘,导入并开始查看所有指标!

使用Provisioning配置数据源

现在可以使用Grafana的Provisioning系统使用配置文件配置数据源,你可以在Provisioning文档页面上阅读有关其工作原理以及可以为数据源设置的所有设置的更多信息。

以下是此数据源的一些Provisioning示例:

1
2
3
4
5
6
7
apiVersion: 1

datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
--------------------本文结束,感谢您的阅读--------------------