背景介绍
Prometheus采集Kubernetes 集群中的一些监控数据指标,使用promQL语句查询数据并在Prometheus自带的Dashboard中进行了展示,由于Prometheus图表功能相对较弱,所以本文通过grafana对Prometheus采集到的数据进行展示。
grafana支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源,有丰富的插件支持数据的可视化展示。
docker安装方式
docker run -d --name=grafana -p 3000:3000 -v $GRAFANA_PATH:/var/lib/grafana grafana/grafana
Kubernetes安装方式
grafana 将 dashboard、插件等数据保存在/var/lib/grafana目录下,因此可通过pvc对象做数据持久化,grafana-pv-pvc.yaml文件编写如下:
apiVersion: v1kind: PersistentVolumemetadata:name: grafanaspec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:server: NFS服务IPpath: NFS共享路径---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: grafananamespace: kube-opsspec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
grafana-deployment.yaml文件编辑如下:
apiVersion: apps/v1kind: Deploymentmetadata:name: grafananamespace: kube-opslabels:app: grafanaspec:selector:matchLabels:app: grafanarevisionHistoryLimit: 10template:metadata:labels:app: grafanaspec:containers:- name: grafanaimage: grafana/grafana:5.4.3imagePullPolicy: IfNotPresentports:- containerPort: 3000name: grafanaenv:- name: GF_SECURITY_ADMIN_USERvalue: grafana的账号- name: GF_SECURITY_ADMIN_PASSWORDvalue: grafana的密码readinessProbe:failureThreshold: 10httpGet:path: /api/healthport: 3000scheme: HTTPinitialDelaySeconds: 60periodSeconds: 10successThreshold: 1timeoutSeconds: 30livenessProbe:failureThreshold: 3httpGet:path: /api/healthport: 3000scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 1resources:limits:cpu: 100mmemory: 256Mirequests:cpu: 100mmemory: 256MivolumeMounts:- mountPath: /var/lib/grafananame: storagesecurityContext:fsGroup: 1000runAsUser: 1000volumes:- name: storagepersistentVolumeClaim:claimName: grafana---apiVersion: v1kind: Servicemetadata:name: grafananamespace: kube-opslabels:app: grafanaspec:type: NodePortports:- port: 3000targetPort: grafananodePort: 30333selector:app: grafana
通过探针livenessProbe及readinessProbe来监控检查;
通过resources对cpu、内存资源进行声明;
通过env定义环境变量GF_SECURITY_ADMIN_USER(管理员)和GF_SECURITY_ADMIN_PASSWORD(管理员密码)进行之后web页面的登录;
通过securityContext来指定grafana的userid和groupid;
最后创建service对象,通过NodePort对外暴露 grafana 服务;
直接运行命令kubectl create -f grafana-pv-pvc.yaml创建pvc对象,
通过如下命令验证pv中claim字段绑定了pvc
kubectl get pvkubectl get pvc -n kube-ops
直接运行命令kubectl create -f grafana-deployment.yaml创建pod,
通过命令kubectl get pods -n kube-ops进行验证
通过查看日志:kubectl logs -f grafana-5f7b965b55-wxvvk -n kube-ops
由于yaml中添加securityContext指定了用户名及用户组,执行pod构建之前我们可以先将挂载目录执行chown操作,当然也可以通过一次性job在pod中对/var/lib/grafana的所有者进行修改,具体yaml文件如下:apiVersion: batch/v1kind: Jobmetadata:name: grafana-chownnamespace: kube-opsspec:template:spec:restartPolicy: Nevercontainers:- name: grafana-chowncommand: ["chown", "-R", "1000:1000", "/var/lib/grafana"]image: busyboximagePullPolicy: IfNotPresentvolumeMounts:- name: storagemountPath: /var/lib/grafanasecurityContext:fsGroup: 1000runAsUser: 1000volumes:- name: storagepersistentVolumeClaim:claimName: grafana
利用一个 busybox 镜像将/var/lib/grafana目录更改成了1000这个 user 和 group
通过http://NodeIP:30333访问grafana服务
Grafana Datasource配置点击Add data source进入添加数据源界面。数据源(以前面搭建的prometheus为例)

