暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes 主机和容器监控

k8s技术圈 2023-05-17
739

一. 系统介绍

一套云原生推荐的,开源的K8S监控系统,涵盖主机 容器 网络 等资源监控

二. 架构介绍

三. 组件介绍

1. node-exporter

1. prometheus的exporter,收集Node级别的监控数据

2. Prometheus Server

1. 主要用于存储监控数据,server去exporter拉取监控数据并进行存储

2. 根据告警规则产生告警并发送给Alertmanager

3. 通过PromQL查看监控数据

3. Exporters/Job

1. 监控指标数据采集组件,如node_exporter redis_exporter mongo_exporter等

2. 负责收集目标对象的性能数据,如主机,容器等

3. 提供http接口供Prometheus Server提取监控数据

4. Short-lived jobs

瞬时任务的场景,无法通过pull方式拉取,需要使用push方式,与PushGateway搭配使用

5. PushGateway

特殊场景监控数据中转站,此组件收到监控数据后由prometheus server进行拉取存储

6. Alertmanager

实现告警功能,Prometheus server会将告警信息发送到此组件,Alertmanager则根据告警配置方式处理告警信息,如: 邮件 webhook等

7. Service Discovery

prometheus自身服务发现机制

Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes、OpenStack、EC2等等。基于服务发现的过程是通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮训这些Target获取监控数据

8. Prometheus Operator

够帮助用户自动化的创建以及管理Prometheus Server以及其相应的配置

1. 管理ServiceMonitor监控配置 [servicemonitors.monitoring.coreos.com]   通过serviceMonitorSelector关联

2. 管理PrometheusRule告警配置 [prometheusrules.monitoring.coreos.com]   通过ruleSelector关联

3. 创建和管理Alertmanager实例 [alertmanagers.monitoring.coreos.com] 管理alertmanager  通过alerting指定Alertmanager 服务发现与prometheuse进行关联

4. 创建和管理Prometheus Server实例 [prometheuses.monitoring.coreos.com] 管理prometheuse

8.1 管理PrometheusRule告警配置

告警规则有类型为Prometheus的资源类型管理,通过如下字段进行关联,以我们要想自定义一个报警规则,只需要创建一个能够被 prometheus 对象匹配的 

PrometheusRule 对象即可, 创建后Prometheus Operator会自动将告警规则写入到configmap作为prometheus的告警规则

ruleSelector:  matchLabels:    prometheus: k8s    role: alert-rules kubectl get cm -n monitoring --show-labels

8.2 管理 Prometheus 配置文件

Secret资源类型: prometheus.yaml.gz

此文件为gzip文件,被base64进行加密存储到Secret 该secret由operator维护

Prometheus会每隔3min监听一次此文件变化,然后将其gunzip再写入到prometheus-env.yaml,给prometheus使用

Operator定期监控查询ServiceMonitor,ls定义了各种各样的service 也就是被监控的对象,也是最终出现在 Prometheus的Target 列表的内

主要工作原理架构图

9. ServiceMonitor

运维过程可能会时常修改监控配置项,通过ServiceMonitor自动化管理prometheus配置

ServiceMonitor 也是一个自定义资源,它描述了一组被 Prometheus 监控的 targets 列表。该资源通过 Labels 来选取对应的 Service Endpoint,让 Prometheus Server 通过选取的 Service 来获取 Metrics 信息。

10. Prometheus-adapter

聚合指标数据进apiserver

Custom Metrics(自定义指标)

提供API custom.metrics.k8s.io

11. Kube-state-metrics

将prometheus中可以用PromQL查询到的指标数据转换成k8s对应的数据

四. 工作流程

  1. Prometheus server定期从配置好的 jobs 或者exporters中拉metrics,或者接收来自Pushgateway发过来的metrics,或者从其他的Prometheus server中拉 metrics;

  2. Prometheus server将收集到的metrics数据存储到本地,并运行已定义好的alert.rules,记录新的时间序列或者向Alertmanager推送警报;

  3. Alertmanager根据配置文件,对接收到的警报进行处理,发出告警;

  4. 对采集的数据进行可视化展示

FAQ

ServiceMonitor既然是Operator架构里面的东西,那他是如何和Prometheus进行关联应用的呢?

