說明:本文為轉載文章,轉自
Prometheus Operator 安裝完成后會有很多默認的監控指標,一不注意就大量的報警產生,所以我們非常有必要了解下這些常用的監控指標,有部分指標很有可能對於我們自己的業務可有可無,所以可以適當的進行修改,這里我們就來對常用的幾個指標進行簡單的說明。
1. Kubernetes 資源相關
1.1 CPUThrottlingHigh
關於 CPU 的 limit 合理性指標。查出最近5分鍾,超過25%的 CPU 執行周期受到限制的容器。表達式:
sum(increase(container_cpu_cfs_throttled_periods_total{container!="", }[5m])) by (container, pod, namespace)
/
sum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace)
> ( 25 / 100 )
相關指標:
container_cpu_cfs_periods_total
:容器生命周期中度過的 cpu 周期總數container_cpu_cfs_throttled_periods_total
:容器生命周期中度過的受限的 cpu 周期總數
1.2 KubeCPUOvercommit
集群 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 數量
1.3 KubeMemoryOvercommit
集群內存過度使用。內存已經過度使用無法容忍節點故障,節點資源使用的總量超過節點的內存總量,所以如果有節點故障將影響集群資源運行因為所需資源將無法被分配。表達式:
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)
相關指標:
kube_pod_container_resource_requests_memory_bytes
:資源內存使用的量kube_node_status_allocatable_memory_bytes
:節點內存量
1.4 KubeCPUQuotaOvercommit
集群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 總量
1.5 KubeMemoryQuotaOvercommit
集群超分內存,查看內存資源分配的額度是否超過進群總額度 表達式:
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
:節點內存量
1.6 KubeMEMQuotaExceeded
命名空間級內存資源使用的比例,關乎資源配額。當使用 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
:內存資源最大值
1.7 KubeCPUQuotaExceeded
命名空間級 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. Kubernetes 存儲相關
2.1 KubePersistentVolumeFillingUp
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
:空間總量
2.2 KubePersistentVolumeFillingUp
磁盤空間耗盡預測:通過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
:空間總量
2.3 KubePersistentVolumeErrors
PV 使用狀態監控。
表達式:
kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"}
相關指標:
kube_persistentvolume_status_phase
:PV 使用狀態
3. kubernetes system 相關
3.1 KubeVersionMismatch
組件版本與當前集群版本是否有差異。對比組件版本是否有差異,默認為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
:獲取組件信息
3.2 KubeClientErrors
客戶端訪問某些接口的錯誤率。
表達式:
(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
:狀態碼
4. APIServer 相關
4.1 KubeAPIErrorsHigh
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
請求數
4.2 KubeClientCertificateExpiration
kubelet 客戶端證書過期。監測證書狀態30天告警和7天告警。
表達式:
apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 2592000
apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 604800
相關指標:
apiserver_client_certificate_expiration_seconds_count
:證書有效剩余時間
4.3 AggregatedAPIErrors
自定義注冊的 APIServer 服務可用性監控,當檢測到自定義注冊的 APIServer 五分鍾不用次數達到2次。
表達式:
sum by(name, namespace)(increase(aggregator_unavailable_apiservice_count[5m])) > 2
相關指標:
aggregator_unavailable_apiservice_count:
監測自定義注冊的 APIService 不可用次數。
4.4 KubeAPIDown
APIserver 失聯,監控 APIServer 服務,失聯原因可能是服務 down 還可能是網絡出現狀況。
表達式:
absent(up{job="apiserver"} == 1)
5. kubelet 相關
5.1 KubeNodeNotReady
節點是否處於就緒狀態。檢測節點是否為就緒狀態,或者可能是 kubelet 服務down 了。
表達式:
kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0
相關指標:
kube_node_status_condition
:節點狀態監測
5.2 KubeNodeUnreachable
節點狀態為 Unreachable。
表達式:
kube_node_spec_unschedulable{job="kube-state-metrics"} == 1
5.3 KubeletTooManyPods
節點運行過多的 Pod,監測節點上運行的 Pods 數量。
表達式:
max(max(kubelet_running_pod_count{job="kubelet", metrics_path="/metrics"}) by(instance) * on(instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"}) by(node) / max(kube_node_status_capacity_pods{job="kube-state-metrics"} != 1) by(node) > 0.95
相關指標:
kubelet_running_pod_count
:節點運行的 Pods 數量kubelet_node_name
:節點名稱kube_node_status_capacity_pods
:節點可運行的最大 Pod 數量
5.4 KubeNodeReadinessFlapping
監測集群狀態,查看集群內節點狀態改變的頻率。
表達式:
sum(changes(kube_node_status_condition{status="true",condition="Ready"}[15m])) by (node) > 2
5.5 KubeletDown
監控 kubelet 服務,down 或者網絡出現問題。
表達式:
absent(up{job="kubelet", metrics_path="/metrics"} == 1)
6. 集群組件
6.1 KubeSchedulerDown
KubeScheduler 失聯,監測 KubeScheduler 是否正常。
表達式:
absent(up{job="kube-scheduler"} == 1)
6.2 KubeControllerManagerDown
監測 KubeControllerManager 服務,Down 或者網絡不通。
表達式:
absent(up{job="kube-controller-manager"} == 1)
7. 應用相關
7.1 KubePodCrashLooping
Pod 重啟時間,重啟時間超過3m告警。
表達式:
rate(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[5m]) * 60 * 3 > 0
相關指標:
- kube_pod_container_status_restarts_total:重啟狀態0為正常
7.2 KubePodNotReady
Pods 沒有就緒,檢測 Pod 是否就緒。
表達式:
sum by (namespace, pod) (max by(namespace, pod) (kube_pod_status_phase{job="kube-state-metrics", phase=~"Pending|Unknown"}) * on(namespace, pod) group_left(owner_kind) max by(namespace, pod, owner_kind) (kube_pod_owner{owner_kind!="Job"})) > 0
相關指標:
- kube_pod_status_phase:Pod 狀態
7.3 KubeDeploymentGenerationMismatch
Deployment 部署失敗,Deployment 生成的資源與定義的資源不匹配。
表達式:
kube_deployment_status_observed_generation{job="kube-state-metrics"}
!=
kube_deployment_metadata_generation{job="kube-state-metrics"}
相關指標:
- kube_deployment_status_observed_generation:Deployment 生成資源數
- kube_deployment_metadata_generation:Deployment 定義資源數
7.4 KubeDeploymentReplicasMismatch
查看 Deplyment 副本是否達到預期。
表達式:
(
kube_deployment_spec_replicas{job="kube-state-metrics"}
!=
kube_deployment_status_replicas_available{job="kube-state-metrics"}
) and (
changes(kube_deployment_status_replicas_updated{job="kube-state-metrics"}[3m])
==
0
)
相關指標:
- kube_deployment_spec_replicas 資源定義副本數
- kube_deployment_status_replicas_available 正在運行副本數
- kube_deployment_status_replicas_updated 更新的副本數
7.5 KubeStatefulSetReplicasMismatch
監測 StatefulSet 副本是否達到預期。
表達式:
(
kube_statefulset_status_replicas_ready{job="kube-state-metrics"}
!=
kube_statefulset_status_replicas{job="kube-state-metrics"}
) and (
changes(kube_statefulset_status_replicas_updated{job="kube-state-metrics"}[5m])
==
0
)
相關指標:
- kube_statefulset_status_replicas_ready:就緒副本數
- kube_statefulset_status_replicas:當前副本數
- kube_statefulset_status_replicas_updated:更新的副本數
7.6 KubeStatefulSetUpdateNotRolledOut
StatefulSet 更新失敗且未回滾,對比版本號和副本數。
表達式:
max without (revision) (
kube_statefulset_status_current_revision{job="kube-state-metrics"}
unless
kube_statefulset_status_update_revision{job="kube-state-metrics"}
)
*
(
kube_statefulset_replicas{job="kube-state-metrics"}
!=
kube_statefulset_status_replicas_updated{job="kube-state-metrics"}
)
相關指標:
- kube_statefulset_status_replicas:每個 StatefulSet 的副本數。
- kube_statefulset_status_replicas_current:每個 StatefulSet 的當前副本數。
- kube_statefulset_status_replicas_ready:每個StatefulSet 的就緒副本數。
- kube_statefulset_status_replicas_updated:每個StatefulSet 的更新副本數。
- kube_statefulset_status_observed_generation:StatefulSet 控制器觀察到的生成。
- kube_statefulset_replicas:StatefulSet 所需的副本數。
- kube_statefulset_metadata_generation:表示 StatefulSet 所需狀態的特定生成的序列號。
- kube_statefulset_created:創建時間戳。
- kube_statefulset_labels:Kubernetes 標簽轉換為 Prometheus 標簽。
- kube_statefulset_status_current_revision:指示用於按順序(0,currentReplicas)生成 Pod 的StatefulSet 的版本。
- kube_statefulset_status_update_revision:指示用於按順序 [replicas-updatedReplicas,replicas] 生成 Pod 的 StatefulSet 的版本。
7.7 KubeDaemonSetRolloutStuck
監測 DaemonSet 是否處於就緒狀態。
表達式:
kube_daemonset_status_number_ready{job="kube-state-metrics"}
/
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} < 1.00
相關指標:
- kube_daemonset_status_number_ready:就緒的 DaemonSet
- kube_daemonset_status_desired_number_scheduled:應該調度的 DaemonSet 數量
7.8 KubeDaemonSetMisScheduled
DaemonSet 運行在不該運行的節點上面。
表達式:
kube_daemonset_status_number_misscheduled{job="kube-state-metrics"} > 0
相關指標:
- kube_daemonset_status_number_misscheduled:運行在不該運行的節點狀態
7.9 KubeContainerWaiting
監測哪些容器是在等待狀態的。
表達式:
sum by (namespace, pod, container) (kube_pod_container_status_waiting_reason{job="kube-state-metrics"}) > 0
相關指標:
- kube_pod_container_status_waiting_reason:容器聲明周期過程中的狀態,無論是創建成功還是失敗都應該是0。
8. 節點相關
8.1 NodeClockNotSynchronising
主機與時間服務器失聯。
表達式:
min_over_time(node_timex_sync_status[5m]) == 0
相關指標:
- node_timex_sync_status:同步狀態。
8.2 NodeClockSkewDetected
本地時間偏移量。
表達式:
(node_timex_offset_seconds > 0.05
and
deriv(node_timex_offset_seconds[5m]) >= 0
)
or
(
node_timex_offset_seconds < -0.05
and
deriv(node_timex_offset_seconds[5m]) <= 0)
相關指標:
- node_timex_offset_seconds:誤差
8.3 NodeHighNumberConntrackEntriesUsed
鏈接狀態跟蹤。
表達式:
(node_nf_conntrack_entries / node_nf_conntrack_entries_limit) > 0.75
相關指標:
- node_nf_conntrack_entries:鏈接狀態跟蹤表分配的數量
- node_nf_conntrack_entries_limit:表總量
8.4 NodeNetworkReceiveErrs
網卡接收錯誤量。
表達式:
increase(node_network_receive_errs_total[2m]) > 10
相關指標:
- node_network_receive_errs_total:接收錯誤總量
8.5 NodeNetworkTransmitErrs
網卡傳輸錯誤量。
表達式:
increase(node_network_transmit_errs_total[2m]) > 10
相關指標:
- node_network_transmit_errs_total:傳輸錯誤總量
8.6 NodeFilesystemAlmostOutOfFiles
inode 數量監測 表達式:
(
node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 5
and
node_filesystem_readonly{job="node-exporter",fstype!=""} == 0
)
相關指標:
- node_filesystem_files_free:空閑的 inode
- node_filesystem_files:inodes 總量
8.7 NodeFilesystemFilesFillingUp
inode 耗盡預測,以6小時曲線變化預測接下來24小時和4小時可能使用的 inodes。
表達式:
(node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 20
and
predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=""} == 0)
相關指標:
- node_filesystem_files_free:空閑的 inode
- node_filesystem_files:inodes 總量
8.8 NodeFilesystemAlmostOutOfSpace
分區容量使用率。
表達式:
(node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 10
and
node_filesystem_readonly{job="node-exporter",fstype!=""} == 0
)
相關指標:
- node_filesystem_avail_bytes:空閑容量
- node_filesystem_size_bytes:總容量
8.9 NodeFilesystemSpaceFillingUp
分區容量耗盡預測,以6小時曲線變化預測接下來24小時和4小時可能使用的容量。
表達式:
(node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 15
and
predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=""} == 0)
相關指標:
- node_filesystem_avail_bytes:空閑容量
- node_filesystem_size_bytes:總容量
9. Etcd 相關
9.1 Etcdlived
etcd 存活檢測。
表達式:
up{job="etcd"} < 1
9.2 EtcdCluseterUnavailable
etcd 集群健康檢查,down 數量大於集群可允許故障數量。
表達式:
count(up{job="etcd"} == 0) > (count(up{job="etcd"}) / 2 - 1)
9.3 EtcdLeaderCheck
檢查 leader。
表達式:
max(etcd_server_has_leader) != 1
9.4 EtcdBackendFsync
etcd io 監測,后端提交 延時。
表達式:
histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) by (instance, le)) > 100
9.5 EtcdWalFsync
etcd io 監測,文件同步到磁盤延時。
表達式:
histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) by (instance, le)) > 100
9.6 EtcdDbSize
檢測數據庫大小。
表達式:
etcd_debugging_mvcc_db_total_size_in_bytes/1024/1024 > 1024
9.7 EtcdGrpc
Grpc 調用速率。表達式:
sum(rate(grpc_server_handled_total{grpc_type="unary"}[1m])) > 100
10. CoreDNS 相關
10.1 DnsRequest
DNS 查詢速率,每分鍾查詢超過100告警。
表達式:
sum(irate(coredns_dns_request_count_total{zone !="dropped"}[1m])) > 100
相關指標:
- coredns_dns_request_count_total:總查詢數
10.2 DnsRequestFaild
異常查詢,異常狀態碼,不是 NOERROR。
表達式:
irate(coredns_dns_response_rcode_count_total{rcode!="NOERROR"} [1m]) > 0
相關指標:
- coredns_dns_response_rcode_count_total:查詢返回狀態碼
DNS-Rcode:
DNS-Rcode 作為 DNS 應答報文中有效的字段,主要用來說明 DNS 應答狀態,是排查。通常常見的 Rcode 值如下:
- Rcode 值為0,對應的 DNS 應答狀態為 NOERROR,意思是成功的響應,即這個域名解析是成功
- Rcode 值為2,對應的 DNS 應答狀態為 SERVFAIL,意思是服務器失敗,也就是這個域名的權威服務器拒絕響應或者響應 REFUSE,遞歸服務器返回 Rcode 值為 2 給 CLIENT
- Rcode 值為3,對應的 DNS 應答狀態為 NXDOMAIN,意思是不存在的記錄,也就是這個具體的域名在權威服務器中並不存在
- Rcode 值為5,對應的 DNS 應答狀態為 REFUSE,意思是拒絕,也就是這個請求源IP不在服務的范圍內
10.3 DnsPanic
DNS 恐慌值,可能收到攻擊。
表達式:
irate(coredns_panic_count_total[1m]) > 100
其他:
PrometheusOutOfOrderTimestamps Prometheus丟棄帶有亂序時間戳的樣本,可清理
PrometheuRuleFailures prometheus規則解析失敗,查看是否存在錯誤的規則配置,清理:kube-prometheus-stack-kubelet svc
etcdHighNumberOfFailedGRPCRequests 不操作,當前的etcd-rule規則配置異常,grpc_method!=""Watch"",grpc_service!=""etcdserverpb.Watch"""
參考鏈接
- https://my.oschina.net/54188zz/blog/4305978
- https://github.com/coreos/kube-prometheus
- https://github.com/kubernetes-monitoring/kubernetes-mixin
- https://monitoring.mixins.dev/prometheus-operator/
- https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.7/html/release_notes/ocp-4-7-monitoring
- https://metal-k8s.readthedocs.io/en/latest/operation/cluster_monitoring/prometheus.html