如果你通过kube-prometheus-stack部署了Prometheus/Grafana,那么Grafana中的仪表盘就是通过边车(sidecar)来动态获取的。Sidecar的观察对象是ConfigMap,当ConfigMap中配置的仪表盘发生变更时,可以动态更新Grafana的仪表盘,而无需重启pod。
在本文中,我将向你展示如何在Prometheus中识别要衡量的指标,在Granfa中创建一个仪表盘来显示该指标,并将仪表盘导出为json文件。然后通过使用json数据和适当的标签填充ConfigMap,并使用导出的仪表盘文件跨其他Grafana实例重新创建仪表盘。
识别指标
作为一个基本示例,让我们考虑集群中的总pod 数。使用kubectl命令获取所有命名空间中非零计数的pod:
kubectl get pods -A --no-headers | awk {'print $3'} | grep -v ^0 | wc -l
从Prometheus主页面验证指标值是否匹配,使用如下查询
kubectl_running_pods{job='apiserver'}
结果如下所示:
创建和导出
现在我们在Grafana Web UI中手动构建一次仪表盘,然后将其导出为json,然后可以将其放入ConfigMap中以供将来自动化和持久化。
登录 Grafana,单击仪表盘 -> 新仪表盘
使用Pod Count作为标题,选择 Prometheus作为数据源并输入之前测试过的 Prometheus指标,然后点击"Run queries"按钮来获取指标数据。
保存仪表盘:
结果如下:
导出仪表盘
按如下所示的“共享”图标将此仪表板保存为 json 文件:
删除手动创建的仪表盘
为了证明我们刚刚导出的json文件可以重新创建这个dashboard,我们需要先删除仪表盘,Dashboard settings->Delete Dashboard:
使用ConfigMap重新生成Grafana仪表盘
上面导出了仪表盘的json文件,接下来创建一个特殊标记的ConfigMap,Grafana kiwigrid sidecar 就会自动拉取它并重新创建仪表盘。
ConfigMap
在本文中,我们有一个命名空间prom,Grafana pod就在这个命名空间中。然后我们创建一个ConfigMap,其中grafana_dashboard
需要设置为1,如下所示(完整实例):
# pod-count-dashboard.yaml
apiVersion: v1
kind: ConfigMap
metadata:
labels:
grafana_dashboard: "1"
name: grafana-k8s-pod-count
namespace: prom
data:
k8s-pod-count.json: |-
{
...
...
...
}
这里将导出的仪表盘文件内容复制到ConfigMap中然后直接创建ConfigMap。
除此之外,还可以通过以下命令来创建ConfigMap:
# create cofigmap from exported json
kubectl create configmap grafana-k8s-pod-count -n prom --from-file=k8s-pod-count.json
# apply label that makes it Grafana target
kubectl label configmap grafana-k8s-pod-count -n prom grafana_dashboard=1
验证结果
等待30s后再Grafana中查看结果:
通过kustomize创建ConfigMap
上节介绍的是手动创建ConfigMap的方式,还可以通过kustomize来创建ConfigMap。kustomization.yaml文件内容如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
grafana_dashboard: "1"
configMapGenerator:
- name: grafana-k8s-pod-count
namespace: prom
# specify name of locally downloaded json
files:
- k8s-pod-count.json
generatorOptions:
disableNameSuffixHash: true
使用kustomize命令或"-k"标志应用kustomization.yaml中的设置,如下所示:
# generate configmap then apply
$ kubectl kustomize | kubectl apply -f -
configmap/grafana-k8s-pod-count created
# generate configmap and apply
# kubectl apply -k .