Prometheus与ServiceMonitor之间的关联关系使用serviceMonitorSelector定义,因此需要让prometheus关联上ServiceMonitor,需要在Pormtheus定义中使用serviceMonitorSelector

apiVersion: v1 items: - apiVersion: monitoring.coreos.com/v1  kind: Prometheus  metadata:    labels:      prometheus: k8s    name: k8s    namespace: monitoring  spec:    alerting:      alertmanagers:      - name: alertmanager-main        namespace: monitoring        port: web    baseImage: quay.io/prometheus/prometheus    externalLabels:      cluster: tjheywa    nodeSelector:      kubernetes.io/os: linux    podMonitorSelector: {}    replicas: 2    serviceAccountName: prometheus-k8s    serviceMonitorNamespaceSelector: {}  #关联的Namespace    serviceMonitorSelector: {}   #使用此配置.关联所有也可增加matchLabels进行关联

对于用户而言,可能还是希望能够手动管理Prometheus配置文件,而非通过Prometheus Operator自动完成,此时如何应对?

当用户创建的Prometheus中关联ServiceMonitor这类会影响配置文件内容的定义时,Promethues Operator会自动管理。而如果Prometheus定义中不包含任何与配置相关的定义,那么Secret的管理权限就落到了用户自己手中

Secret资源类型: prometheus.yaml.gz

此文件为gzip文件,被base64进行加密存储到Secret 该secret由operator维护

Prometheus会每隔3min监听一次此文件变化,然后将其gunzip再写入到prometheus-env.yaml,给prometheus使用

五. Kubernetes监控指标

1. 资源和利用率指标

指标

名称

描述

CPU使用率

usageNanoCores

节[[点或Pod每秒使用的CPU核数。

CPU容量

capacity_cpu

节点上可用的CPU内核数量(不适用于Pod)。

内存使用情况

used{resource:memory,units:bytes}

节点或Pod使用的内存量(以字节为单位)。

内存容量

capacity_memory{units:bytes}

节点可用的内存容量(不适用于Pod),以字节为单位。

网络流量

rx{resource:network,units:bytes} tx{resource:network,units:bytes}

节点(或Pod)看到的总网络流量(已接收(传入)流量和已传输(传出)流量),以字节为单位。

2. 状态指标

主要由kube-state-metrics 提供

指标

名称


描述

是否已有

节点状态

kube_node_status_condition {status:true,condition:OutOfDisk| MemoryPressure|PIDPressure| DiskPressure|NetworkUnavailable}


当status为true时,指示该节点当前正在经历该条件。


循环崩溃(Crash Loops)

kube_pod_container_status_waiting_reason {reason:CrashLoopBackOff}


指示pod中的容器是否正在发生循环崩溃。


任务状态(失败)

kube_job_status_failed


指示任务是否失败。


持久卷状态(失败)

kube_persistentvolume_status _phase {phase:Failed}


指示持久卷是否失败。


Pod状态(Pending)

kube_pod_status_phase{phase:Pending}


指示Pod是否处于挂起状态。


Deployment

kube_deployment_metadata _generation


代表Deployment的序列号。


Deployment

kube_deployment_status_observed_generation


代表控制器观察到的当前Deployment生成的序列号。


DaemonSet期望的节点数

kube_daemonset_status_ desired_number_scheduled


DaemonSet期望的节点数。


DaemonSet当前的节点数

kube_daemonset_status_ current_number_scheduled


DaemonSet运行中的节点数。


期望的StatefulSet副本

kube_statefulset_status_replicas


每个StatefulSet期望的副本数。


准备就绪的StatefulSet副本

kube_statefulset_status_replicas _ready


每个StatefulSet准备好的副本数。


3. 系统组件各项指标

指标

名称

描述



etcd集群是否有leader

etcd_server_has_leader

指示该成员是否知道其leader是谁。



etcd集群中leader变动总数

etcd_server_leader_changes_ seen_total

etcd集群中leader变更总数。



API延迟数

apiserver_request_latencies_count

API请求总数;用于计算每个请求的平均延迟。



API延迟总和

apiserver_request_latencies_sum

所有API请求持续时间的总和;用于计算每个请求的平均延迟。



队列等待时间

workqueue_queue_duration_ seconds

每个控制器管理器中的工作队列等待所花费的总时间。



队列持续时间

workqueue_work_duration_ seconds

每个控制器管理器中的工作队列处理操作所花费的总时间。



调度失败Pod的总尝试次数

scheduler_schedule_attempts _total {result:unschedulable}

调度程序尝试在节点上调度失败了Pod的总尝试次数。



Pod调度延迟

scheduler_e2e_scheduling_ delay_microseconds(<v1.14) 或="" scheduler_e2e_scheduling_="" duration_seconds<="" span="">

将Pod调度到节点上所花费的总时间。



4. 高频重要告警规则

报警名称

表达式

报警触发条件

是否已存在

CPUThrottlingHigh

100 * sum by(container, pod, namespace) (increase(container_cpu_cfs_throttled_periods_total{container!=""}[5m])) sum by(container, pod, namespace) (increase(container_cpu_cfs_periods_total[5m])) > 25

Pod的CPU使用率大于75%


PodMemory80

sum(container_memory_working_set_bytes{image!=""}) by(pod, namespace)

sum(container_spec_memory_limit_bytes{image!=""}) by(pod, namespace) * 100 != +inf > 80

Pod的MEM使用率大于80%。


KubeCPUOvercommit

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)

集群 CPU 过度使用。CPU 已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的 CPU 总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配


KubeMemOvercommit

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)

