一、描述
Cadvisor + node-exporter + prometheus + grafana是一套非常流行的Kubernetes监控方案。它们的功能如下:
Cadvisor:容器资源监控工具,可以实时监控CPU、内存、存储、网络等容器指标,并暴露Metrics接口。
node-exporter:节点级指标导出工具,可以监控节点的CPU、内存、磁盘、网络等指标,并暴露Metrics接口。
Prometheus:时间序列数据库和监控报警工具,可以抓取Cadvisor和node-exporter暴露的Metrics接口,存储时序数据,并提供PromQL查询语言进行监控分析和报警。
Grafana:图表和Dashboard工具,可以查询Prometheus中的数据,并通过图表的方式直观展示Kubernetes集群的运行指标和状态。
二、监控流程
在Kubernetes集群的每个节点安装Cadvisor和node-exporter,用于采集容器和节点级指标数据。
部署Prometheus,配置抓取Cadvisor和node-exporter的Metrics接口,存储 containers 和 nodes 的时序数据。
使用Grafana构建监控仪表盘,选择Prometheus作为数据源,编写PromQL查询语句,展示K8S集群的CPU使用率、内存使用率、网络流量等监控指标。
根据监控结果,可以设置Prometheus的报警规则,当监控指标超过阈值时发送报警信息。这套方案能够全面监控Kubernetes集群的容器和节点,通过Metrics指标和仪表盘直观反映集群状态,并实现自动报警,非常适合K8S环境下微服务应用的稳定运行。
具体实现方案如下:
Cadvisor:在集群中每个节点作为DaemonSet部署cadvisor,采集容器Metrics。
node-exporter:在每个节点也作为DaemonSet运行,采集节点Metrics。
Prometheus:部署Prometheus Operator实现,作为Deployment运行,用于抓取Metrics和报警。
Grafana:部署Grafana Operator实现,用于仪表盘展示。
三、Kubernetes监控指标
K8S本身的监控指标
CPU利用率:包括节点CPU利用率、Pod CPU利用率、容器CPU利用率等,用于监控CPU资源使用情况。
内存利用率:包括节点内存利用率、Pod内存利用率、容器内存利用率等,用于监控内存资源使用情况。
网络流量:节点网络流量、Pod网络流量、容器网络流量,用于监控网络收发包大小和带宽利用率。
磁盘使用率:节点磁盘使用率,用于监控节点磁盘空间使用情况。
Pod状态:Pod的Running、Waiting、Succeeded、Failed等状态数量,用于监控Pod运行状态。
节点状态:节点的Ready、NotReady和Unreachable状态数量,用于监控节点运行状态。
容器重启次数:单个容器或Pod内所有容器的重启次数,用于监控容器稳定性。
API服务指标:Kubernetes API Server的请求LATENCY、请求QPS、错误码数量等,用于监控API Server性能。
集群组件指标:etcd、kubelet、kube-proxy等组件的运行指标,用于监控组件运行状态。这些都是Kubernetes集群运行状态的关键指标,通过Prometheus等工具可以进行收集和存储,然后在Grafana中设计相应的Dashboard进行可视化展示。当这些指标超出正常范围时,也可以根据阈值设置报警,保证Kubernetes集群和服务的稳定运行。
例如:
CPU利用率超过80%报警
内存利用率超过90%报警
网络流量/磁盘空间突增报警
Pod/节点 NotReady状态超过10%报警
API Server请求LATENCY超过200ms报警
etcd节点Down报警等等。
这些报警规则的设置需要根据集群大小和服务负载进行评估。
四、使用Prometheus监控k8s
部署前准备
下载prometheus、grafana、node-exporter
GitHub - redhatxl/k8s-prometheus-grafana: k8s monitor of prometheus-grafanak8s monitor of prometheus-grafana. Contribute to redhatxl/k8s-prometheus-grafana development by creating an account on GitHub.https://github.com/redhatxl/k8s-prometheus-grafana.git
这里我下载下来上传了该附件,可自行下载
拉去镜像:
[root@master ~]# docker pull prom/node-exporter
[root@master ~]# docker pull prom/prometheus:v2.0.0
[root@master ~]# docker pull grafana/grafana:6.1.4
解压zip得到如下
[root@master prometheus]# ls
k8s-prometheus-grafana-master k8s-prometheus-grafana-master.zip
[root@master prometheus]# cd k8s-prometheus-grafana-master/
[root@master k8s-prometheus-grafana-master]# ls
grafana node-exporter.yaml prometheus README.md
[root@master k8s-prometheus-grafana-master]# ll
总用量 8
drwxr-xr-x 2 root root 81 1月 7 2019 grafana
-rw-r--r-- 1 root root 714 6月 13 22:29 node-exporter.yaml
drwxr-xr-x 2 root root 106 1月 7 2019 prometheus
-rw-r--r-- 1 root root 117 6月 13 22:29 README.md
先安装node-exporter.yaml
[root@master k8s-prometheus-grafana-master]# kubectl apply -f node-exporter.yaml
daemonset.apps/node-exporter created
service/node-exporter created
[root@master k8s-prometheus-grafana-master]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-9d85f5447-7nhgv 1/1 Running 5 22d
kube-system coredns-9d85f5447-sfr9j 1/1 Running 5 22d
kube-system etcd-master 1/1 Running 6 22d
kube-system kube-apiserver-master 1/1 Running 6 22d
kube-system kube-controller-manager-master 1/1 Running 7 22d
kube-system kube-flannel-ds-77w47 1/1 Running 4 22d
kube-system kube-flannel-ds-trrcv 1/1 Running 6 22d
kube-system kube-flannel-ds-xcqgs 1/1 Running 4 22d
kube-system kube-proxy-674k4 1/1 Running 4 22d
kube-system kube-proxy-7l9bk 1/1 Running 6 22d
kube-system kube-proxy-kd449 1/1 Running 4 22d
kube-system kube-scheduler-master 1/1 Running 7 22d
kube-system metrics-server-59d984f5b7-2nt8z 2/2 Running 8 22d
kube-system node-exporter-5swxx 1/1 Running 1 3d
kube-system node-exporter-pbx6c 1/1 Running 1 3d
[root@master k8s-prometheus-grafana-master]# kubectl get daemonset -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds 3 3 3 3 3 <none> 22d
kube-system kube-proxy 3 3 3 3 3 beta.kubernetes.io/os=linux 22d
kube-system node-exporter 2 2 2 2 2 <none> 3d
[root@master k8s-prometheus-grafana-master]# kubectl get service -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22d 3d
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 22d
kube-system node-exporter NodePort 10.102.164.149 <none> 9100:31672/TCP 3d 3d
部署prometheus
[root@master k8s-prometheus-grafana-master]# cd prometheus/
[root@master prometheus]# ls
configmap.yaml prometheus.deploy.yml prometheus.svc.yml rbac-setup.yaml
[root@master prometheus]# kubectl apply -f rbac-setup.yaml
clusterrole.rbac.authorization.k8s.io/prometheus configured
serviceaccount/prometheus configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus configured
[root@master prometheus]# kubectl apply -f configmap.yaml
configmap/prometheus-config configured
[root@master prometheus]# kubectl apply -f prometheus.deploy.yml
deployment.apps/prometheus created
[root@master prometheus]# kubectl apply -f prometheus.svc.yml
service/prometheus created
部署grafana
[root@master prometheus]# cd ../grafana/
[root@master grafana]# ls
grafana-deploy.yaml grafana-ing.yaml grafana-svc.yaml
[root@master grafana]# kubectl apply -f grafana-deploy.yaml
deployment.apps/grafana-core created
[root@master grafana]# kubectl apply -f grafana-svc.yaml
service/grafana created
[root@master grafana]# kubectl apply -f grafana-ing.yaml
ingress.extensions/grafana created
查看前面安装的pod和service
访问http://192.168.159.180:31672/metrics,这是node-exporter采集的数据
访问prometheus地址http://192.168.159.180:30003/graph![](https://img-blog.csdnimg.cn/7536b962c71b450b86fc5af3adec171c.png)
访问grafana的地址http://192.168.159.180:32418/login,默认用户密码都是admin,登录后会默认让你修改密码
添加grafana 数据源,选择prometheus
把K8S的Dashboard的模板导入
导入315模板等待一会,或者可以下载好json文件,然后复制到下面的文本框中,点击load
最后就部署完成啦
版权归原作者 阿德小仔 所有, 如有侵权,请联系我们删除。