1. 为什么要在EKS上部署监控系统?
当你的Kubernetes集群规模超过5个节点时,仅靠kubectl top和基础日志已经很难全面掌握系统健康状况。上周我们一个生产集群突然出现API响应延迟,花了3小时才定位到是某个Deployment的Sidecar容器内存泄漏导致的——如果有完善的监控体系,这种问题10分钟内就能发现。
AWS EKS作为托管Kubernetes服务,虽然省去了控制平面的运维负担,但工作节点的监控仍需自行搭建。Prometheus+Grafana的组合是目前云原生监控的事实标准,其优势在于:
- 多维数据模型:通过metric名称和key/value标签标识数据
- PromQL查询语言:比SQL更适合时间序列数据分析
- 完善的Kubernetes服务发现:自动发现Pod/Service/Node等资源
- Grafana丰富的可视化能力:官方提供Kubernetes专属Dashboard
2. 部署架构设计
2.1 组件拓扑图
我们的目标架构包含以下核心组件:
code复制[EKS Worker Nodes]
├── Prometheus Server (StatefulSet)
│ ├── 3个副本用于高可用
│ └── 100GB EBS卷存储指标数据
├── Grafana (Deployment)
│ ├── 2个副本负载均衡
│ └── 配置存储在Secrets中
└── kube-state-metrics (Deployment)
└── 将Kubernetes对象状态转为Prometheus指标
2.2 关键配置决策
-
存储选择:
- 开发环境:使用EBS gp3卷(性价比高)
- 生产环境:建议EBS io1卷(保证IOPS)或搭配S3长期存储
-
资源配额:
yaml复制# prometheus-server资源限制示例 resources: limits: cpu: 2 memory: 4Gi requests: cpu: 1 memory: 2Gi -
网络配置:
- 使用Internal ELB暴露Grafana
- Prometheus通过ClusterIP服务内部访问
3. 详细部署步骤
3.1 前置条件准备
首先确保你的环境满足:
bash复制# 检查工具版本
aws-cli >= 2.4.0
kubectl >= 1.23
helm >= 3.9
# 配置EKS访问
aws eks update-kubeconfig --region us-west-2 --name your-cluster
3.2 通过Helm安装Prometheus
使用官方的kube-prometheus-stack chart:
bash复制helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--values values-production.yaml
关键values配置示例:
yaml复制# values-production.yaml
prometheus:
prometheusSpec:
retention: 15d # 数据保留周期
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: gp3
resources:
requests:
storage: 100Gi
grafana:
adminPassword: "secure_password_123"
persistence:
enabled: true
storageClassName: gp3
size: 10Gi
3.3 配置Ingress访问Grafana
使用ALB Ingress Controller:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: monitoring
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internal # 生产环境建议内网访问
spec:
rules:
- host: grafana.yourcompany.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prometheus-grafana
port:
number: 80
4. 实战调优技巧
4.1 关键监控指标配置
在Prometheus的scrape_config中添加:
yaml复制- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
4.2 Grafana仪表板导入
推荐使用这些官方仪表板:
- Kubernetes Cluster Monitoring (ID: 315)
- Kubernetes Pods Monitoring (ID: 6417)
- Node Exporter Full (ID: 1860)
导入方法:
bash复制# 通过kubectl导入
kubectl create configmap grafana-dashboards \
--from-file=kubernetes-cluster.json \
--namespace monitoring
4.3 告警规则最佳实践
示例内存告警规则:
yaml复制groups:
- name: Kubernetes Pod Memory
rules:
- alert: PodMemoryUsageHigh
expr: sum(container_memory_working_set_bytes{container!="", pod!=""}) by (pod, namespace) / sum(kube_pod_container_resource_limits{resource="memory"}) by (pod, namespace) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on pod {{ $labels.pod }}"
5. 生产环境注意事项
-
安全加固:
- 为Grafana配置OIDC集成
- 限制Prometheus的ServiceAccount权限
yaml复制apiVersion: v1 kind: ServiceAccount metadata: name: prometheus namespace: monitoring automountServiceAccountToken: false -
性能优化:
- 调整Prometheus抓取间隔:
yaml复制global: scrape_interval: 1m evaluation_interval: 1m - 启用Prometheus压缩
yaml复制prometheus: prometheusSpec: enableCompression: true
- 调整Prometheus抓取间隔:
-
备份策略:
bash复制# 定期备份Grafana仪表板 kubectl get configmap grafana-dashboard -n monitoring -o yaml > grafana-backup-$(date +%F).yaml
6. 故障排查指南
常见问题及解决方案:
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| Prometheus显示"Out of Memory" | 数据量过大 | kubectl top pod -n monitoring |
| Grafana无法连接数据源 | 网络策略限制 | kubectl run -it --rm debug --image=busybox --restart=Never -- wget prometheus-server.monitoring:9090 |
| 指标缺失 | ServiceMonitor配置错误 | kubectl get servicemonitors -n monitoring |
深度问题排查流程:
- 检查Prometheus Targets页面(:9090/targets)
- 验证ServiceMonitor选择器匹配
bash复制
kubectl describe servicemonitor -n monitoring - 检查Prometheus日志
bash复制
kubectl logs -f prometheus-server-0 -n monitoring
7. 成本优化建议
-
存储优化:
- 调整数据保留策略
yaml复制prometheus: prometheusSpec: retention: 7d # 根据需求调整 -
实例选型:
bash复制# 使用Spot实例运行监控组件 kubectl annotate deploy prometheus-operator \ cluster-autoscaler.kubernetes.io/safe-to-evict="true" \ -n monitoring -
采样频率优化:
yaml复制# 对非核心指标降低采样频率 - job_name: 'non-critical' scrape_interval: 5m
这套监控方案在我们生产环境已稳定运行2年,经历过多次大促考验。关键是要根据实际业务特点调整数据保留周期和告警阈值。建议每周review一次告警规则的有效性,避免告警疲劳。