集群内存过度使用。内存已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的内存总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配


ClusterAllocatableMemoryLack

sum(sum by(node) (kube_pod_container_resource_requests_memory_bytes) * on(node) kube_node_labels{label_dedicated="",label_kubernetes_io_role="node"}) sum(kube_node_status_allocatable_memory_bytes * on(node) kube_node_labels{label_dedicated="",label_kubernetes_io_role="node"}) * 100 > 80

集群可调度内存资源短缺


ClusterAllocatableCpuLack

sum(sum

 by(node) (kube_pod_container_resource_requests_cpu_cores) * on(node) kube_node_labels{label_dedicated="",label_kubernetes_io_role="node"})

 / sum(kube_node_status_allocatable_cpu_cores * on(node) kube_node_labels{label_dedicated="",label_kubernetes_io_role="node"})

 * 100 > 90

集群可调度 CPU 资源短缺


NodeMemoryTooHigh

100 - (node_memory_MemAvailable_bytes{job="node-exporter"} node_memory_MemTotal_bytes{job="node-exporter"} * 100) > 85

节点内存使用率高于85%


NodeLoad1TooHigh

(node_load1{job="node-exporter"} * on(namespace, pod) group_left(node) node_namespace_pod:kube_pod_info:) on(node) node:node_num_cpu:sum > 2

节点负载较高


KubeletTooManyPods

kubelet_running_pod_count{job="kubelet"} > 180 * 0.9

节点Pod过多


KubernetesContainerOomKiller

 (kube_pod_container_status_restarts_total - kube_pod_container_status_restarts_total offset 10m >= 1) and ignoring (reason) min_over_time(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}[10m]) == 1

最近10分钟发生OOM的Pod


KubeStatefulSetUpdateNotRolledOut

(

         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

       )

StatefulSet  更新失败且未回滚,对比版本号和副本数


KubePodCrashLooping

rate(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[5m]) * 60 * 5 > 0

Pod 重启时间,重启时间超过5m


KubePodNotReady

sum by(namespace, pod) (kube_pod_status_phase{job="kube-state-metrics",phase=~"Failed|Pending|Unknown"}) > 0

容器组未就绪


KubeStatefulSetReplicasMismatch

kube_statefulset_status_replicas_ready{job="kube-state-metrics"} != kube_statefulset_status_replicas{job="kube-state-metrics"}

监测 StatefulSet 副本是否达到预期


KubeDaemonSetRolloutStuck

kube_daemonset_status_number_ready{job="kube-state-metrics"} kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} * 100 < 100

监测 DaemonSet 是否处于就绪状态


NodeExporterDown

ALERTS{alertname="NodeExporterDown"}

NodeExporter未就绪


NodeDiskRunningFull

