1. 为什么选择kube-prometheus搭建K8s监控体系当你管理一个Kubernetes集群时最头疼的问题之一就是如何全面掌握集群的运行状态。我曾经接手过一个生产集群当时连基本的Pod重启次数都统计不全每次故障排查都像在黑暗中摸索。直到发现了kube-prometheus这个监控全家桶才真正解决了这个问题。kube-prometheus之所以成为监控K8s的事实标准主要因为它解决了三大痛点开箱即用的监控指标自动采集节点、Pod、Service等核心资源指标不用再手动配置exporter智能告警体系内置100针对K8s优化的告警规则比如节点内存不足、Pod频繁重启等可视化看板预装Grafana看板CPU、内存、网络等关键指标一目了然我对比过多种监控方案发现kube-prometheus最大的优势在于它的全栈监控能力。举个例子当某个服务响应变慢时你可以先看Grafana的API延迟看板再查Prometheus的请求量指标最后通过Alertmanager定位到具体Pod整个过程不需要切换不同系统所有数据都在一个平台完成闭环。下面这张表格对比了几种常见监控方案方案部署复杂度指标覆盖度告警能力可视化程度kube-prometheus中等全面强大优秀自建Prometheus高依赖配置需自定义需手动配置商业监控软件低全面强大优秀原生K8s监控低基础无有限2. 快速部署kube-prometheus2.1 准备K8s集群在开始前确保你的集群满足以下条件Kubernetes 1.16推荐1.20kubectl已配置正确上下文每个节点至少2核4G资源实测1核2G会频繁OOM我曾经在资源不足的测试环境踩过坑Prometheus频繁崩溃。后来发现是内存不足导致这里分享一个快速检查集群资源的方法kubectl top nodes kubectl describe nodes | grep -A 10 Allocatable2.2 三步完成基础部署最新版v0.14.0的部署过程已经简化很多# 下载发布包 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.tar.gz # 解压并进入目录 tar -zxvf v0.14.0.tar.gz cd kube-prometheus-0.14.0 # 分步应用清单文件 kubectl apply --server-side -f manifests/setup kubectl wait --for conditionEstablished --all CustomResourceDefinition --namespacemonitoring kubectl apply -f manifests/这里有个小技巧如果网络不稳定导致镜像拉取失败可以先用国内镜像替换。比如将quay.io/prometheus/prometheus替换为swr.cn-north-4.myhuaweicloud.com/prometheus/prometheus。2.3 验证安装状态部署完成后检查关键组件是否正常运行kubectl get pods -n monitoring -l app.kubernetes.io/nameprometheus kubectl get svc -n monitoring -l app.kubernetes.io/namegrafana正常情况应该看到类似这样的输出NAME READY STATUS RESTARTS AGE prometheus-k8s-0 2/2 Running 0 3m grafana-7d8f8c6c4c-5zg9r 1/1 Running 0 3m3. 暴露监控服务到外部3.1 修改Service类型默认安装的服务都是ClusterIP类型我们需要修改为NodePort方便访问。以Prometheus为例# manifests/prometheus-service.yaml apiVersion: v1 kind: Service metadata: name: prometheus-k8s namespace: monitoring spec: type: NodePort # 新增 ports: - name: web port: 9090 nodePort: 30090 # 新增 targetPort: web同样方法修改Grafana和Alertmanager的Service建议端口号Grafana: 30300Alertmanager: 300933.2 解决网络策略问题如果修改后仍无法访问可能是NetworkPolicy限制。执行以下命令临时开放访问kubectl delete networkpolicy --all -n monitoring生产环境建议配置精确的网络策略比如只允许特定IP访问apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-monitoring namespace: monitoring spec: podSelector: {} ingress: - from: - ipBlock: cidr: 192.168.1.0/244. 数据持久化配置4.1 Prometheus数据持久化默认配置下Prometheus使用emptyDir重启后数据会丢失。修改持久化配置# manifests/prometheus-prometheus.yaml spec: retention: 7d # 保留7天数据 storage: volumeClaimTemplate: spec: storageClassName: standard resources: requests: storage: 50Gi4.2 Grafana数据持久化Grafana的配置和仪表板也需要持久化# manifests/grafana-deployment.yaml volumes: - name: grafana-storage persistentVolumeClaim: claimName: grafana-data同时创建对应的PVC# manifests/grafana-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-data namespace: monitoring spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi5. 定制告警规则5.1 内置告警规则分析kube-prometheus自带的告警规则存放在manifests/prometheus-rules.yaml包含节点级告警CPU、内存、磁盘Pod级告警重启、OOMKilledK8s组件告警API延迟、调度失败我建议先保留这些规则它们已经覆盖了90%的常见问题。5.2 添加自定义告警比如添加一个磁盘空间告警# manifests/custom-rule.yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: prometheus: k8s name: custom-rule namespace: monitoring spec: groups: - name: disk rules: - alert: DiskSpaceLow expr: (1 - (node_filesystem_avail_bytes{fstype~ext4|xfs} / node_filesystem_size_bytes{fstype~ext4|xfs})) * 100 85 for: 5m labels: severity: warning annotations: summary: {{ $labels.instance }} 磁盘空间不足 description: 挂载点 {{ $labels.mountpoint }} 使用率已达 {{ $value }}%应用后可以通过Prometheus的Alerts页面验证规则是否生效。6. 配置告警通知6.1 配置邮件告警修改Alertmanager配置发送邮件通知# manifests/alertmanager-secret.yaml apiVersion: v1 kind: Secret metadata: name: alertmanager-main namespace: monitoring stringData: alertmanager.yaml: | global: smtp_smarthost: smtp.qq.com:465 smtp_from: your_emailqq.com smtp_auth_username: your_emailqq.com smtp_auth_password: your_password smtp_require_tls: true route: group_by: [alertname] receiver: email receivers: - name: email email_configs: - to: target_emailexample.com6.2 集成企业微信对于国内用户企业微信是更好的选择receivers: - name: wechat wechat_configs: - corp_id: your_corp_id to_party: 2 agent_id: 1000002 api_secret: your_api_secret7. 优化与维护技巧7.1 资源限制配置生产环境一定要配置资源限制避免监控系统拖垮集群# manifests/prometheus-prometheus.yaml resources: requests: memory: 4Gi cpu: 2 limits: memory: 8Gi cpu: 47.2 定期清理数据Prometheus数据默认保留15天可以通过修改retention参数调整。如果需要长期存储建议配置Thanos或VictoriaMetrics。7.3 版本升级策略小版本升级相对简单kubectl apply -f manifests/setup kubectl apply -f manifests/大版本升级建议先在测试环境验证特别注意CRD的变化。