Skip to content

K8s监控基础

Kubernetes 监控和传统主机监控不一样。传统主机监控通常围绕 CPU、内存、磁盘、网络展开;K8s 还要关心控制平面、节点组件、Pod、容器、Workload、Service、PVC、事件和业务指标。

Kubernetes 监控面向集群资源和控制面状态,采集对象从单台 Linux 主机扩展到 Node、Pod、Workload、kubelet、cAdvisor、kube-state-metrics、CoreDNS 和 API Server。K3s 集群的搭建见 K3s 安装部署。一个 Pod 没有起来,可能是镜像拉取失败、调度失败、PVC 没绑定、探针失败、节点压力、NetworkPolicy 拦截,也可能是应用自己启动失败。

指标链路要覆盖三类问题:

问题指标来源
集群和节点是否健康API Server、kubelet、node-exporter、CoreDNS
资源对象是否达到期望状态kube-state-metrics
容器和业务是否运行正常kubelet/cAdvisor、应用 /metrics

一、指标来源

K8s 里常见指标来源如下:

来源典型指标说明
API Server请求量、延迟、错误码控制平面入口
kubeletPod 生命周期、volume、probe、容器资源每台节点上的节点代理
cAdvisor容器 CPU、内存、网络、文件系统kubelet 内置容器指标
node-exporter主机 CPU、内存、磁盘、网络、文件描述符Linux 主机层
kube-state-metricsPod、Deployment、PVC、Job 等对象状态反映 apiserver 里的对象状态
CoreDNSDNS 请求量、错误、延迟集群服务发现
应用 /metricsQPS、错误率、延迟、业务指标应用自己暴露
etcdleader、proposal、fsync、DB size控制平面数据存储

当前 K3s 是默认 SQLite,etcd 指标不在这套集群里采集。etcd 监控需要切到 embedded etcd 场景单独记录。

二、节点指标和对象指标

节点指标说明机器资源,来自 node-exporter 和 kubelet/cAdvisor。比如:

promql
# 三台节点是否都被 node-exporter 采到
count(node_uname_info)

# 节点内存可用比例
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes

# 容器 CPU 使用
sum by (namespace, pod, container) (
  rate(container_cpu_usage_seconds_total{container!="", image!=""}[5m])
)

对象指标说明 Kubernetes 资源当前状态,来自 kube-state-metrics。比如:

promql
# Pod 信息数量
count(kube_pod_info)

# Deployment 可用副本和期望副本
kube_deployment_status_replicas_available
kube_deployment_spec_replicas

# Pod 重启次数
increase(kube_pod_container_status_restarts_total[15m])

节点 CPU 高和 Deployment 副本不足不是同一类问题。前者偏资源压力,后者偏对象状态。排查时经常两边一起看:节点是否有压力,Pod 是否被调度,容器是否启动,Workload 是否达到期望副本数。

三、kube-state-metrics 的作用

kube-state-metrics 不采集容器 CPU、内存,它读取 Kubernetes API 里的对象状态,再转成 Prometheus 指标。它更像是把 kubectl get 看到的对象状态变成时间序列。

典型指标:

指标含义
kube_pod_status_phasePod 当前阶段
kube_pod_container_status_restarts_total容器重启次数
kube_deployment_spec_replicasDeployment 期望副本
kube_deployment_status_replicas_availableDeployment 可用副本
kube_persistentvolumeclaim_status_phasePVC 状态
kube_node_status_conditionNode condition

Pod Pending、Deployment 副本不足、PVC 一直 Pending、Job 失败这类问题,都要看 kube-state-metrics。

四、kubelet 和 cAdvisor

kubelet 暴露多个 metrics 路径:

路径内容
/metricskubelet 自身指标
/metrics/cadvisor容器资源指标
/metrics/probes探针相关指标

kube-prometheus-stack 里通常会为 kubelet 生成多组 target。本次部署里三台节点的 kubelet、cAdvisor 和 probes target 都是 UP

容器资源常用查询:

promql
# 按 Pod 汇总 CPU
sum by (namespace, pod) (
  rate(container_cpu_usage_seconds_total{container!="", image!=""}[5m])
)

# 按 Pod 汇总内存 working set
sum by (namespace, pod) (
  container_memory_working_set_bytes{container!="", image!=""}
)

# 容器文件系统使用
container_fs_usage_bytes{container!="", image!=""}

kubectl top 也来自 metrics-server,但它更像现场快照。Prometheus 适合看趋势、设置告警、关联看板。

五、控制平面指标

控制平面至少关注 API Server 和 CoreDNS。K3s 单 server 环境里,API Server 通过 6443 暴露,Prometheus 可以抓到 apiserver_request_total 这类指标。Scheduler 和 Controller Manager 在 K3s 里被打包在 k3s server 进程中,默认监听回环地址,采集方式和 kubeadm 静态 Pod 不完全一样。

API Server 常用查询:

promql
# API Server 请求量
sum by (verb, resource, code) (
  rate(apiserver_request_total[5m])
)

# 5xx 请求
sum by (resource, verb) (
  rate(apiserver_request_total{code=~"5.."}[5m])
)

# 请求延迟 P99
histogram_quantile(
  0.99,
  sum by (le, verb, resource) (
    rate(apiserver_request_duration_seconds_bucket[5m])
  )
)

CoreDNS 常用查询:

promql
# DNS 请求量
sum(rate(coredns_dns_requests_total[5m]))

# DNS 响应码
sum by (rcode) (
  rate(coredns_dns_responses_total[5m])
)

六、应用指标

应用指标通常由业务服务自己暴露 /metrics,再用 ServiceMonitor 或 PodMonitor 接入。应用指标和平台指标要能通过 namespaceservicepodenv 这类标签关联。

常见业务指标:

指标说明
请求量QPS、接口调用次数
错误率5xx、业务错误码
延迟P50/P95/P99
队列长度异步任务积压
依赖状态数据库、缓存、外部 HTTP 调用

只看 Pod CPU 和内存不能说明应用是否健康。服务可能资源正常,但错误率已经升高;也可能 CPU 高是因为流量上来了,错误率和延迟仍然正常。

七、排查顺序

K8s 指标异常可以按这个顺序看:

层级检查点
Node节点 Ready、CPU、内存、磁盘、网络
kubeletkubelet target、容器资源、probe
WorkloadDeployment/StatefulSet 副本是否达到期望
Podphase、restart、waiting reason、OOM
Serviceendpoints 是否存在
控制平面API Server 延迟、错误、CoreDNS
应用QPS、错误率、P95/P99

Prometheus 的 Targets 页面是第一入口。target DOWN 时,先解决采集链路;target UP 但指标异常时,再进入 PromQL 和业务排查。