(node:node_filesystem_usage: > 0.85) and (predict_linear(node:node_filesystem_avail:[6h], 3600 * 24) < 0)

磁盘使用率大于85%,将在24小时用满






KubeletDown

absent(up{job="kubelet"}

== 1)

KubeletDown


KubeAPIDown

absent(up{job="apiserver"} == 1)

APIserver 失联,监控 APIServer 服务,失联原因可能是服务 down 还可能是网络出现状况


KubeControllerManagerDown

absent(up{job="kube-controller-manager"} == 1)

监测 KubeControllerManager 服务,Down 或者网络不通


KubeAPIErrorsHigh

sum(rate(apiserver_request_total{code=~"^(?:5..)$",job="apiserver"}[5m])) sum(rate(apiserver_request_total{job="apiserver"}[5m])) * 100 > 3

Apiserver 收到的请求错误率较高


KubeNodeNotReady

kube_node_status_condition{condition="Ready",job="kube-state-metrics",status="true"} == 0

节点是否处于就绪状态。检测节点是否为就绪状态


KubeNodeUnreachable

kube_node_spec_unschedulable{job="kube-state-metrics"} == 1

节点状态为 Unreachable

KubeNodeReadinessFlapping

sum(changes(kube_node_status_condition{status="true",condition="Ready"}[15m])) by (node) > 2

监测集群状态,查看集群内节点状态改变的频率

Etcdlived

up{job="etcd-k8s"} < 1

etcd 存活检测

EtcdCluseterUnavailable

count(up{job="etcd-k8s"} == 0) > (count(up{job="etcd-k8s"}) 2 - 1)

etcd 集群健康检查,down 数量大于集群可允许故障数量

EtcdLeaderCheck

etcd_server_has_leader{job=~".*etcd.*"} == 0

检查Etcd是否有leader

EtcdBackendFsync

histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) by (instance, le)) > 100

etcd io 监测,后端提交 延时大于100


rate(etcd_server_leader_changes_seen_total{job=~".*etcd.*"}[15m]) > 3



EtcdWalFsync

histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) by (instance, le)) > 100

etcd io 监测,文件同步到磁盘延时

DnsRequest

sum(irate(coredns_dns_request_count_total{zone !="dropped"}[1m])) > 100

DNS 查询速率,每分钟查询超过100告警

CoreDNSErrorsHigh

sum(rate(coredns_dns_responses_total{job="kube-dns",rcode="SERVFAIL"}[5m]))

   

  sum(rate(coredns_dns_responses_total{job="kube-dns"}[5m])) > 0.01

异常查询,异常状态码,不是 NOERROR

CoreDNSDown

absent(up{job="kube-dns"}

== 1)

CoreDNSDown


CoreDNSLatencyHigh

histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{job="kube-dns"}[5m])) by(server, zone, le)) > 4

DNS延迟高过高


NginxHighHttp4xxErrorRate

sum(rate(nginx_ingress_controller_requests{status=~"4.."}[1m])) sum(rate(nginx_ingress_controller_requests[1m])) * 100 > 5

Nginx 高 HTTP 4xx 错误率(实例 {{ $labels.instance }})


NginxHighHttp5xxErrorRate

sum(rate(nginx_ingress_controller_requests{status=~"^5.."}[1m])) sum(rate(nginx_ingress_controller_requests[1m])) * 100 > 5

Nginx 高 HTTP 5xx 错误率(实例 {{ $labels.instance }})


NginxLatencyHigh

histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket[30m])) by (host, node)) > 10

Nginx 延迟高(实例 {{ $labels.instance }})






5. 其他告警规则

报警名称

表达式

采集数据时间(分钟)

报警触发条件

是否已存在

KubeStateMetricsListErrors

(sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m])) sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m]))) > 0.01

15

Metric List出错。

KubeStateMetricsWatchErrors

(sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics",result="error"}[5m])) sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics"}[5m]))) > 0.01

15

Metric Watch出错。

NodeFilesystemAlmostOutOfSpace

( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 5 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 )

60

Node文件系统即将无空间。


NodeFilesystemSpaceFillingUp

( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 40 and predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 )

60

Node文件系统空间即将占满。


NodeFilesystemFilesFillingUp

