0%

Grafana安装及持久化

这篇文章主要讲解在kubernetes集群中如何安装Grafana和持久化Grafana数据。

使用的镜像是image: grafana/grafana:6.3.3

安装Grafana使用的yaml文件是安装kube-prometheus里面的。安装 kube-prometheus,请参考 Kubernetes监控方案kube-prometheus(prometheus, node-exporter, grafana)

不过需要对grafana/grafana-deployment.yaml做一些自定义化的修改。

设置管理员

containers下级添加GF_SECURITY_ADMIN_USERGF_SECURITY_ADMIN_PASSWORD,用来配置 grafana 的管理员用户和密码

1
2
3
4
5
6
7
8
9
spec:
containers:
- image: grafana/grafana:6.3.3
...
env:
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: "123456"

如果要设置Grafana的匿名登录,请参考Grafana匿名登录Kubernetes设置

1
2
3
4
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Viewer

数据持久化

原始的数据是以emptyDir形式存放在pod里面,生命周期与pod相同,出现问题时,容器重启,在Grafana里面设置的数据就全部消失了。

1
2
3
4
5
6
7
8
  volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
readOnly: false
...
volumes:
- emptyDir: {}
name: grafana-storage

可以看出Grafana将dashboard、插件这些数据保存在/var/lib/grafana这个目录下面。做持久化的话,就需要对这个目录进行volume挂载声明。

把emptyDir修改为pvc方式。

1
2
3
4
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana

如果要使用一个 pvc 对象来持久化数据,我们就需要添加一个可用的 pv 供 pvc 绑定使用,grafana-volume.yaml内容如下:

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
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.16.64.233
path: /data/nfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

暴露Service的方法,在安装 kube-prometheus 的时候已经讲过了。Kubernetes监控方案kube-prometheus(prometheus, node-exporter, grafana)

1
2
3
4
5
# kubectl apply -f grafana-volume.yaml
persistentvolume/grafana created
persistentvolumeclaim/grafana created
# kubectl apply -f grafana-deployment.yaml
deployment.apps/grafana configured

查看 pod 状态:

1
2
3
4
# kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
...
grafana-6668cd66cb-ff8kg 0/1 ContainerCreating 0 2m32s

进一步查看描述信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# kubectl describe po grafana-6668cd66cb-ff8kg -n monitoring
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m57s default-scheduler Successfully assigned monitoring/grafana-6668cd66cb-ff8kg to k8s-node2
Warning FailedMount 3m54s kubelet, k8s-node2 MountVolume.SetUp failed for volume "grafana" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/fc4d98ef-0b80-4570-a487-4ded9133eb58/volumes/kubernetes.io~nfs/grafana --scope -- mount -t nfs 172.16.64.233:/data/nfs /var/lib/kubelet/pods/fc4d98ef-0b80-4570-a487-4ded9133eb58/volumes/kubernetes.io~nfs/grafana
Output: Running scope as unit run-54024.scope.
mount: wrong fs type, bad option, bad superblock on 172.16.64.233:/data/nfs,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)

In some cases useful info is found in syslog - try
dmesg | tail or so.
Warning FailedMount 3m53s kubelet, k8s-node2 MountVolume.SetUp failed for volume "grafana" : mount failed: exit status 32

说明是 mount 失败了。原因是我们需要在每个节点,都要安装 NFS 客户端。在生产环境下,如何批量操作 terminal 终端?请参考:批量操作Shell终端

在每个node下面都安装好NFS客户端以后,删除掉出错的 pod。

查看 pod:

1
2
3
kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
grafana-6668cd66cb-jrnjv 0/1 CrashLoopBackOff 4 2m53s

没有正常启动,我们再看一下这个 Pod 的日志:

1
2
3
4
# kubectl logs grafana-6668cd66cb-jrnjv -n monitoring
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied

这个错误是 Grafana 5.1版本以后才会出现的。错误的原因很明显,就是 /var/lib/grafana 目录的权限不够。

在 `` 中有这样一个属性:

1
2
3
securityContext:
runAsNonRoot: true
runAsUser: 65534

我们查看一下65534是哪个用户:

1
2
# cat /etc/passwd | grep 65534
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

所以,你只需要把 /data/nfs 目录的用户改为 nfsnobody 就可以了。当然把属性改为 777 也没问题。

1
chown nfsnobody /data/nfs

把刚才出错的那个 Pod 删除,新的 Grafana Pod 就成功启动了。

然后可以添加 Dashboard 了,哪怕 Pod 重建也不会丢失数据了。