在生产环境中运行Kubernetes集群就像驾驶一架喷气式飞机,仪表盘上的每个指标都是确保飞行安全的关键数据。去年我们某个生产集群曾因内存泄漏导致节点OOM(Out of Memory),由于监控体系不完善,直到业务中断才被发现。这次教训让我意识到,完善的监控方案需要覆盖以下四个维度:
我们对比了三种主流方案的实际表现(测试环境为10节点集群):
| 方案 | 内存占用 | 采集延迟 | 告警功能 | 学习曲线 |
|---|---|---|---|---|
| Prometheus | 2.1GB | 15s | 完善 | 中等 |
| Datadog | 3.4GB | 5s | 优秀 | 简单 |
| Zabbix | 1.8GB | 60s | 基础 | 陡峭 |
最终选择Prometheus的原因:
我们的采集架构采用三层结构:
code复制[node-exporter] --> [Prometheus] --> [Grafana]
↑ ↑
[kube-state-metrics] [Alertmanager]
关键组件配置示例:
yaml复制# prometheus-configmap.yaml
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
通过node-exporter采集的关键指标包括:
node_load1 > (number_of_cores * 0.7)(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.2predict_linear(node_filesystem_free_bytes[6h], 3600*24) < 0重要提示:对于SSD节点需要额外监控
disk_io_now指标,我们曾遇到IOPS耗尽导致的服务雪崩
使用kube-state-metrics暴露的指标:
promql复制sum(kube_pod_container_status_restarts_total) by (pod) > 3
sum(kube_pod_status_phase{phase="Pending"}) by (namespace) > 0
典型问题排查流程:
kubectl describe pod -n <namespace>kubectl logs --previouskubectl top pod通过Prometheus Adapter实现HPA自动伸缩:
yaml复制rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
在Istio环境下的监控增强配置:
bash复制# 启用网格监控
istioctl install --set values.telemetry.enabled=true
关键追踪指标:
istio_request_duration_seconds_bucketsum(rate(istio_requests_total{response_code=~"5.."}[1m])) / sum(rate(istio_requests_total[1m]))我们的告警规则分为三级响应:
| 级别 | 条件示例 | 通知方式 | 响应时限 |
|---|---|---|---|
| P0 | API Server不可用 | 电话+短信 | 5分钟 |
| P1 | 节点NotReady持续5分钟 | 企业微信 | 30分钟 |
| P2 | Deployment副本数不足 | 邮件 | 4小时 |
Alertmanager配置片段:
yaml复制route:
group_by: ['alertname']
receiver: 'slack-notifications'
routes:
- match:
severity: 'critical'
receiver: 'sms-receiver'
案例1:etcd存储空间不足
etcd_mvcc_db_total_size_in_bytes接近配额etcdctl defrag案例2:DNS查询超时
coredns_dns_request_duration_seconds突增通过以下配置降低Prometheus负载:
yaml复制global:
scrape_interval: 1m
evaluation_interval: 1m
# 按需抓取ServiceMonitor
serviceMonitorSelector:
matchExpressions:
- {key: monitor, operator: In, values: [critical]}
采用Thanos架构实现历史数据存储:
bash复制# thanos-compactor配置示例
- --retention.resolution-raw=30d
- --retention.resolution-5m=90d
- --retention.resolution-1h=1y
存储成本对比(1年数据保留):
| 方案 | 存储量 | 查询性能 |
|---|---|---|
| 本地TSDB | 12TB | 快 |
| S3+Thanos | 4.5TB | 中等 |
| VictoriaMetrics | 3.2TB | 最快 |
关键安全指标监控:
promql复制# 异常端口监听
sum(kube_pod_container_info{container=~".*", pod!="", interface!="lo"}) by (pod,namespace) > 0
# 特权容器运行
sum(kube_pod_container_info{security_context_capabilities_add="*"}) by (pod)
启用Kubernetes审计策略:
yaml复制rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
verbs: ["*"]
使用Fluentd收集日志的关键过滤规则:
ruby复制<filter kube-apiserver-audit>
@type grep
<regexp>
key $.objectRef.resource
pattern /^(secrets|roles|clusterroles)/
</regexp>
</filter>
我们制定的标签标准:
team="payment"env="prod"tier="backend"示例指标:
code复制http_requests_total{team="order",env="staging",tier="api"}
Grafana Dashboard的复用策略:
json复制"templating": {
"list": [
{
"name": "namespace",
"query": "label_values(kube_pod_info, namespace)"
}
]
}
近期测试了eBPF方案的效果:
bash复制# 使用Pixie采集网络指标
px run -s px-sock-shop 'px.HttpEvents | select * limit 10'
与传统方案的性能对比:
| 指标 | eBPF采集 | 传统采集 |
|---|---|---|
| CPU开销 | 3% | 15% |
| 数据粒度 | 毫秒级 | 秒级 |
| 协议解析能力 | L7完整解析 | 仅L4 |
在金融级集群的实践中,我们总结出监控黄金法则:
指标采集遵循"3-5-10"原则:
告警配置必须通过"三问验证":
容量规划建议:
python复制# 计算Prometheus存储需求
def calculate_storage(samples_per_second, retention_days):
bytes_per_sample = 3 # 平均样本大小
return samples_per_second * 86400 * retention_days * bytes_per_sample / (1024**3)