( node_filesystem_files_free{job="node-exporter",fstype!=""} node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 40 and predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 )

60

Node文件系统文件即将占满。


NodeFilesystemAlmostOutOfFiles

( node_filesystem_files_free{job="node-exporter",fstype!=""} node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 3 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 )

60

Node文件系统几乎无文件。


NodeNetworkReceiveErrs

increase(node_network_receive_errs_total[2m]) > 10

60

Node网络接收错误。


NodeNetworkTransmitErrs

increase(node_network_transmit_errs_total[2m]) > 10

60

Node网络传输错误。


NodeHighNumberConntrackEntriesUsed

(node_nf_conntrack_entries node_nf_conntrack_entries_limit) > 0.75

使用大量Conntrack条目。


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 )

10

出现时间偏差。


NodeClockNotSynchronising

min_over_time(node_timex_sync_status[5m]) == 0

10

出现时间不同步。


KubePodCrashLooping

rate(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[15m]) * 60 * 5 > 0

15

出现循环崩溃。


KubePodNotReady

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

15

Pod未准备好。


KubeDeploymentGenerationMismatch

kube_deployment_status_observed_generation{job="kube-state-metrics"} != kube_deployment_metadata_generation{job="kube-state-metrics"}

15

出现部署版本不匹配。


KubeDeploymentReplicasMismatch

( 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"}[5m]) == 0 )

15

出现部署副本不匹配。


KubeStatefulSetReplicasMismatch

( 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 )

15

状态集副本不匹配。


KubeStatefulSetGenerationMismatch

kube_statefulset_status_observed_generation{job="kube-state-metrics"} != kube_statefulset_metadata_generation{job="kube-state-metrics"}

15

状态集版本不匹配。


KubeStatefulSetUpdateNotRolledOut

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"} )

15

状态集更新未退出。


KubeDaemonSetRolloutStuck

kube_daemonset_status_number_ready{job="kube-state-metrics"} kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} < 1.00

15

DaemonSet退出回退。


KubeContainerWaiting

sum by (namespace, pod, container) (kube_pod_container_status_waiting_reason{job="kube-state-metrics"}) > 0

60

容器等待。


KubeDaemonSetNotScheduled

kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} - kube_daemonset_status_current_number_scheduled{job="kube-state-metrics"} > 0

10

DaemonSet无计划。


KubeDaemonSetMisScheduled

kube_daemonset_status_number_misscheduled{job="kube-state-metrics"} > 0

15

Daemon缺失计划。


KubeCronJobRunning

time() - kube_cronjob_next_schedule_time{job="kube-state-metrics"} > 3600

60

若Cron任务完成时间大于1小。


KubeJobCompletion

kube_job_spec_completions{job="kube-state-metrics"} - kube_job_status_succeeded{job="kube-state-metrics"} > 0

60

任务完成。


KubeJobFailed

kube_job_failed{job="kube-state-metrics"} > 0

15

任务失败。


KubeHpaReplicasMismatch

(kube_hpa_status_desired_replicas{job="kube-state-metrics"} != kube_hpa_status_current_replicas{job="kube-state-metrics"}) and changes(kube_hpa_status_current_replicas[15m]) == 0

15

HPA副本不匹配。


KubeHpaMaxedOut

kube_hpa_status_current_replicas{job="kube-state-metrics"} == kube_hpa_spec_max_replicas{job="kube-state-metrics"}

15

HPA副本超过最大值。


KubeCPUOvercommit

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)

5

CPU过载。


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)

5

存储过载。


KubeCPUQuotaOvercommit

sum(kube_resourcequota{job="kube-state-metrics", type="hard", resource="cpu"}) sum(kube_node_status_allocatable_cpu_cores) > 1.5

5

CPU额度过载。

无该指标

KubeMemoryQuotaOvercommit

sum(kube_resourcequota{job="kube-state-metrics", type="hard", resource="memory"}) sum(kube_node_status_allocatable_memory_bytes{job="node-exporter"}) > 1.5

5

存储额度过载。


KubeQuotaExceeded

kube_resourcequota{job="kube-state-metrics", type="used"} ignoring(instance, job, type) (kube_resourcequota{job="kube-state-metrics", type="hard"} > 0) > 0.90

