容器监控实践Grafana

36次阅读

共计 7387 个字符,预计需要花费 19 分钟才能阅读完成。

概述

Grafana 是一个开源的,可以用于大规模指标数据的可视化项目,甚至还能对指标进行报警。基于友好的 Apache License 2.0 开源协议,目前是 prometheus 监控展示的首选。优点如下:

1. 使用:
  • 配置方便:支持 Dashboard、Panel、Row 等组合,且支持折线图、柱状图等多种图例
  • 图表漂亮:可以选择暗黑系或纯白系,你也可以自己定义颜色
  • 模板很多:grafana 模板很活跃,有很多用户贡献的面板,直接导入就能用
  • 支持多种数据源:grafana 作为展示面板,支持很多数据源,如 Graphite、ES、Prometheus 等
  • 权限管理简单:有 admin、viewer 等多种角色管控
2. 二次开发:

如果默认的 grafana 不能满足你的需求,要二次开发,官方也提供了很多支持:

  • 协议为 Apache License 2.0:商业友好,随便改吧,改完拿去卖也行。
  • 完善的 API 调用:权限、面板、用户、报警都支持 api 调用。
  • 多种鉴权方式:OAuth、LADP、Proxy 多种方式,你可以接入自己公司的鉴权系统
  • 插件开发:如果你不想直接改代码,可以做自己的插件
  • go+Angular+react:常用的技术栈,方便二次开发

prometheus + grafana 做为监控组合很方便,很强大,改造了鉴权之后更加香。一开始我们还尝试使用 grafana 自带的报警功能,可惜比较鸡肋,无法用于生产,报警的 issue 一大堆官方也不想修改,作罢

部署

步骤一:安装 grafana

Grafana 提供了很多种部署方式,如果你的展示报警是在 K8S 集群外,可以二进制直接部署,如果 grafana 本身在集群内,或者管理端也是 k8s 集群,可以用 yaml 部署:

Deployment 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-system
  name: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      namespace: kube-system
      annotations:
        grafana-version: '1.0'
      name: grafana
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:5.1.0
        imagePullPolicy: Always
        securityContext:
          runAsUser: 0
        env: 
        - name: GF_SECURITY_ADMIN_PASSWORD
          value: "admin"
        ports:
        - name: grafana
          containerPort: 3000
        resources:
          requests:
            memory: "100Mi"
            cpu: "100m"
          limits:
            memory: "2048Mi"
            cpu: "1024m"

Service 配置:

apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: grafana
  annotations:
    prometheus.io/scrape: 'true'
  labels:
    name: grafana
spec:
  selector:
    app: grafana
  type: LoadBalancer
  ports:
  - name: grafana
    protocol: TCP
    port: 3000

grafana 配置文件的字段含义:

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 天后删除

注意的几个点:

  1. 对所有的资源都做 request、limit 限制,防止耗尽主机资源
  2. grafana 的一些配置可以通过变量传入:如 admin 的密码 GF_SECURITY_ADMIN_PASSWORD
  3. 如果要对 grafana 的数据进行持久化,建议挂 volume 或者外部存储,持久化的内容一般都是面板配置。监控面板的配置可以导入导出
  4. securityContext:因为版本问题,如果提示 grafana 的权限不足,可以配置 runAsUser: 0

创建了 grafana 之后,可以通过 service 暴露的端口地址查看页面:

登录成功后,会显示需要初始化的内容

步骤二:配置数据源

grafana 支持多种数据源,可以在“type”的下拉框选项中看到,这里我们选择 prometheus 作为数据源。HTTP 的访问方式选择 proxy,URL 填写 grafana 能访问到的地址。

因为 grafana 和 prometheus 都在同一个 k8s 集群中,这里用 svc 地址

点击“save and test”测试连接性。

步骤三:创建面板

有了数据源,接下来就是如何更好地展示数据,grafana 支持多种类型的图表,如 Graph、singlestat、Table 等。可以组合出多种形式。这里先创建一个 Demo,保存现有模板的快捷键是 Ctrl + S

你的所有面板都可以在左上角的下拉框中找到:

我们还可以导入现有的面板(Dashboard),大家贡献的模板地址:https://grafana.com/dashboards

