ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kubernetes集群监控实战:从Prometheus到Grafana

Kubernetes集群监控实战:从Prometheus到Grafana

1. Kubernetes集群监控概述

在现代云原生架构中,Kubernetes已成为容器编排的事实标准。随着集群规模扩大和业务复杂度提升,监控系统的重要性愈发凸显。一个完善的Kubernetes监控体系需要覆盖以下四个维度:

  • 基础设施层:节点资源使用率(CPU、内存、磁盘、网络)
  • 容器运行时:Pod/Container级别的资源消耗
  • 应用性能:服务响应时间、错误率等业务指标
  • 编排系统:Kubernetes核心组件(API Server、etcd等)的健康状态

典型的监控技术栈通常采用Prometheus作为核心采集器,配合Grafana实现可视化。这种组合之所以成为社区首选,主要因为:

  1. Prometheus的Pull模型天然适配Kubernetes的动态服务发现
  2. 多维数据模型(metric + label)完美匹配Kubernetes的标签体系
  3. 强大的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 monitoring

2.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 长期存储方案

当监控数据超过本地存储容量时,考虑以下方案:

  1. Thanos架构:

    • Sidecar模式:每个Prometheus实例配一个Thanos Sidecar
    • 全局视图:通过Querier聚合多个集群数据
    • 对象存储:使用S3/MinIO作为长期存储后端
  2. 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: true

5.2 避免告警风暴的策略

  1. 合理设置group_by防止告警分散
  2. 使用inhibit_rules抑制关联告警:
    inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname']
  3. 对瞬时波动指标增加for子句:
    - alert: HighCPU expr: node_cpu_usage > 80% for: 5m

6. 性能优化指南

6.1 大规模集群调优

  1. 分片策略:
    prometheus: prometheusSpec: shards: 3
  2. 远程写入优化:
    remote_write: - url: "http://thanos-receive:10908/api/v1/receive" queue_config: max_samples_per_send: 5000 capacity: 10000

6.2 资源限制建议

组件CPU请求内存请求内存限制(每100节点)
Prometheus2 cores8Gi16Gi
Alertmanager500m256Mi1Gi
Grafana500m256Mi512Mi

7. 故障排查手册

7.1 常见问题诊断流程

  1. 指标缺失:

    • 检查ServiceMonitor/PodMonitor标签匹配
    • 验证目标是否出现在Prometheus的Targets页面
    • 检查网络策略是否允许Prometheus访问目标端口
  2. 存储问题:

    # 检查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. 安全加固措施

  1. 网络隔离:

    networkPolicy: enabled: true ingress: - from: - namespaceSelector: matchLabels: name: monitoring egress: []
  2. RBAC最小权限:

    serviceAccount: create: true annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/prometheus-role
  3. 数据加密:

    kubectl create secret generic thanos-objstore-config --from-file=thanos.yaml=./s3-config.yaml

这套监控方案在我们生产环境支撑着超过500个节点的集群,每天处理超过2TB的监控数据。关键是要根据实际业务需求持续优化指标采集范围和存储策略,避免陷入"数据沼泽"。对于刚接触Kubernetes监控的团队,建议先从核心指标开始,逐步扩展监控范围。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进