15

若配额超过限制。


CPUThrottlingHigh

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 )

15

CPU过热。


KubePersistentVolumeFillingUp

kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"} / kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"} < 0.03

1

存储卷容量即将不足。


KubePersistentVolumeErrors

kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"} > 0

5

存储卷容量出错。


KubeVersionMismatch

count(count by (gitVersion) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"gitVersion","$1","gitVersion","(v[0-9]*.[0-9]*.[0-9]*).*"))) > 1

15

版本不匹配。


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

15

客户端出错。


KubeAPIErrorBudgetBurn

sum(apiserver_request:burnrate1h) > (14.40 * 0.01000) and sum(apiserver_request:burnrate5m) > (14.40 * 0.01000)

2

API错误过多。


KubeAPILatencyHigh

( cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} > on (verb) group_left() ( avg by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) + 2*stddev by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) ) ) > on (verb) group_left() 1.2 * avg by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) and on (verb,resource) cluster_quantile:apiserver_request_duration_seconds:histogram_quantile{job="apiserver",quantile="0.99"} > 1

5

API延迟过高。


KubeAPIErrorsHigh

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

10

API错误过多。


KubeClientCertificateExpiration

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

客户端认证过期。


AggregatedAPIErrors

sum by(name, namespace)(increase(aggregator_unavailable_apiservice_count[5m])) > 2

聚合API出错。


AggregatedAPIDown

sum by(name, namespace)(sum_over_time(aggregator_unavailable_apiservice[5m])) > 0

5

聚合API下线。


KubeAPIDown

absent(up{job="apiserver"} == 1)

15

API下线。


KubeNodeNotReady

kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0

15

Node未准备好。


KubeNodeUnreachable

kube_node_spec_taint{job="kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} == 1

2

Node无法获取。


KubeletTooManyPods

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

15

Pod过多。


KubeNodeReadinessFlapping

sum(changes(kube_node_status_condition{status="true",condition="Ready"}[15m])) by (node) > 2

15

准备状态变更次数过多。


KubeletPlegDurationHigh

node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile{quantile="0.99"} >= 10

5

PLEG持续时间过长。


KubeletPodStartUpLatencyHigh

histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{job="kubelet", metrics_path="/metrics"}[5m])) by (instance, le)) * on(instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"} > 60

15

Pod启动延迟过高。


KubeletDown

absent(up{job="kubelet", metrics_path="/metrics"} == 1)

15

Kubelet下线。


KubeSchedulerDown

absent(up{job="kube-scheduler"} == 1)

15

Kube-scheduler日程下线。


KubeControllerManagerDown

absent(up{job="kube-controller-manager"} == 1)

15

Controller Manager下线。


TargetDown

100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job, namespace, service)) > 10

10

目标下线。


NodeNetworkInterfaceFlapping

changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2

2

网络接口状态变更过频繁。


报警名称

表达式

采集数据时间(分钟)

报警触发条件

是否已存在

PodCpu75

100 * (sum(rate(container_cpu_usage_seconds_total[1m])) by (pod_name) / sum(label_replace(kube_pod_container_resource_limits_cpu_cores, "pod_name", "$1", "pod", "(.*)")) by (pod_name))>75

7

Pod的CPU使用率大于75%。


PodMemory75

100 * (sum(container_memory_working_set_bytes) by (pod_name) / sum(label_replace(kube_pod_container_resource_limits_memory_bytes, "pod_name", "$1", "pod", "(.*)")) by (pod_name))>75

5

Pod的内存使用率大于75%。


pod_status_no_running

sum (kube_pod_status_phase{phase!="Running"}) by (pod,phase)

5

Pod的状态为未运行。


PodMem4GbRestart

(sum (container_memory_working_set_bytes{id!="/"})by (pod_name,container_name) /1024/1024/1024)>4

5

Pod的内存大于4GB。


PodRestart

sum (increase (kube_pod_container_status_restarts_total{}[2m])) by (namespace,pod) >0

5

Pod重启。


六. SLA 指标逻辑

创建deployment

检测pod运行状态是否running

暴露服务

创建ingress

curl判断http_code是否等于200



文章转载自k8s技术圈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论