1. Kubernetes集群监控概述
在现代云原生架构中,Kubernetes已成为容器编排的事实标准。随着集群规模扩大和业务复杂度提升,监控系统的重要性愈发凸显。一个完善的Kubernetes监控体系需要覆盖以下四个维度:
- 基础设施层:节点资源使用率(CPU、内存、磁盘、网络)
- 容器运行时:Pod/Container级别的资源消耗
- 应用性能:服务响应时间、错误率等业务指标
- 编排系统:Kubernetes核心组件(API Server、etcd等)的健康状态
典型的监控技术栈通常采用Prometheus作为核心采集器,配合Grafana实现可视化。这种组合之所以成为社区首选,主要因为:
- Prometheus的Pull模型天然适配Kubernetes的动态服务发现
- 多维数据模型(metric + label)完美匹配Kubernetes的标签体系
- 强大的PromQL支持灵活的聚合查询
2. 监控系统搭建实战
2.1 环境准备
首先确保集群已启用Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml验证安装:
kubectl top nodes # 预期输出类似: # NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% # node1 392m 9% 2943Mi 38%2.2 Prometheus部署方案对比
| 部署方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Helm Chart | 一键部署,配置灵活 | 需要Tiller(Helm 2时代) | 生产环境推荐 |
| Operator | 自动化运维,CRD管理 | 学习曲线较陡 | 长期运行的复杂监控体系 |
| 手动部署 | 完全控制各个组件 | 维护成本高 | 定制化需求强的场景 |
推荐使用kube-prometheus-stack(原prometheus-operator):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install mon prometheus-community/kube-prometheus-stack -n monitoring2.3 关键配置解析
在values.yaml中需要特别关注的配置项:
prometheus: prometheusSpec: # 建议根据集群规模调整 retention: 7d resources: limits: memory: 16Gi # 动态抓取配置 podMonitorSelector: {} serviceMonitorSelector: {} grafana: adminPassword: "securepassword" # 预装常用仪表盘 dashboards: default: k8s-cluster: {json: "https://grafana.com/api/dashboards/315/revisions/3/download"}3. 监控指标深度解析
3.1 核心指标分类
| 指标类型 | 示例指标 | 告警阈值建议 |
|---|---|---|
| 节点资源 | node_cpu_utilization > 80% | 持续5分钟触发 |
| Pod状态 | kube_pod_status_ready != 1 | 立即触发 |
| 存储 | persistentvolumeclaim_free < 10% | 根据业务需求调整 |
| 网络 | node_network_receive_bytes > 10MB | 需结合带宽容量评估 |
3.2 PromQL实战示例
计算命名空间CPU使用率:
sum(rate(container_cpu_usage_seconds_total{namespace="production"}[5m])) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{namespace="production"}) by (pod)识别内存泄漏Pod:
sort_desc( container_memory_working_set_bytes{container!="", container!="POD"} - on(namespace,pod,container) container_memory_usage_bytes{container!="", container!="POD"} )4. 高级监控场景
4.1 自定义指标暴露
在Deployment中添加annotations实现自动发现:
annotations: prometheus.io/scrape: "true" prometheus.io/port: "8080" prometheus.io/path: "/metrics"Go应用示例代码:
import "github.com/prometheus/client_golang/prometheus" var requestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total HTTP requests", }, []string{"method", "path", "status"}, ) func init() { prometheus.MustRegister(requestCounter) }4.2 长期存储方案
当监控数据超过本地存储容量时,考虑以下方案:
Thanos架构:
- Sidecar模式:每个Prometheus实例配一个Thanos Sidecar
- 全局视图:通过Querier聚合多个集群数据
- 对象存储:使用S3/MinIO作为长期存储后端
VictoriaMetrics:
- 更高的压缩率(比Prometheus节省10x存储)
- 完全兼容PromQL
- 单二进制部署简化运维
5. 告警管理最佳实践
5.1 Alertmanager配置要点
route: group_by: ['alertname', 'cluster'] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: 'slack-notifications' routes: - match: severity: 'critical' receiver: 'pagerduty' receivers: - name: 'slack-notifications' slack_configs: - api_url: ${SLACK_WEBHOOK} channel: '#alerts' send_resolved: true5.2 避免告警风暴的策略
- 合理设置group_by防止告警分散
- 使用inhibit_rules抑制关联告警:
inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname'] - 对瞬时波动指标增加for子句:
- alert: HighCPU expr: node_cpu_usage > 80% for: 5m
6. 性能优化指南
6.1 大规模集群调优
- 分片策略:
prometheus: prometheusSpec: shards: 3 - 远程写入优化:
remote_write: - url: "http://thanos-receive:10908/api/v1/receive" queue_config: max_samples_per_send: 5000 capacity: 10000
6.2 资源限制建议
| 组件 | CPU请求 | 内存请求 | 内存限制(每100节点) |
|---|---|---|---|
| Prometheus | 2 cores | 8Gi | 16Gi |
| Alertmanager | 500m | 256Mi | 1Gi |
| Grafana | 500m | 256Mi | 512Mi |
7. 故障排查手册
7.1 常见问题诊断流程
指标缺失:
- 检查ServiceMonitor/PodMonitor标签匹配
- 验证目标是否出现在Prometheus的Targets页面
- 检查网络策略是否允许Prometheus访问目标端口
存储问题:
# 检查WAL日志状态 du -sh /prometheus/wal/ # 验证存储配置 kubectl exec prometheus-mon-kube-prometheus-stack-prometheus-0 -- ls -lh /prometheus
7.2 实用调试命令
获取Prometheus内存状态:
kubectl exec -it prometheus-0 -- promtool tsdb stats /prometheus分析高基数指标:
curl -sG 'http://prometheus:9090/api/v1/series' --data-urlencode 'match[]={__name__=~".+"}' | jq '.data | group_by(.__name__) | map({metric: .[0].__name__, count: length}) | sort_by(.count) | reverse'8. 安全加固措施
网络隔离:
networkPolicy: enabled: true ingress: - from: - namespaceSelector: matchLabels: name: monitoring egress: []RBAC最小权限:
serviceAccount: create: true annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/prometheus-role数据加密:
kubectl create secret generic thanos-objstore-config --from-file=thanos.yaml=./s3-config.yaml
这套监控方案在我们生产环境支撑着超过500个节点的集群,每天处理超过2TB的监控数据。关键是要根据实际业务需求持续优化指标采集范围和存储策略,避免陷入"数据沼泽"。对于刚接触Kubernetes监控的团队,建议先从核心指标开始,逐步扩展监控范围。