prometheus监控第二篇
??1. 使用prometheus监控kube-state-metrics
??上篇博文我们已经成功安装了prometheus。并且使用prometheus成功监控了redis应用.同时使用prometheus监控了kubernetes-service-endpoints、kubernetes-nodes、kubernetes-kubelet、kubernetes-cadvisor、kubernetes-apiserveres等。现在开始使用prometheus监控kube-state-metrics
??以前我们配置了自动发现 Service(Pod也是一样的)的监控,但是这些监控数据都是应用内部的监控,需要应用本身提供一个/metrics接口,或者对应的 exporter 来暴露对应的指标数据,但是在 Kubernetes 集群上 Pod、DaemonSet、Deployment、Job、CronJob 等各种资源对象的状态也需要监控,这也反映了使用这些资源部署的应用的状态。但通过查看前面从集群中拉取的指标(这些指标主要来自 apiserver 和 kubelet 中集成的 cAdvisor),并没有具体的各种资源对象的状态指标。对于 Prometheus 来说,当然是需要引入新的 exporter 来暴露这些指标,Kubernetes 提供了一个kube-state-metrics就是我们需要的。
??kube-state-metrics 已经给出了在 Kubernetes 部署的 manifest 定义文件,我们直接将代码 Clone 到集群中(能用 kubectl 工具操作就行).部署完成kube-state-metrics之后,就可以在prometheus的kubernetes-service-endpoints里面找到。
git clone https://github.com/kubernetes/kube-state-metrics.git
cd kube-state-metrics/kubernetes
kubectl create -f ./
#由于部署kube-state-metrics需要一个边角容器 k8s.gcr.io/addon-resizer:1.8.3 但是这个镜像在国内是下载不了的,解决办法是:
docker pull anjia0532/google-containers.addon-resizer:1.8.3
docker tag anjia0532/google-containers.addon-resizer:1.8.3 k8s.gcr.io/addon-resizer:1.8.3
国内下载gcr.io镜像的参考文档:http://www.cnblogs.com/xiaoqi/p/gcr-io-and-k8s-gcr-io.html
??2. 使用grafana展示prometheus监控数据
??grafana 是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源,比 Prometheus 自带的图表展示功能强大太多,更加灵活,有丰富的插件,功能更加强大。
# vim grafana.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: grafana
namespace: kube-ops
labels:
app: grafana
spec:
revisionHistoryLimit: 10
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:5.3.4
imagePullPolicy: IfNotPresent
ports:
- name: grafana
containerPort: 3000
env:
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: admin321
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: 100m
memory: 256Mi
requests:
cpu: 100m
memory: 256Mi
volumeMounts:
- name: storage
mountPath: /var/lib/grafana
subPath: grafana
securityContext:
fsGroup: 472
runAsUser: 472
volumes:
- name: storage
persistentVolumeClaim:
claimName: grafana
# vim grafana-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 10.83.32.146
path: /data/grafana
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: kube-ops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
# vim grafana-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: kube-ops
labels:
app: grafana
spec:
type: NodePort
ports:
- port: 3000
selector:
app: grafana
??现在开始登陆grafana,使用的用户名和密码是部署文件中的变量,登陆的IP地址和端口需要查看svc和pod的位置。从中可以看出pod的是在kubenode1这台机器上面运行的,NodePort端口是31748
[root@kubemaster grafana2]# kubectl get svc -n kube-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.106.147.115 <none> 3000:31748/TCP 57m
myapp ClusterIP 10.98.239.156 <none> 80/TCP 5d6h
prometheus NodePort 10.98.6.97 <none> 9090:31867/TCP 66m
redis ClusterIP 10.100.225.179 <none> 6379/TCP,9121/TCP 7d1h
tomcat ClusterIP 10.107.238.16 <none> 8080/TCP,8009/TCP 5d3h
traefik-ingress-service NodePort 10.111.9.88 <none> 80:30582/TCP,8080:30048/TCP 5d6h
[root@kubemaster grafana2]# kubectl get pods -n kube-ops -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
grafana-57f7d594d9-8rgbf 1/1 Running 1 57m 10.244.1.45 kubenode1 <none> <none>
myapp-deploy-6b56d98b6b-65jc9 1/1 Running 0 5d6h 10.244.0.18 kubemaster <none> <none>
myapp-deploy-6b56d98b6b-r92p8 1/1 Running 0 5d6h 10.244.2.45 kubenode2 <none> <none>
myapp-deploy-6b56d98b6b-rrb5b 1/1 Running 0 5d6h 10.244.1.21 kubenode1 <none> <none>
node-exporter-cwqqv 1/1 Running 0 77m 10.83.32.146 kubemaster <none> <none>
node-exporter-gl49b 1/1 Running 0 77m 10.83.32.138 kubenode1 <none> <none>
node-exporter-qcw54 1/1 Running 0 77m 10.83.32.133 kubenode2 <none> <none>
prometheus-848d44c7bc-bcz96 1/1 Running 0 71m 10.244.1.43 kubenode1 <none> <none>
redis-58c6c94968-qcq6p 2/2 Running 2 7d1h 10.244.0.11 kubemaster <none> <none>
tomcat-deploy-5fd9ffbdc7-292hl 1/1 Running 0 5d3h 10.244.2.46 kubenode2 <none> <none>
tomcat-deploy-5fd9ffbdc7-6pwxs 1/1 Running 0 5d3h 10.244.0.19 kubemaster <none> <none>
tomcat-deploy-5fd9ffbdc7-cdnj8 1/1 Running 0 5d3h 10.244.1.22 kubenode1 <none> <none>
traefik-ingress-controller-7899bfbd87-5nrwx 1/1 Running 0 5d1h 10.244.0.20 kubemaster <none> <none>
traefik-ingress-controller-7899bfbd87-wsl64 1/1 Running 0 5d1h 10.244.1.23 kubenode1 <none> <none>
[root@kubemaster grafana2]#
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: admin321
??登陆granfa默认的用户名是admin,默认的密码是admin321 登陆grafana之后的第一个步骤就是设置数据源
??我们这个地方配置的数据源是 Prometheus,所以选择这个 Type 即可,给改数据源添加一个 name:gytest,最主要的是下面HTTP区域是配置数据源的访问模式。 访问模式是用来控制如何处理对数据源的请求的:
- 服务器(Server)访问模式(默认):所有请求都将从浏览器发送到 Grafana 后端的服务器,后者又将请求转发到数据源,通过这种方式可以避免一些跨域问题,其实就是在 Grafana 后端做了一次转发,需要从Grafana 后端服务器访问该 URL。
- 浏览器(Browser)访问模式:所有请求都将从浏览器直接发送到数据源,但是有可能会有一些跨域的限制,使用此访问模式,需要从浏览器直接访问该 URL。
??我们可以看到 dashboard 页面上出现了很多漂亮的图表,但是看上去数据不正常,这是因为这个 dashboard 里面需要的数据指标名称和我们 Prometheus 里面采集到的数据指标不一致造成的,比如,第一个Cluster memory usage(集群内存使用情况),我们可以点击标题 -> 这就是我们之前在 Prometheus 里面查询的promQL语句,我们可以将上面的查询语句复制到 Prometheus 的 Graph 页面进行查询,其实可以预想到是没有对应的数据的,因为我们用node_exporter采集到的数据指标不是node_memory_MemTotal关键字,而是node_memory_MemTotal_bytes,将上面的promQL语句做相应的更改:
??这个语句的意思就是(整个集群的内存-(整个集群剩余的内存以及Buffer和Cached))/整个集群的内存,简单来说就是总的集群内存使用百分比。将上面 grafana 的promQL语句替换掉,就可以看到图表正常了:同样的,我们可以更改后面的 CPU 和 FileSystem 的使用率:
导入一个Dashboard
grafana插件安装
??grafana 就有一个专门针对 Kubernetes 集群监控的插件:grafana-kubernetes-app要安装这个插件,需要到 grafana 的 Pod 里面去执行安装命令:安装完成后需要重启 grafana 才会生效,我们这里直接删除 Pod,重建即可,然后回到 grafana 页面中,切换到 plugins 页面可以发现下面多了一个 Kubernetes 的插件,点击进来启用即可,然后点击Next up旁边的链接配置集群
[root@kubemaster ~]# kubectl exec -it -n kube-ops grafana-57f7d594d9-8rgbf -- /bin/bash
grafana@grafana-57f7d594d9-8rgbf:/usr/share/grafana$ grafana-cli plugins install grafana-kubernetes-app
installing grafana-kubernetes-app @ 1.0.1
from url: https://grafana.com/api/plugins/grafana-kubernetes-app/versions/1.0.1/download
into: /var/lib/grafana/plugins
? Installed grafana-kubernetes-app successfully
Restart grafana after installing plugins . <service grafana-server restart>
grafana@grafana-57f7d594d9-8rgbf:/usr/share/grafana$
推荐关注我的个人微信公众号 “云时代IT运维”,周期性更新最新的应用运维类技术文档。关注虚拟化和容器技术、CI/CD、自动化运维等最新前沿运维技术和趋势;
原文地址:https://blog.51cto.com/zgui2000/2362004