一、介绍
Kubernetes 系统的可观测性方案包括指标、日志、链路追踪、K8s Event 事件、NPD 框架等方式。
二、指标(Metrics)
Prometheus 是业界指标类数据采集方案的事实标准,是开源的系统监测和报警框架。
Prometheus 具有以下特性:
- 多维的数据模型(基于时间序列的 Key、Value 键值对)
- 灵活的查询和聚合语言 PromQL
- 通过基于 HTTP 的 Pull模型采集或利用 Pushgateway实现 Push 模式
- 可通过动态服务发现或静态配置发现目标机器
- 支持多种图表和数据大盘
Prometheus 可以周期性采集组件暴露在 HTTP(s) 端点的/metrics 下面的指标数据,并存储到 TSDB,实现基于 PromQL 的查询和聚合功能。
三、K8S指标:容器基础资源指标
采集源为 kubelet 内置的 cAdvisor,提供容器内存、CPU、网络、文件系统等相关的指标,指标样例包括:
容器当前内存使用字节数 container_memory_usage_bytes;
容器网络接收字节数 container_network_receive_bytes_total;
容器网络发送字节数 container_network_transmit_bytes_total,等等。
四、K8S指标:节点资源指标
采集源为 node_exporter,提供节点系统和硬件相关的指标,指标样例包括:节点总内存 node_memory_MemTotal_bytes,节点文件系统空间 node_filesystem_size_bytes,节点网络接口 ID node_network_iface_id,等等。基于该类指标,可以统计节点的 CPU/内存/磁盘使用率等节点级别指标。
针对node_exporter,我们是单独部署了一个prometheus采集,专门给管理员他们看的,业务部关系node
五、K8S指标:资源指标
采集源为 kube-state-metrics,基于 Kubernetes API 对象生成指标,提供 K8s 集群资源指标,例如 Node、ConfigMap、Deployment、DaemonSet 等类型。以 Node 类型指标为例,包括节点 Ready 状态指标 kube_node_status_condition、节点信息kube_node_info 等等。
六、K8S指标:组件指标
1、Kubernetes 系统组件指标
例如 kube-controller-manager, kube-apiserver,kube-scheduler, kubelet,kube-proxy、coredns 等。
2、Kubernetes 运维组件指标。
可观测类包括 blackbox_operator, 实现对用户自定义的探活规则定义;gpu_exporter,实现对 GPU 资源的透出能力。
3、Kubernetes 业务应用指标。
包括具体的业务Pod在/metrics 路径透出的指标,以便外部进行查询和聚合。
除了上述指标,K8s 提供了通过 API 方式对外透出指标的监测接口标准,具体包括 Resource Metrics,Custom Metrics 和 External Metrics 三类。
十、Pod异常排查
1、Pod 状态异常
就绪失败,即 Pod 一直无法到达 Ready 状态,无法接收请求进行业务处理,常见的根因如下:
- 资源不足,无法调度(Pending),即集群的 Node 没有预留资源能够满足 Pod 的 Request 资源。
- 镜像拉取失败( ImagePullBackoff ),镜像的仓库地址,tag 出现问题。
- 磁盘挂载失败(Pending),容器挂载的 PVC 没有 bound。
- Liveless probe 探针失败,频繁重启。
- Readiness probe 探针失败,无法达到 Ready 状态。
- postStart 执行失败,一直无法进入运行状态。
- 运行时程序崩溃( CrashLoopBackOff ),频繁重启。
- 配置错误,比如挂载的 Volume 不存在(RunContainerError)。
2、容器频繁重启
报告期内出现 Pod 频繁重启现象,常见的根因如下:
- 程序异常退出,比如非法地址访问,比如进入了程序需要退出的条件等。
- 容器内存使用量超过内存 Limit 量,被 OOMKilled。
3、Pod 相关服务状态异常
具体体现在 Pod 服务的请求错误率变高或者请求处理 P95 响应时间高等,常见的根因如下:
- 请求量突增,程序自身可能触发流控或者其他异常处理,导致请求处理失败率提升;
- 自身代码处理错误,请求量没有变化,可能是上线新的功能有 bug;
- 不可压缩资源不足(磁盘,内存),请求处理包含磁盘的写操作,资源不足出现失败;外部依赖服务报错,请求处理需要调用下游服务,他们报错引发请求处理失败。
- 外部依赖服务响应时间高,请求处理需要调用下游服务,他们的响应时间高会导致请求处理慢。
4、Pod 内存使用率过高
Pod 容器出现内存 OOM,Pod 频繁重启,常见的根因如下:
- 自身代码内存泄露;
- Pod 内存 Request 值偏低,如果该值偏低的情况下配置 HPA,会频繁触发扩容,同时具有被驱逐的风险。
- Pod 内存 Limit 值偏低,容器内存使用量超过 Limit 值会被 OOMKilled 掉。
5、Pod CPU使用率过高
Pod 的整体 CPU 使用率一直维持在超过 80% 的状态,常见的根因如下:
- 自身代码效率不足,业务处理的时间复杂度太高,需要找到热点方法进行优化;
- Pod CPU Request 值偏低,如果该值偏低的情况下配置 HPA,会频发触发扩容,同时具有被驱逐的风险。