Prometheus监控k8s集群节点资源(static_configs方式)(章节二)
前言对于使用prometheus系统进行监控的,主要围绕以下几个点进行:系统层面监控系统监控:CPU,Load,Memory,Swap,Disk IO,Processes,Kernel等等网络监控:网络设备,工作负载,网络延迟,丢包率等中间件及基础设施类监控消息中间件:Kafka,RocketMQ等Web服务容器:Tomcat和jetty等数据库及缓存系统:MySQL,PostgreSQL,Mog
前言
对于使用prometheus系统进行监控的,主要围绕以下几个点进行:
系统层面监控
- 系统监控:CPU,Load,Memory,Swap,Disk IO,Processes,Kernel等等
- 网络监控:网络设备,工作负载,网络延迟,丢包率等
中间件及基础设施类监控
- 消息中间件:Kafka,RocketMQ等
- Web服务容器:Tomcat和jetty等
- 数据库及缓存系统:MySQL,PostgreSQL,MogoDB,Redis,ElasticSearch等
- 数据库连接池:ShadingSpere等 存储系统:Ceph等
应用层监控
- 用于衡量应用程序代码的状态和性能
业务层监控
- 用户衡量应用程序的价值,例如电子商务网站上的销售量
- QPS,DAU日活,转化率
- 业务接口:登录数,注册数,订单量,搜索量和支付量等
然而我们监控k8s集群主要从以下维度去做
- Kubernetes 节点的监控:比如节点的 cpu、load、disk、memory 等指标
- 内部系统组件的状态:比如kube-scheduler、kube-controller-manager、kubedns/coredns 等组件的详细运行状态
- 编排级的 metrics:比如 Deployment 的状态、资源请求、调度和 API 延迟等数据指标
以下我们主要从系统层面针对k8s集群中的节点进行监控。以下是环境简要
Kubernetes v1.19.13
Prometheus v2.30.3
node_exporter v1.2.2
一、部署prometheus
# 可参考文档:章节一文章
二、配置prometheus
# 由于我们在第一章节时,把prometheus部署到K8s上的,配置文件是保存在configmap资源对象的,因此我需要修改configmap的yaml并应用。(当configmap更新之后,pod默认会在10s后更新到容器里面。即是configmap的热加载机制),然后通过请求prometheus的localhost:9090/-/reload进行配置热加载,热生效。
[root@k8s-master ~]# vim prometheus_configmap.yaml
# 源YAML文件可到Github下载:https://github.com/shaxiaozz/prometheus
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-configmap
namespace: monitor
data:
prometheus.yml: |
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['127.0.0.1:9090']
#新增监控任务,并且目标为k8s集群中的每一个节点
- job_name: 'k8s集群'
static_configs:
- targets:
- k8s-master:9100
- k8s-node1:9100
- k8s-node2:9100
[root@k8s-master ~]# kubectl apply -f prometheus_configmap.yaml
[root@k8s-master ~]# kubectl get pods -A -o wide | grep prometheus #查看pod ip
[root@k8s-master ~]# curl -X POST http://10.244.36.78:9090/-/reload #请求pod的api界面,讲配置热加载了
三、部署node_exporte
#由于我们此次是针对k8s集群中的节点进行监控,因此我们可以通过 DaemonSet 控制器来部署该服务,这样每一个节点都会自动运行一个node_exporte的Pod副本,如果我们从集群中删除或者添加节点后,Pod也会进行自动扩展。
[root@k8s-master ~]# vim node_exporter_daemonset.yaml
# 源YAML文件可到Github下载:https://github.com/shaxiaozz/prometheus
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitor
labels:
name: node-exporter
spec:
selector:
matchLabels:
name: node-exporter
template:
metadata:
labels:
name: node-exporter
spec:
#pod安全策略,使用宿主机的进程命名空间,进程间通信命名空间,网络命名空间
hostPID: true
hostIPC: true
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.2.2
ports:
- containerPort: 9100
resources:
requests:
cpu: 150m
memory: "128Mi"
limits:
cpu: 350m
memory: "512Mi"
securityContext:
privileged: true
args:
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --path.rootfs
- /host
- --collector.filesystem.ignored-mount-points
- '"^/(sys|proc|dev|host|etc)($|/)"'
#容器挂载点
volumeMounts:
- name: dev
mountPath: /host/dev
readOnly: true
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: rootfs
mountPath: /host
readOnly: true
#容器存活健康检测
livenessProbe:
httpGet:
port: 9100
path: /metrics
initialDelaySeconds: 5
failureThreshold: 3
#容器就绪健康检测
readinessProbe:
httpGet:
port: 9100
path: /metrics
initialDelaySeconds: 5
failureThreshold: 3
#监控master节点(Master存在NoSchedule的污点,需要匹配)
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
#宿主机挂载点路径
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
由于我们做的是系统层面的监控,而我们的node_exporte是运行在容器中的,所以我们需要在Pod中添加一些安全策略,让pod可以获取到宿主机的资源性能指标,如hostPID,hostIPC,hostNetwork。
另外我们还将宿主机的/dev,/proc,/sys这些目录都挂载到容器中,并且设置为只读模式。
另外我们需要把master节点也进行监控了。但master节点上有NoSchedule的污点存在,因此我们需要在yaml中定义tolerations,匹配此污点的也运行node_exporte的pod
[root@k8s-master ~]# kubectl apply -f node_exporter_daemonset.yaml
[root@k8s-master ~]# kubectl get ds -n monitor
[root@k8s-master ~]# kubectl get pods -n monitor -o wide
由于我们在上面的yaml文件中定义了,node_exporte共享宿主机的网络命名空间(hostNetwork: true),因此我们直接在宿主机上查看9100端口是否在监听状态,并且请求/metrics看是否有指标数据出现
[root@k8s-master ~]# netstat -lntup | grep 9100
[root@k8s-master ~]# curl 127.0.0.1:9100/metrics | more
可以从http://IP:9100/metrics的URL路径下查看到宿主机的指标数据,我们可以打开prometheus的UI界面查看一下。
到Targets界面查看一下
回到PromQL界面(即首页)
我们一起来查看一下节点的CPU使用率,磁盘使用率,内存使用率
CPU在5分钟的平均使用率:
100 - (avg by (instance) (irate(node_cpu_seconds_total{ mode=“idle”}[5m])) * 100)
更多推荐
所有评论(0)