安裝Grafana
Grafana介紹
grafana 是一個可視化面包,有着非常漂亮的圖片和布局展示,功能齊全的度量儀表盤和圖形化編輯器,支持Graphite、Zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticasearch等作為數據源,比Prometheus自帶的圖標展示功能強大很多,更加靈活,有豐富的插件
我們這里使用deployment持久化安裝grafana
cat >>grafana_deployment.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: grafana
namespace: kube-system
labels:
app: grafana
spec:
revisionHistoryLimit: 10
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:5.3.4
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: grafana
env:
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: abcdocker
readinessProbe:
failureThreshold: 10
httpGet:
path: /api/health
port: 3000
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
livenessProbe:
failureThreshold: 3
httpGet:
path: /api/health
port: 3000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 300m
memory: 1024Mi
requests:
cpu: 300m
memory: 1024Mi
volumeMounts:
- mountPath: /var/lib/grafana
subPath: grafana
name: storage
securityContext:
fsGroup: 472
runAsUser: 472
volumes:
- name: storage
persistentVolumeClaim:
claimName: grafana
EOF
這里使用了grafana 5.3.4的鏡像,添加了監控檢查、資源聲明,比較重要的變量是GF_SECURITY_ADMIN_USER和GF_SECURITY_ADMIN_PASSWORD為grafana的賬號和密碼。
由於grafana將dashboard、插件這些數據保留在/var/lib/grafana目錄下,所以我們這里需要做持久化,同時要針對這個目錄做掛載聲明,由於5.3.4版本用戶的userid和groupid都有所變化,所以這里添加了一個securityContext設置用戶ID
image_1ddnv749l17k7ucdel1m4v17jjea.png-56.5kB
現在我們添加一個pv和pvc用於綁定grafana
cat >>grafana_volume.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.2.7
path: /data/k8s
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: kube-system
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
這里配置依舊使用NFS進行掛載使用
現在我們還需要創建一個service,使用NodePort
cat >>grafana_svc.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: kube-system
labels:
app: grafana
spec:
type: NodePort
ports:
- port: 3000
selector:
app: grafana
EOF
由於5.1(可以選擇5.1之前的docker鏡像,可以避免此類錯誤)版本后groupid更改,同時我們將/var/lib/grafana掛載到pvc后,目錄擁有者可能不是grafana用戶,所以我們還需要添加一個Job用於授權目錄
cat >>grafana_job.yaml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
name: grafana-chown
namespace: kube-system
spec:
template:
spec:
restartPolicy: Never
containers:
- name: grafana-chown
command: ["chown", "-R", "472:472", "/var/lib/grafana"]
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- name: storage
subPath: grafana
mountPath: /var/lib/grafana
volumes:
- name: storage
persistentVolumeClaim:
claimName: grafana
EOF
配置grafana
1.第一次創建grafana需要添加數據源
2.數據源添加完畢后,接下來添加New dashboard
這里面的模板都是公共的,可以免費使用
導入模板,會自動跳轉到配置頁面
3.保存模板
這里無法顯示是由於模板定義的標簽,我們prometheus並沒有這個數據元,所以說我們要對模板進行修改!
在修改之前我們先設置一下時區,grafana默認走的是瀏覽器時區,但是prometheus使用的是UTC時區
grafana模板修改
前面的步驟必須和我相同,否則這里可能會無法出現值
1.集群內存使用率
首先我們進行編輯 Cluster memory usage
- 計算方式就是(整個集群的內存-(整個集群剩余的內存以及Buffer和Cached))/整
(sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes)) / sum(node_memory_MemTotal_bytes) * 100
這里要說明一點,這里填寫的是PromSQL,也就是說是可以在prometheus查詢到的。 如果查詢不到grafana也是會獲取不到數據的
這里在prometheus是可以獲取到的
2.集群cpu使用率
Cluster memory usage 配置如下
sum(sum by (container_name)( rate(container_cpu_usage_seconds_total{image!=""}[1m] ) )) / count(node_cpu_seconds_total{mode="system"}) * 100
3.集群文件系統使用率
Cluster filesystem usage
(sum(node_filesystem_size_bytes{device="tmpfs"}) - sum(node_filesystem_free_bytes{device="tmpfs"}) ) / sum(node_filesystem_size_bytes{device="tmpfs"}) * 100
4.集群Pod cpu使用率
sum by (pod_name)(rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m]))
圖列格式:{{ pod_name }}
5.集群pod 內存使用率
sort_desc(sum (container_memory_usage_bytes{image!="", pod_name!=""}) by(pod_name))
圖列格式:{{ pod_name }}
6.集群Pod 網絡監控
1.入口流量
sort_desc(sum by (pod_name) (rate (container_network_receive_bytes_total{name!=""}[1m]) ))
2.出口流量
sort_desc(sum by (pod_name) (rate (container_network_transmit_bytes_total{name!=""}[1m]) ))
監控時間為1分鍾