设置数据源name:prometheus,最主要的是下面HTTP区域是配置数据源的访问模式。
服务器(Server)访问模式(默认):
所有请求都将从浏览器发送到 Grafana 后端的服务器,后者又将请求转发到数据源(可以避免一些跨域问题)其实就是在 Grafana 后端做了一次转发,需要从Grafana 后端服务器访问该 URL。
浏览器(Browser)访问模式:
所有请求都将从浏览器直接发送到数据源(存在跨域问题),需要从浏览器直接访问该 URL。
由于Prometheus 通过NodePort 的方式对外暴露服务,此处可以使用浏览器访问模式直接访问 Prometheus 的外网地址(走外网),也可以通过http://prometheus:9090直接访问(Prometheus 和 Grafana 都处于同一个 namespace下kube-ops,在集群内部可直接通过 DNS 的形式访问,走内网流量),然后其他的配置信息就根据实际情况填写即可,点击最下方的Save & Test提示成功证明我们的数据源配置正确。
Grafana Dashboard
使用Kubernetes cluster monitoring (via Prometheus)(dashboard id 为162)来展示 Kubernetes 集群的监控信息,在左侧侧边栏 Create 中点击import导入对应的json文件即可

Grafana中Kubernetes集群监控插件:grafana-kubernetes-app
kubectl exec -it grafana-79477fbb7c-v4prs /bin/bash -n kube-ops
执行grafana-cli plugins install grafana-kubernetes-app,会展示下载URL,由于容器内部网络不通Internet无法下载插件到目标目录,所以在外面手动下载插件并解压至/var/lib/grafana挂载的本地目录的plugins目录下,确保目录所有者与前面一致,重启grafana pod,切换到grafana的plugins页面出现Kubernetes的插件,点击进来启动即可,然后点击Next up旁边的链接配置集群

填写k8s集群访问地址:https://kubernetes.default,
指定集群访问的证书,勾选上TLS Client Auth和With CA Cert两项,截图如下,集群认证配置文件~/.kube/config中属性certificate-authority-data、client-certificate-data、client-key-data分别对应CA 证书、Client 证书、Client 私钥(内容是base64编码)
通过echo "XXXX" | base64 -d 进行解码

配置完成后,确保k8s集群中已经安装了kube-state-metrics、node-exporter、prometheus这三个工具后,直接点击Deploy,然后点击Save,就可以获取到集群的监控资源信息。

apiVersion: apps/v1kind: DaemonSetmetadata:name: kube-state-metricsnamespace: kube-opslabels:k8s-app: kube-state-metricsspec:selector:matchLabels:name: kube-state-metricstemplate:metadata:name: kube-state-metricslabels:name: kube-state-metricsspec:containers:- name: kube-state-metricsimage: bitnami/kube-state-metrics:1.9.6imagePullPolicy: IfNotPresentports:- containerPort: 8080name: http-metricshostPort: 8080readinessProbe:httpGet:port: 8080path: /healthzinitialDelaySeconds: 10timeoutSeconds: 10resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MirestartPolicy: AlwayshostNetwork: truehostPID: true
apiVersion: apps/v1kind: DaemonSetmetadata:name: node-exporternamespace: kube-opslabels:k8s-app: node-exporterspec:selector:matchLabels:name: node-exportertemplate:metadata:name: node-exporterlabels:name: node-exporterspec:volumes:- name: prochostPath:path: /proc- name: syshostPath:path: /syscontainers:- name: node-exporterimage: quay.io/prometheus/node-exporter:v0.15.0imagePullPolicy: IfNotPresentargs:- --path.procfs=/proc_host- --path.sysfs=/host_sysports:- containerPort: 9100name: node-exporterhostPort: 9100resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- mountPath: /host_sysname: sysreadOnly: true- mountPath: /proc_hostname: procreadOnly: truerestartPolicy: AlwayshostNetwork: truehostPID: true




