为什么要在ref="/tag/2020/" style="color:#3D6345;font-weight:bold;">Kubernetes里用Prometheus做监控
跑在Kubernetes上的服务一多,光靠肉眼盯着kubectl get pods根本没法及时发现问题。比如某个Pod内存占用突然飙升,或者API响应变慢,等用户投诉了再处理就晚了。这时候就得有个能实时抓指标、还能告警的工具,Prometheus就是干这个的。
Prometheus天生适合容器环境,它主动拉取(pull)指标的方式和Kubernetes的标签体系配合得很顺。加上社区生态成熟,像Node Exporter、cAdvisor这些组件一装,CPU、内存、网络、磁盘数据立马就能看到。
快速搭建Prometheus监控系统
最简单的办法是用Helm一键部署。先加个Prometheus社区的仓库:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update然后直接安装kube-prometheus-stack,它把Prometheus、Alertmanager、Grafana全都打包好了:
helm install kube-prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace等几分钟,所有组件跑起来后,可以用端口转发访问Prometheus界面:
kubectl port-forward -n monitoring service/kube-prometheus-prometheus 9090浏览器打开 http://localhost:9090,就能看到Targets页面,里面列出了所有被监控的目标实例。
采集自定义应用指标
你的Go服务暴露了/metrics接口?Prometheus默认就能抓。但得告诉它去哪找。给Deployment加个ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-monitor
namespace: default
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: web
interval: 15s只要你的Service有app: myapp这个标签,Prometheus就会自动发现并开始拉取指标。Java应用用Micrometer,Python用prometheus-client,打点方式都差不多。
设置告警规则更省心
光看图表不够,关键问题得主动通知你。比如集群节点CPU超过80%持续5分钟,就得发钉钉或邮件。在values.yaml里配置Alertmanager:
alertmanager:
config:
receivers:
- name: "webhook"
webhook_configs:
- url: "https://oapi.dingtalk.com/robot/send?access_token=xxx"再写条PrometheusRule:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: node-high-cpu
namespace: monitoring
spec:
groups:
- name: node.rules
rules:
- alert: NodeCPUHigh
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Instance {{ $labels.instance }} CPU 使用过高"一旦触发,消息马上就能推到群里,值班的人不用一直盯着屏幕。
常见坑点提醒
Prometheus本身不持久化数据,pod重建就丢了。记得挂个PVC。资源也别抠门,监控几百个Pod的话,至少给它4核8G起步。还有,/metrics接口别没设限,万一被恶意刷成DDoS入口就麻烦了,建议加个NetworkPolicy限制访问来源。
用熟了之后你会发现,不只是看CPU内存,像请求延迟分布、队列积压数这些业务指标也能监控。一套系统打通,排查问题快得多。