Kubernetes 监控
Kubernetes 监控至少区分三类信号:Node 与容器资源使用、Kubernetes 对象期望与实际状态、应用业务指标。不要仅凭 CPU 和内存判断服务健康,也不要把 kube-state-metrics 的对象状态当成容器真实使用率。
1. Kubernetes 指标来源
| 来源 | 提供的信号 | 常见指标 |
|---|---|---|
| kubelet / cAdvisor | 容器资源与运行时 | CPU、内存、文件系统、网络 |
| kube-state-metrics | Kubernetes 对象状态 | Deployment 副本、Pod 状态、HPA、PVC |
| node_exporter | 节点操作系统 | CPU、内存、磁盘、网络、内核 |
应用 /metrics | 业务与应用运行状态 | QPS、错误率、延迟、队列 |
| 控制面组件 | API Server、etcd、调度器、控制器 | 请求延迟、leader、etcd 存储与错误 |
2. Prometheus Operator 与 kube-prometheus-stack
Prometheus Operator 通过 CRD 管理 Prometheus、Alertmanager、ServiceMonitor、PodMonitor 与 PrometheusRule。kube-prometheus-stack 将 Operator、常用 Exporter、Grafana 和规则打包,适合作为集群监控基线。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
生产环境应使用 values 文件固定 chart 版本、持久卷、资源限制、告警接收器、Ingress、RBAC 和选择器,不要直接依赖默认值。
3. ServiceMonitor
ServiceMonitor 选择 Service,再按 Service 端口名称创建抓取目标:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: checkout
namespace: monitoring
labels:
release: monitoring
spec:
namespaceSelector:
matchNames: [shop]
selector:
matchLabels:
app.kubernetes.io/name: checkout
endpoints:
- port: metrics
path: /metrics
interval: 30s
selector 匹配的是 Service 标签,endpoints.port 匹配的是 Service 端口名称。若目标未出现,检查 Service 标签、ServiceMonitor 标签、Prometheus selector、Namespace 与端口名。
4. PodMonitor
PodMonitor 直接选择 Pod,适合没有 Service 的 Agent 或单独端点:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: worker
namespace: monitoring
labels:
release: monitoring
spec:
namespaceSelector:
matchNames: [shop]
selector:
matchLabels:
app.kubernetes.io/name: worker
podMetricsEndpoints:
- port: metrics
path: /metrics
5. 核心指标
应覆盖 API Server 请求错误与延迟、etcd 磁盘与 leader、kubelet 资源和 PLEG、控制器/调度器 leader 状态、Node Ready、Deployment 副本差异、Pod 重启、PVC 容量与证书到期。具体指标会随 Kubernetes 版本变化,应以实际 /metrics 与 chart 规则为准。
Kubernetes 工作负载和运维流程参见 Kubernetes 实战。