1 Thanos 对接多 Prometheus 常用集群级指标
在下面的这些指标 tenant_id 是由于通过 thanos 作为多 Prometheus 纳管,以方便识别不同集群 Prometheus
1 节点类
1.节点 info
sum(node_uname_info) by (nodename,machine,release,version,tenant_id)
2.CPU 使用率
100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(tenant_id,instance) *100)
3.内存使用率
100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))
4.CPU 核数
node:node_num_cpu:sum
5.CPU Requests.cpu值 (核)
sum(kube_pod_container_resource_requests{resource="cpu"}) by (node,tenant_id)
6.CPU Limits.cpu值 (核)
sum(kube_pod_container_resource_limits{resource="cpu"}) by (node,tenant_id)
7.Limits.mem置备值(G)
sum(kube_pod_container_resource_limits{resource="memory"}) by (node,tenant_id) /1024/1024/1024
8.Requests.mem置备值(G)
sum(kube_pod_container_resource_requests{resource="memory"}) by (node,tenant_id) /1024/1024/1024
9.通过 thanos 获取cluster 内存使用率
avg(((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )) * 100) by (tenant_id)
解释:
node_memory_MemTotal_bytes: 这是一个指标,表示节点的总内存容量。
node_memory_MemFree_bytes: 这是一个指标,表示节点未被使用的空闲内存。
node_memory_Buffers_bytes: 这是一个指标,表示节点分配给内核缓冲区的内存。
node_memory_Cached_bytes: 这是一个指标,表示节点分配给内核缓存的内存。
该查询使用了四个指标来计算节点的已使用内存量。具体的计算步骤如下:
首先,计算出未被使用的内存量,即将空闲内存、内核缓冲区内存和内核缓存内存相加。
node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes
然后,将未被使用的内存量从总内存容量中减去,以计算已使用的内存量。
node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)
最后,将已使用的内存量除以总内存容量,并乘以 100,以百分比的形式表示节点的内存使用率。
10.通过 thanos 获取cluster 内存使用率
100-(avg(irate(node_cpu_seconds_total{mode="idle"}[3m])) by(tenant_id) * 100)
2 K8S Cluster 类
1.集群 NODE 数量
sum(node_uname_info) by (tenant_id)
2.集群 namespace 总数
sum(kube_namespace_labels) by (tenant_id)
3.集群 CPU-limits
sum(kube_resourcequota{resource="limits.cpu",type="hard"} ) by (tenant_id)
4.集群 CPU-request
sum(kube_resourcequota{resource="requests.cpu",type="hard"} ) by (tenant_id)
5.集群 MEM-limits
sum(kube_resourcequota{resource="limits.memory",type="hard"} ) by (tenant_id) /1024/1024/1024
6.集群 MEM-request
sum(kube_resourcequota{resource="requests.memory",type="hard"} ) by (tenant_id) /1024/1024/1024
7.集群 MEM-使用量
sum(kube_resourcequota{resource="requests.memory",type="used"} ) by (tenant_id) /1024/1024/1024
8.集群 CPU 使用量(request)
sum(kube_resourcequota{resource="requests.cpu",type="used"} ) by (tenant_id)
9.集群 CPU 使用量(limits)
sum(kube_pod_container_resource_limits{resource="cpu"}) by (tenant_id)
10.集群内存使用量(limist)
sum(kube_pod_container_resource_limits{resource="memory"}) by (tenant_id) /1024/1024/1024
11.集群K8S版本
sum(kubernetes_build_info) by (git_version,tenant_id)
3 namespace 类
1.namespace info
kube_namespace_labels
2.namespace POD数量
sum(kube_pod_status_phase{phase="Running"}) by (tenant_id,namespace)
3.namespace 当前 CPU 使用量
sum(namespace:container_cpu_usage_seconds_total:sum_rate) by (namespace,tenant_id,workspace)
4.namespace 当前 MEM 使用量
sum(rate(container_memory_working_set_bytes{container!="POD"}[5m])) by (namespace,tenant_id) /1024/1024/1024
5.namespace 当前 MEM Limit
sum(kube_pod_container_resource_limits{resource="memory"}) by (namespace,tenant_id) / 1024/1024/1024
6.namespace 当前 CPU Limit
sum(kube_pod_container_resource_limits{resource="cpu"}) by (namespace,tenant_id)
7.namespace 当前 CPU request
sum(kube_pod_container_resource_requests{resource="cpu"}) by (namespace,tenant_id)
8.namespace 当前内存 request
sum(kube_pod_container_resource_requests{resource="memory"}) by (namespace,tenant_id) /1024/1024/1024
4 Pod 类
Pod info
sum(kube_pod_info) by (pod,node,tenant_id,namespace)
Pod 运行状态
kube_pod_status_phase
Pod CPU.request
sum(namespace_cpu:kube_pod_container_resource_requests:sum) by (namespace,tenant_id)
Pod Mem.request
sum(namespace_memory:kube_pod_container_resource_requests:sum) by (namespace,tenant_id) /1024/1024/1024
Pod CPU.Limits
sum(kube_pod_container_resource_limits{resource="cpu"}) by (namespace,tenant_id)
Pod CPU 使用量
sum(rate(container_cpu_usage_seconds_total{container!="POD"}[5m])) by (namespace,tenant_id)
Pod 内存使用量
sum(rate(container_memory_working_set_bytes{container_name!="POD"}[5m])) by (namespace,tenant_id) /1024/1024/1024
2 Prometheus 常用监控指标
Prometheus 提供一个函数式的表达式语言 PromQL (Prometheus Query Language),可以使用户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在 Prometheus 表达式浏览器中以表格形式展示,或者作为数据源, 以 HTTP API 的方式提供给外部系统使用如 grafana
在 grafana 中都是通过 PromQL 语句来查询到对应的监控资源进行渲染
2.1 PromQL 常用 rules 语句
多条 rules 语句: https://awesome-prometheus-alerts.grep.to/rules
下面这些只是一些基本的 QL 语句,而且都是 Prometheus 自己定义好的、除非我们通过二次开发不然不能修改
2.1.1 node 监控常用语句
# 常用 QL 语句
# 查询 node 节点总内存大小
node_memory_MemTotal_bytes
# 查询 node 节点剩余可用内存
node_memory_MemFree_bytes
# 查询指定节点的总内存
node_memory_MemTotal_bytes{instance="172.31.7.111:9100"}
# 查询指定节点的可用内存
node_memory_MemFree_bytes{instance="172.31.7.111:9100"}
# 查询指定磁盘的每秒磁盘 io
node_disk_io_time_seconds_total{device="sda"}
#查看指定磁盘的磁盘剩余空间
node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs",mountpoint="/"}
# CPU 负载
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 0.1
# HELP node_load15 15m load average.
# TYPE node_load15 gauge
node_load15 0.17
# HELP node_load5 5m load average.
# TYPE node_load5 gauge
node_load5 0.13
# CPU 相关指标
node_cpu_:
# 系统负载指标
node_load1:load average
node_load5
node_load15
# 内存相关指标
node_memory
# 网络相关指标
node_network
# 磁盘 IO 相关指标
node_disk
# 文件系统相关指标
node_filesystem
# 系统启动时间监控
node_boot_time_seconds
# cpu使用率 5 分钟内百分比:
100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) *100)
# cpu分别在1分钟,3分钟,5分钟之内的使用情况:
node_load1 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
node_load3 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
node_load5 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
# 内存使用率百分比
# (总内存 - 已使用内存 - 缓冲区内存 - 字段内存) = 剩余内存 / 总内存 * 100 = 可用内存
# node_memory_Buffers_bytes
# 可用内存
# node_memory_MemAvailable_bytes
((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )) * 100
# 硬盘使用情况百分比
#(总大小-剩余大小)/ 总大小= 硬盘使用率
(node_filesystem_size_bytes {mountpoint ="/"} - node_filesystem_free_bytes {mountpoint ="/"}) /
node_filesystem_size_bytes {mountpoint ="/"} * 100
# 硬盘io使用情况
# 硬盘使⽤率 是 read + written 读和写 都会占⽤IO /1024 两次后 就由 bytes => Mbs
((rate(node_disk_read_bytes_total[5m] )+ rate(node_disk_written_bytes_total[5m])) / 1024 /1024)
# 网卡流量
# irate 和 rate 都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同:irate 取的是在指定时间范围内的最近两个数据点来算速率,而 rate 会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果
irate(node_network_transmit_bytes_total{device!~"lo"}[1m]) / 1000
2.1.2 pod 和 容器监控语句
2.1.2.1 kubernetes 资源相关
# 关于 CPU 的 limit 合理性指标。查出最近5分钟,超过 20% 的 CPU 执行周期受到限制的容器。表达式:
sum(increase(container_cpu_cfs_throttled_periods_total{container!="", namespace!="", pod!=""}[5m])) by (container, pod, namespace) / sum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace) > ( 20 / 100 )
# 相关指标说明:
container_cpu_cfs_periods_total :容器生命周期中度过的 cpu 周期总数
container_cpu_cfs_throttled_periods_total:容器生命周期中度过的受限的 cpu 周期总数
# 集群 CPU 过度使用。CPU 已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的 CPU 总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配。
sum(namespace:kube_pod_container_resource_requests_cpu_cores:sum{})
/
sum(kube_node_status_allocatable_cpu_cores)
>
(count(kube_node_status_allocatable_cpu_cores)-1) / count(kube_node_status_allocatable_cpu_cores)
# 相关指标说明:
kube_pod_container_resource_requests_cpu_cores :资源 CPU 使用的 cores 数量
kube_node_status_allocatable_cpu_cores :节点 CPU cores 数量
# 集群内存过度使用。内存已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的内存总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配。表达式:
sum(namespace:kube_pod_container_resource_requests_memory_bytes:sum{})
/
sum(kube_node_status_allocatable_memory_bytes)
>
(count(kube_node_status_allocatable_memory_bytes)-1)
/
count(kube_node_status_allocatable_memory_bytes)
# 集群CPU是否超分。查看 CPU 资源分配的额度是否超过进群总额度
sum(kube_pod_container_resource_limits_cpu_cores{job="kube-state-metrics"})
/
sum(kube_node_status_allocatable_cpu_cores)
> 1.1
# 相关指标说明:
kube_pod_container_resource_limits_cpu_cores :资源分配的 CPU 资源额度
kube_node_status_allocatable_cpu_cores :节点 CPU 总量
# 集群超分内存,查看内存资源分配的额度是否超过集群总额度
sum(kube_pod_container_resource_limits_memory_bytes{job="kube-state-metrics"})
/
sum(kube_node_status_allocatable_memory_bytes{job="kube-state-metrics"})
> 1.1
# 相关指标说明:
kube_pod_container_resource_limits_memory_bytes :资源配额内存量
kube_node_status_allocatable_memory_bytes :节点内存量
# 命名空间级内存资源使用的比例,关乎资源配额。当使用 request 和 limit 限制资源时,使用值和最大值还是有一点区别,当有 request 时说明最低分配了这么多资源。需要注意当 request 等于 limit 时那么说明资源已经是100%已经分配使用当监控告警发出的时候需要区分。
sum (kube_pod_container_resource_requests_memory_bytes{job="kube-state-metrics"} ) by (namespace)/ (sum(kube_pod_container_resource_limits_memory_bytes{job="kube-state-metrics"}) by (namespace)) > 0.8
# 相关指标说明:
kube_pod_container_resource_requests_memory_bytes :内存资源使用量
kube_pod_container_resource_limits_memory_bytes :内存资源最大值
# 命名空间级 CPU 资源使用的比例,关乎资源配额。当使用 request 和 limit 限制资源时,使用值和最大值还是有一点区别,当有 request 时说明最低分配了这么多资源。需要注意当 request 等于 limit 时那么说明资源已经是100%已经分配使用当监控告警发出的时候需要区分。
sum (kube_pod_container_resource_requests_cpu_cores{job="kube-state-metrics"} ) by (namespace)/ (sum(kube_pod_container_resource_limits_cpu_cores{job="kube-state-metrics"}) by (namespace)) > 0.8
# 相关指标说明:
kube_pod_container_resource_requests_cpu_cores:CPU 使用量
kube_pod_container_resource_limits_cpu_cores:CPU 限额最大值
2.1.2.2 Kubernetes 存储相关
# PVC 容量监控
kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"}
< 0.3
# 相关指标说明:
kubelet_volume_stats_available_bytes:剩余空间
kubelet_volume_stats_capacity_bytes:空间总量
# 磁盘空间耗尽预测:通过PVC资源使用6小时变化率预测 接下来4天的磁盘使用率
(kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"}
) < 0.4
and
predict_linear(kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0
# 相关指标说明:
kubelet_volume_stats_available_bytes:剩余空间
kubelet_volume_stats_capacity_bytes:空间总量
# PV 使用状态监控。
kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"}
# 相关指标说明:
kube_persistentvolume_status_phase :PV 使用状态
2.1.2.3 kubernetes system 相关
# 组件版本与当前集群版本是否有差异。对比组件版本是否有差异,默认为1 。
count(count by (gitVersion) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"gitVersion","$1","gitVersion","(v[0-9]*.[0-9]*.[0-9]*).*")))
# 相关指标说明:
kubernetes_build_info:获取组件信息
# 客户端访问某些接口的错误率。
(sum(rate(rest_client_requests_total{code=~"5.."}[5m])) by (instance, job)
/
sum(rate(rest_client_requests_total[5m])) by (instance, job))
> 0.01
# 相关指标说明:
rest_client_requests_total:状态码
2.1.2.4 APIServer 相关
# APIServer 请求错误率。5分钟内 APIServer 请求错误率。
sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) by (resource,subresource,verb)
/
sum(rate(apiserver_request_total{job="apiserver"}[5m])) by (resource,subresource,verb) > 0.05
# 相关指标说明:
apiserver_request_total :APIServer 请求数
2.1.2.5 容器网络相关
# 容器 5 分钟内入带宽大于 5 M
sum by (namespace,job,name) (irate(container_network_receive_bytes_total{image!="",namespace!="",container!="",name!=""}[5m])) /1024/1024 > 5
# 容器 5 分钟内出带宽大于 5 M
sum by (namespace,job,name) (irate(container_network_transmit_bytes_total{image!="",namespace!="",container!="",name!=""}[5m])) /1024/1024 > 5
# 容器网络接收量速率是否超过 5M
sum(rate(container_network_receive_bytes_total{image!="",pod!="",namespace!=""}[5m])) without (interface) /1024/1024 > 5
# 容器网络传输量速率是否大于 5M
sum(rate(container_network_transmit_bytes_total{image!="",pod!="",namespace!=""}[5m])) without (interface) /1024/1024 > 3
# 容器 io 异常
sum by (name,job) (container_fs_io_time_seconds_total{image!="",name!=""}) /1024/1024
# CPU:
ocontainer_cpu_user_seconds_total # 以秒为单位,“用户”累计消耗CPU的时间
ocontainer_cpu_system_seconds_total # 以秒为单位,“系统”累计消耗CPU的时间
ocontainer_cpu_usage_seconds_total # 以秒为单位,累计消耗CPU的时间(上述总和)
# 内存:
ocontainer_memory_cache # 页面缓存内存的字节数
ocontainer_memory_swap # 容器交换使用情况,以字节为单位
ocontainer_memory_usage_bytes # 当前内存使用情况,以字节为单位,包括所有内存
ocontainer_memory_max_usage_bytes # 以字节为单位,最大内存使用量
# 磁盘:
ocontainer_fs_io_time_seconds_total # 执行I/O所花费的时间,以秒为单位
ocontainer_fs_io_time_weighted_seconds_total # 累计加权I/O时间,以秒为单位
ocontainer_fs_writes_bytes_total # 写入的累计字节数
ocontainer_fs_reads_bytes_total # 读取的累计字节数
# 网络:
ocontainer_network_receive_bytes_total # 接收的累计字节数
ocontainer_network_receive_errors_total # 接收时遇到的累计错误数
ocontainer_network_transmit_bytes_total # 传输的累计字节数
ocontainer_network_transmit_errors_total # 传输时遇到的累计错误数
2.1.3 etcd 常用监控指标
# etcd集群没有leader
etcd_server_has_leader == 0
# Etcd 大量的领导者变更
increase(etcd_server_leader_changes_seen_total[10m]) > 2
# etcd 服务器在过去一小时收到了超过 5 个失败的提案
increase(etcd_server_proposals_failed_total[1h]) > 5
# Etcd WAL fsync 持续时间增加,第 99 个百分位超过 0.5s ,表示磁盘问题
histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[1m])) > 0.5
# etcd 提交持续时间增加,第 99 个百分位超过 0.25s
histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket[1m])) > 0.25
2.1.4 Prometheus 自身监控语句
# Prometheus 服务停掉
absent(up{job="prometheus"})
# job 丢失
up == 0
# Prometheus 失去的 job
count by (job) (up) == 0
# Prometheus 配置重载错误
prometheus_config_last_reload_successful != 1
# Prometheus 在过去 15 分钟内重启了两次以上,服务可能崩溃
changes(process_start_time_seconds{job=~"prometheus|pushgateway|alertmanager"}[15m]) > 2
# Prometheus 无法连接alertmanager
prometheus_notifications_alertmanagers_discovered < 1
# Prometheus 在服务发现中没有目标
prometheus_sd_discovered_targets == 0
# Prometheus 抓取监控指标过慢
prometheus_target_interval_length_seconds{quantile="0.9"} > 60
# Prometheus 目标抓取重复
increase(prometheus_target_scrapes_sample_duplicate_timestamp_total[5m]) > 0
# Prometheus TSDB 检查点创建失败
increase(prometheus_tsdb_checkpoint_creations_failed_total[1m]) > 0
# Prometheus TSDB 检查点删除失败
increase(prometheus_tsdb_checkpoint_deletions_failed_total[1m]) > 0
# Prometheus TSDB 压缩失败
increase(prometheus_tsdb_compactions_failed_total[1m]) > 0