Appearance
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 | 请求量、延迟、错误码 | 控制平面入口 |
| kubelet | Pod 生命周期、volume、probe、容器资源 | 每台节点上的节点代理 |
| cAdvisor | 容器 CPU、内存、网络、文件系统 | kubelet 内置容器指标 |
| node-exporter | 主机 CPU、内存、磁盘、网络、文件描述符 | Linux 主机层 |
| kube-state-metrics | Pod、Deployment、PVC、Job 等对象状态 | 反映 apiserver 里的对象状态 |
| CoreDNS | DNS 请求量、错误、延迟 | 集群服务发现 |
应用 /metrics | QPS、错误率、延迟、业务指标 | 应用自己暴露 |
| etcd | leader、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_phase | Pod 当前阶段 |
kube_pod_container_status_restarts_total | 容器重启次数 |
kube_deployment_spec_replicas | Deployment 期望副本 |
kube_deployment_status_replicas_available | Deployment 可用副本 |
kube_persistentvolumeclaim_status_phase | PVC 状态 |
kube_node_status_condition | Node condition |
Pod Pending、Deployment 副本不足、PVC 一直 Pending、Job 失败这类问题,都要看 kube-state-metrics。
四、kubelet 和 cAdvisor
kubelet 暴露多个 metrics 路径:
| 路径 | 内容 |
|---|---|
/metrics | kubelet 自身指标 |
/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 接入。应用指标和平台指标要能通过 namespace、service、pod、env 这类标签关联。
常见业务指标:
| 指标 | 说明 |
|---|---|
| 请求量 | QPS、接口调用次数 |
| 错误率 | 5xx、业务错误码 |
| 延迟 | P50/P95/P99 |
| 队列长度 | 异步任务积压 |
| 依赖状态 | 数据库、缓存、外部 HTTP 调用 |
只看 Pod CPU 和内存不能说明应用是否健康。服务可能资源正常,但错误率已经升高;也可能 CPU 高是因为流量上来了,错误率和延迟仍然正常。
七、排查顺序
K8s 指标异常可以按这个顺序看:
| 层级 | 检查点 |
|---|---|
| Node | 节点 Ready、CPU、内存、磁盘、网络 |
| kubelet | kubelet target、容器资源、probe |
| Workload | Deployment/StatefulSet 副本是否达到期望 |
| Pod | phase、restart、waiting reason、OOM |
| Service | endpoints 是否存在 |
| 控制平面 | API Server 延迟、错误、CoreDNS |
| 应用 | QPS、错误率、P95/P99 |
Prometheus 的 Targets 页面是第一入口。target DOWN 时,先解决采集链路;target UP 但指标异常时,再进入 PromQL 和业务排查。