选择左上角的➕号,然后 import,有两种形式的导入:

  • URL 直接导入:粘贴对应模板的 url,前提是 grafana 必须能访问外网。
  • 上传 json 文件:一般是迁移时使用,把现有的 json 导出,再导入

grafana 的面板、图表有很多配置,接下来我们说几个常用的配置项

常用配置

示例:K8S 的节点数量趋势图

编辑图表时默认进入的是 Metric,内容包括:

  1. Data Source:填写刚刚配置过的数据源的名称,这里是 prometheus
  2. A 和 B 指的是这张图有几条线,这里是 A 一条线、右侧的小眼睛代表是否隐藏该线
  3. A 线中,输入框填写的是查询语句,这里指合法的 promsql,legend format 指 A 线的显示名称

除了 Metric 之外,还有几个选项,含义分别是:

  • General:一般是将其他项都配置好后再回头设置 General,而在 General 配置标签中一般只会用到“Title”,就是图表的标题,如这里的 Node 数量
Title:图表标题;Description:图表描述;Span:图表间隔,无需设定,在前端可手动调整图表大小;Height:图表高度,无需设定,在前端可手动调整图表高度;Transparent:背景是否透明,默认情况下不勾选,如果觉得不需要深灰色背景,可以勾选此项;Templating 和 Drilldown / detail link 用处不大,忽略即可。
  • Metric:比较重要,配指标表达式和指标线的地方,上边已经举例
  • Axes:配置数据轴的地方,如偏移缩放,格式转换
  • Legend:图例,是否限制以及显示的方式
  • Display: 展示相关的配置,如线条宽度,排序方式、空值处理
  • Alert: 报警配置,grafana 算是少有的展示图表支持报警的,但他的报警只支持到单图表,无法嵌套模板,有点鸡肋。如左上角有筛选 node 的下拉框,图表又传入了变量时,如果配置报警,是配置失败的。报错为:“Template variables are not supported in alert queries”
  • TimeRange: 配置单图表的展示时间,如 24h 内的数据
Override relative time:  覆盖右上角选择的时间,设置要显示的时间范围,这里我设置 24h(单位自己可选)。Add time shift:  这里是偏移量设置,比如填写 2h 表示不显示最近 2h 的数据。Hide time ocerride info:  上边相对时间设置之后在 graph 中会显示本图表的时间信息,在此处选择后可以把显示的信息隐藏掉

更多详细的配置可以查看:https://grafana.com/docs/features/panels/graph/

变量配置:

对于一些复杂场景,可能需要传入变量,如有多台机器,每台机器都要展示其 cpu 内存等指标。而机器列表又是动态的,这个时候就可以使用变量,示例:

首先在该面板的 setting 中选择 variables,注意是该面板的设置,不是全局设置

填写名称,下拉框选项的数据获取表达式,刷新周期,是否有 ALL 选项等,然后保存

接下来在具体的图表中使用该变量

在 metric 中,将变量 $Node 写在表达式中做匹配即可。

grafana 的变量支持高级匹配,如 $Node.* 代表以 Node 开头的字符,利用变量的方式,可以实现多级筛选,满足更复杂的需求,如 pod 资源的查看

关于变量的更多信息:what-is-a-variable

报警配置

grafana 在 v4.0 版本开始引入了报警功能。

还是以 Node 节点数为例,我们配置一条规则:

 当可用节点数小于 3 时,报警给 demo@126.com

alert 支持 avg、sum 等表达式,不过持续时间依赖数据本身的采集频率。需要多测试一下。

Notifications:配置报警的收件组和详细内容。而报警收件人的配置在专门的 Alerting 页面上

Alert Rules:已经配置的报警规则,并展示其触发状态。

报警邮件的样式:

模板变量报警

以上的报警配置方式只适合没有变量传入的图表,如果遇到上边提到的选择 node,传入变量的图表,就没办法支持了。

相关 issue:https://github.com/grafana/gr…

官方对这个功能解释了一堆,最新版本仍然没有支持。借用 issue 的一句话哈哈哈

It would be grate to add templates support in alerts. Otherwise the feature looks useless a bit.

本文为容器监控实践系列文章,完整内容见:container-monitor-book

正文完
 0