[TOC]
0x00 前言简述 1) Grafana 介绍 描述: Grafana是一个用Javascript写的开源的(Dashboard)可视化面板,能齐全的度量仪表盘和图形编辑器和漂亮的布局展示,并且支持Graphite、elasticsearch、zabbix等的数据可视化的实现,可以给你的数据换个皮肤,使你的数据展示更加直观和漂亮。
2) Grafana 专有术语介绍
仪表盘面板: Grafana 数据展示的界面,里面的面板是包含图形、表格或其它可视信息的矩形区域。
数据源: Grafana 从数据源中获取用来绘图的信息,它目前支持主流开箱即用的数据源,例如OpenTSDB、PostgreSQL
,我们的Prometheus就是采用TSDB时序数据库。
3) Grafana 学习参考 Grafana官网链接,内含各种官方文档(包括仪表盘设置等):http://docs.grafana.org/installation/rpm/
项目地址: https://github.com/grafana/grafana/ 官方地址: https://grafana.com
0x01 安装部署 1.CentOS7安装Grafana 安装环境: CentOS Linux release 7.6.1810 (Core) 3.10.0-957.10.1.el7.x86_64
安装实践
[TOC]
0x00 前言简述 1) Grafana 介绍 描述: Grafana是一个用Javascript写的开源的(Dashboard)可视化面板,能齐全的度量仪表盘和图形编辑器和漂亮的布局展示,并且支持Graphite、elasticsearch、zabbix等的数据可视化的实现,可以给你的数据换个皮肤,使你的数据展示更加直观和漂亮。
2) Grafana 专有术语介绍
仪表盘面板: Grafana 数据展示的界面,里面的面板是包含图形、表格或其它可视信息的矩形区域。
数据源: Grafana 从数据源中获取用来绘图的信息,它目前支持主流开箱即用的数据源,例如OpenTSDB、PostgreSQL
,我们的Prometheus就是采用TSDB时序数据库。
3) Grafana 学习参考 Grafana官网链接,内含各种官方文档(包括仪表盘设置等):http://docs.grafana.org/installation/rpm/
项目地址: https://github.com/grafana/grafana/ 官方地址: https://grafana.com
0x01 安装部署 1.CentOS7安装Grafana 安装环境: CentOS Linux release 7.6.1810 (Core) 3.10.0-957.10.1.el7.x86_64
安装实践
3.二进制方式安装Grafana,安装完成后访问主机的3000端口即可,
1 2 3 4 5 6 7 8 9 10 11 12 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.3.2.linux-x64.tar.gz tar -zxvf grafana-4.3.2.linux-x64.tar.gz mv grafana-4.3.2 grafana cd grafana/bin/./grafana-cli plugins list-remote ./grafana-cli plugins install alexanderzobnin-zabbix-app ./grafana-cli plugins install grafana-piechart-panel ./grafana-server -homepath /opt/grafana/grafana &
温馨提示: 第一次登陆默认密码为admin/admin
weiyigeek.top-grafana登陆
资源清单方式: 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 mkdir /app/grafana && chown -R 472:0 /app/grafana tee grafana.yaml <<'EOF' apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana namespace: default spec: selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: fsGroup: 472 supplementalGroups: 0 containers: - name: grafana image: grafana/grafana:8.5.4 imagePullPolicy: IfNotPresent ports: - containerPort: 3000 name: http-grafana protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /robots.txt port: 3000 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 2 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 3000 timeoutSeconds: 1 resources: requests: cpu: 250m memory: 750Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv volumes: - name: grafana-pv hostPath: path: /app/grafana type : DirectoryOrCreate --- apiVersion: v1 kind: Service metadata: name: grafana namespace: default spec: ports: - port: 3000 protocol: TCP targetPort: http-grafana nodePort: 30002 selector: app: grafana sessionAffinity: None type : NodePort EOF kubectl apply -f grafana.yaml kubectl get pod
2.Ubuntu 20.04安装Grafana
1) 资源清单部署方式
步骤 01.资源清单(granana.ini)与 (Deployment)部署资源清单。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 tee grafana.ini <<'EOF' [server] domain = devops.weiyigeek.top root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/ serve_from_sub_path = true EOF tee grafana-deploy.yaml <<'EOF' --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc namespace: dashboard spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana namespace: dashboard spec: selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: fsGroup: 472 supplementalGroups: - 0 containers: - name: grafana image: grafana/grafana:9.0.2 imagePullPolicy: IfNotPresent ports: - containerPort: 3000 name: http-grafana protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /robots.txt port: 3000 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 2 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 3000 timeoutSeconds: 1 resources: requests: cpu: 512m memory: 1024Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv - mountPath: /etc/grafana/grafana.ini name: ge-config subPath: grafana.ini volumes: - name: grafana-pv persistentVolumeClaim: claimName: grafana-pvc - name: ge-config configMap: name: ge-config items: - key: grafana.ini path: grafana.ini --- apiVersion: v1 kind: Service metadata: name: grafana namespace: dashboard spec: ports: - port: 3000 protocol: TCP targetPort: http-grafana selector: app: grafana sessionAffinity: None type : LoadBalancer EOF
步骤 02.创建 grafana.ini 的 configmap 以及部署 grafana 到集群中1 2 kubectl create configmap ge-config --from-file=grafana.ini --namespace dashboard kubectl create -f grafana-deploy.yaml --namespace dashboard
步骤 03.部署情况与日志情况查看。1 2 3 kubectl logs -f --tail 50 -n dashboard -l app=grafana
步骤 04.配置 grafana ingress 的资源清单我们便可通过域名+grafana目录
的方式进行访问。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 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: ingressclass.kubernetes.io/is-default-class: "true" nginx.ingress.kubernetes.io/client-body-buffer-size: 50m nginx.ingress.kubernetes.io/proxy-body-size: 50m nginx.ingress.kubernetes.io/proxy-buffer-size: 50m nginx.ingress.kubernetes.io/proxy-buffering: "on" nginx.ingress.kubernetes.io/proxy-buffers-number: "4" nginx.ingress.kubernetes.io/proxy-connect-timeout: 60s nginx.ingress.kubernetes.io/proxy-read-timeout: 120s nginx.ingress.kubernetes.io/proxy-send-timeout: 120s nginx.ingress.kubernetes.io/rewrite-target: /$2 labels: app: devops ref: devops url: devops.weiyigeek.top name: devops-weiyigeek namespace: dashboard spec: ingressClassName: nginx rules: - host: devops.weiyigeek.top http: paths: - backend: service: name: grafana port: number: 3000 path: /grafana(/|$)(.*) pathType: ImplementationSpecific tls: - hosts: - devops.weiyigeek.top secretName: weiyigeek.top
温馨提示: 在进行前面操作完毕后我们便可通过https://devops.weiyigeek.top/grafana/login
域名地址进行访问,默认密码 admin。
helm3 方式安装 1 2 3 4 5 6 7 8 9 helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm search repo grafana helm show values grafana/grafana --version 6.29.5 > granfa-values.yaml helm install grafana grafana/grafana --version 6.29.5 --set nodeSelector="kubernetes\.io/hostname=node-223" ,service.type=NodePort,persistence.enabled=True,persistence.storageClassName="managed-nfs-storage" ,persistence.size=5Gi,persistence.accessModes=ReadWriteOnce -n devops --debug helm upgrade grafana grafana/grafana --version 6.29.5 --set nodeSelector="kubernetes\.io/hostname=node-223" ,service.type=NodePort,persistence.enabled=True,persistence.storageClassName="managed-nfs-storage" ,persistence.size=5Gi,persistence.accessModes=ReadWriteOnce -n devops --debug helm list -n devops
执行结果:1 2 3 4 5 6 7 8 9 10 NOTES: 1. Get your 'admin' user password by running: kubectl get secret --namespace devops grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster: grafana.devops.svc.cluster.local Get the Grafana URL to visit by running these commands in the same shell: export POD_NAME=$(kubectl get pods --namespace devops -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}" ) kubectl --namespace devops port-forward $POD_NAME --address 0.0.0.0 30002:3000 3. Login with the password from step 1 and the username: admin
0x02 Granafa 入门使用 1) 基础配置 1.1 添加数据源 描述: 例如此次添加一个Prometheus数据源到Grafana,注意最后一定要点击Save&Test
来保证Grafana可以正常访问我们的Prometheus。
操作步骤: 侧边栏 -> Congiguration -> Data Sources
weiyigeek.top-添加数据源
weiyigeek.top-Prometheus监控数据源
2) 仪表盘模板与面板 2.1 模板变量 描述: 我们可以使用模板变量来切换到详细监控主机的相关信息,这个功能非常Nice也非常实用。
Step 1.创建一个新的仪表盘,点击 + > Create Dashboard -> Add an empty Panel -> 测试出现一个初始面板界面 -> 点击Setting(右上角的齿轮) 。
Step 2.进入后点击 Varibales -> 点击+add variable进行添加一个模板变量 -> 设置变量名称OSRELEASE -> Prometheus PromQL 为node_uname_info
-> 正则表达式来获取标签中的内核版本 -> .*release="(.*?)".*
-> 点击update,我们可以仿照添加一个节点名称的变量以及网卡名称node_network_receive_bytes_total
-> .*device="(docker.*?|eno.*?|ens.*?)".*
。
Step 3.回到Panel首页可以看到OSRELEASE 与 NODENAME 模板变量的下拉列表->最后点击 Save Dashboard (保存面板)。
weiyigeek.top-模板变量
Step 4.使用模板变量,需要新建一个面板->输入rate(node_network_receive_bytes_total{device="$Device"}[5m])
-> Legend 设置为
Title 设置 Bytes/Received ,其中数据速率下的Unit 设置为bytes/sec,最后点击保存。
weiyigeek.top-使用模板变量
2.1 图形Panel 描述: 如其名称其主要用于显示图表。
weiyigeek.top-简单图表
3.1 单一统计Panel 描述: 显示单个时间序列的值。
Step 1.点击图表添加图表 -> 添加单一统计Panel
3) 基础控件 3.1 时间控件 描述: 它可以选择时间范围和刷新频率,它适用于整个仪表盘但你也可以在每个Panel上覆盖配置。
Tips: 当图表刷新时即使基础数据没有改变,但你也会注意到形状可能发生变化,这个情况被称为混叠的信号处理效果。
0x03 进阶扩展配置 0.Email 告警配置 描述: 在 Grafana 中提供了多种告警方式,其中最常用的就是邮箱告警, 下面我们来简单实践在Grafana中实现邮件告警。
步骤 01.在 grafana 的主配置文件 grafana.ini 中开启 smtp 并配置相关参数(此处我采用了企业邮箱):1 2 3 4 5 6 7 8 9 10 $ cat grafana.ini .... [smtp] enabled = true host = smtp.exmail.qq.com:465 user = monitor@weiyigeek.top password = weiyigeek.top from_address = monitor@weiyigeek.top from_name = Grafana ehlo_identity = devops.weiyigeek.top
步骤 02.修改 grafana.ini 后便可重启 grafana 登陆其Dashboard ,点左菜单栏中🔔 (Alerting) -> Contact points (联络人) -> 编辑 grafana-default-email
告警对象 -> 选择触发对象为email
-> 输入测试邮箱 -> 测试发信
weiyigeek.top-测试Email发信
步骤 03.发信后你将会在其输入指定邮箱中,看到 Grafana 发送到你邮箱的告警信息。
weiyigeek.top-Email告警配置验证
1.LDAP 认证配置 在 grafana 的主配置文件 grafana.ini 中开启 LDAP 认证:
1 2 3 [auth.ldap] enabled = true config_file = /etc/grafana/ldap.toml
config_file
指定grafana的ldap配置文件ldap.toml的具体位置 ldap.toml 配置文件的内容如下
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 [[servers]] host = "127.0.0.1" port = 389 use_ssl = false start_tls = false ssl_skip_verify = false bind_dn = "cn=Manager,dc=frognew,dc=com" bind_password = 'thepassword' search_filter = "(cn=%s)" search_base_dns = ["ou=People,dc=frognew,dc=com" ]group_search_base_dns = ["ou=Group,dc=frognew,dc=com" ]group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))" [servers.attributes] name = "givenName" surname = "sn" username = "cn" member_of = "cn" email = "email" [[servers.group_mappings]] group_dn = "grafana-admin" org_role = "Admin" [[servers.group_mappings]] group_dn = "grafana-editor" org_role = "Editor" [[servers.group_mappings]] group_dn = "grafana-viewer" org_role = "Viewer"
host
和port
指定LDAP Server的地址和端口
因为我们使用的OpenLDAP,是没有memberOf属性的POSIX schema,所以获取用户的Group信息时需要另外一个查询,通过group_search_base_dns
和group_search_filter
,同事需要设置member_of = "cn"
servers.group_mappings中指定LDAP中Group和Grafan中org_role
的对应关系,注意这里需要和配置成LDAP中Group的cn,这里配置的是grafana-admin
、grafana-editor
、grafana-viewer
,这点和官方文档Grafana LDAP Authentication 中给的例子是不一样的。
0x04 grafana-cli 命令 常用命令: 1 2 3 grafana-cli plugins list-remote grafana-cli plugins install grafana-piechart-panel alexanderzobnin-zabbix-app
0x0n 入坑&出坑 问题1: 采用 Docker 安装 Grafana 时报 mkdir: can’t create directory ‘/var/lib/grafana/plugins’: I/O error 错误
错误信息:1 2 3 4 5 docker logs --tail grafana
问题原因: 从以前的Docker容器版本迁移问题针对/var/lib/grafana
目录权限有所变化,所以在我们持久化该目录时应设置对应的uid、gid。
解决办法: https://grafana.com/docs/grafana/latest/installation/docker/#migrate-to-v51-or-later 1 2 3 4 5 Version User User ID Group Group ID < 5.1 grafana 104 grafana 107 >= 5.1 grafana 472 grafana 472 >= 7.3 grafana 472 root 0
解决流程1 2 3 4 chown -R 472:0 /data/grafana docker run --user 472 --volume "/data/grafana:/var/lib/grafana" grafana/grafana
问题2.使用Kubernetes集群搭建Grafana其POD会不停的重启错误.
错误信息:1 2 3 4 5 6 7 8 9 10 11 12 $ kubectl get pod -n devops NAME READY STATUS RESTARTS AGE grafana-6fb4d77ddc-s7xl5 0/1 Running 4 (18s ago) 11m $ kubectl logs -f --tail 50 -n devops grafana-6fb4d77ddc-s7xl5 logger=migrator t=2022-06-01T03:11:30.93+0000 lvl=info msg="Starting DB migrations" logger=migrator t=2022-06-01T03:11:35.85+0000 lvl=info msg="Executing migration" id="delete stars for deleted dashboards" logger=migrator t=2022-06-01T03:11:42+0000 lvl=info msg="Executing migration" id="Add index for dashboard_is_folder" logger=migrator t=2022-06-01T03:11:46.9+0000 lvl=info msg="Executing migration" id="create data_source table" logger=migrator t=2022-06-01T03:11:52.87+0000 lvl=info msg="Executing migration" id="add index data_source.account_id" logger=migrator t=2022-06-01T03:11:58.46+0000 lvl=info msg="Executing migration" id="add unique index data_source.account_id_name"
问题可能原因:
1.提高限制内存减少触发OOM, 即 resource 字段设置resources: {}
。 2.持久化数据persistence卷性能问题导致写过慢。
问题3.使用Docker搭建Grafana其POD会不停的重启错误.
问题错误: 在 docker 运行 grafana:7.0.3 版本时,grafana不断重启日志如下1 2 3 4 5 6 $ docker run -d -p 3000:3000 -e TZ="Asia/Shanghai" --link=prometheus -v /data/grafana:/var/lib/grafana -v /data/grafana.ini:/etc/grafana/grafana.ini --name=grafana grafana/grafana:7.0.3 $ docker logs -f --tail 50 grafana t=2020-06-04T11:26:22+0800 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket= t=2020-06-04T11:27:02+0800 lvl=info msg="Shutdown started" logger=server reason="System signal: terminated" t=2020-06-04T11:27:02+0800 lvl=info msg="Stopped Stream Manager"
解决办法: 尝试docker修改各种命令启动后发现,当命令中 –name=grafana 时才会出现此问题,修改成其他name即可正常启动