下面只给出了部分指标的解读
- 毕竟是免费的课程,如需了解更多请购买付费课,那里面会讲解的很详细。谢谢支持
- 课程链接:prometheus全组件配置使用、底层原理解析、高可用实战
- cpu 在Kubernetes中CPU属于可压缩资源,意思是pod中服务使用CPU超过设置的limits,pod不会被kill掉但会被限制。所以我们应该通过观察容器CPU被限制的情况来考虑是否将CPU的limit调大。
- 有这样的两个CPU指标,
container_``CPU``_cfs_periods_total
代表 container生命周期中度过的CPU周期总数,container_``CPU``_cfs_throttled_periods_total
代表container生命周期中度过的受限的CPU周期总数。 - 所以我们可以使用下面的表达式来查出最近5分钟,超过25%的CPU执行周期受到限制的container有哪些。
100 * sum by(container_name, pod_name, namespace) (increase(container_CPU_cfs_throttled_periods_total{container_name!=""}[5m]))
/ sum by(container_name, pod_name, namespace) (increase(container_CPU_cfs_periods_total[5m])) > 25
- 我们可以用下面的计算方式表示容器CPU使用率,其中
container_``CPU``_usage_seconds_total
代表CPU的计数器,container_spec_``CPU``_quota
是容器的CPU配额,它的值是容器指定的CPU个数*100000。
sum(rate(container_CPU_usage_seconds_total{image!=""}[1m])) by (container, pod) / (sum(container_spec_CPU_quota{image!=""}/100000) by (container, pod) )* 100
- 在Kubernetes中mem属于不可压缩资源,pod之间是无法共享的,完全独占的。所以一旦容器内存使用超过limits,会导致oom,然后重新调度。
container_memory_working_set_bytes
是容器真实使用的内存量, kubelet通过比较container_memory_working_set_bytes
和container_spec_memory_limit_bytes
来决定oom container。- 同时还有
container_memory_usage_bytes
用来表示容器使用内存,其中包含了很久没用的缓存,该值比container_memory_working_set_bytes
要大 - 所以内存使用率可以使用下面的公式计算
(container_memory_working_set_bytes/container_spec_memory_limit_bytes )*100
下面的表格中一系列指标描述容器的运行状态。
指标名 | 含义 | 标签举例 |
---|---|---|
kube_pod_status_phase | 容器当前的运行状态,非Running的都是异常的。 | Pending Succeeded Failed Running Unknown |
kube_pod_container_status_waiting | 容器处于waiting状态 | 值为1代表waiting |
kube_pod_container_status_waiting_reason | pod处于waiting状态原因 | ContainerCreating CrashLoopBackOff pod启动崩溃,再次启动然后再次崩溃 CreateContainerConfigError ErrImagePull ImagePullBackOff CreateContainerError InvalidImageName |
kube_pod_container_status_terminated | pod处于terminated状态 | 值为1代表terminated |
kube_pod_container_status_terminated_reason | pod处于terminated状态原因 | OOMKilled Completed Error ContainerCannotRun DeadlineExceeded Evicted |
kube_pod_container_status_restarts_total | pod中的容器重启次数 | - |
-
下面给出一些经常使用的告警。
-
比如查看下因为拉取镜像失败导致waiting的容器
kube_pod_container_status_waiting_reason{reason="ErrImagePull"}==1
-
查看下发生oom的容器
kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}==1
-
最近十分钟内有重启
(kube_pod_container_status_restarts_total - kube_pod_container_status_restarts_total offset 10m >= 1)
- 那么站在Kubernetes集群管理员的角度,也需要关心下node整体的资源情况。
指标名 | 含义 | 标签举例 |
---|---|---|
kube_node_status_condition | node节点的运行状态,非Ready都是异常 同时可以看到因为哪种资源压力导致的 |
condition: NetworkUnavailable MemoryPressure DiskPressure PIDPressure Ready |
kube_node_status_allocatable_CPU_cores | 节点可以分配CPU核数 | |
kube_node_status_allocatable_memory_bytes | 节点可以分配内存总量(单位:字节) | |
kube_node_spec_taint | 节点污点情况 |
-
下面给出一些经常使用的告警。
-
比如查看节点因为内存有压力不可用
kube_node_status_condition{condition="MemoryPressure",status="true"}==1
- dep 副本数不正常
kube_deployment_spec_replicas!= kube_deployment_status_replicas_available
- daemonset中不可用的数量 :
kube_daemonset_status_number_unavailable > 0
来表示 - 可以使用
kube_job_failed > 0
来表示失败的job - 在kube-state-metrics中还有很多其他对象的指标,你可以自行查阅使用。
延迟、请求qps、错误数、饱和度
- apiserver 错误率:
100 - 100 * sum(rate(apiserver_request_total{job="kubernetes-apiservers",code=~"2.."}[5m])) /sum(rate(apiserver_request_total{job="kubernetes-apiservers"}[5m]))
- apiserver 延迟:
histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{job="kubernetes-apiservers"}[5m])) by (verb, le))
- etcd存储空间使用率:
(etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes)*100
- 成功调度一个pod 的平均尝试次数:
scheduler_pod_scheduling_attempts_sum/scheduler_pod_scheduling_attempts_count
代表
各个业务自行决定即可。