阶段六:Prometheus+Grafana监控系统进阶(K8s)
K8s 可观测性
可观测性(Observability) 是指系统内部状态能否从外部数据推断出来,核心观测目标
1. 监控 Metrics(指标) → 系统性能、资源利用率 2. 日志(Logs) → 系统事件、错误排查 3. 追踪(Tracing) → 分布式调用链、性能瓶颈 4. 拓扑 / 依赖关系 → 服务间调用关系
Kubernetes 环境是动态、分布式且高度复杂的,这带来了独特的挑战
- 动态性:Pod 随时可能被调度、重启或迁移,传统基于主机IP的监控方式失效。
- 多层抽象:问题可能出现在节点、Pod、容器、应用或网络等多个层面。
- 海量数据:各种组件每秒产生大量数据,人工排查如同大海捞针
Kubernetes 可观测性核心对象
<sheet sheet-id="tPPHwf" token="Jb02sok7Gh06XWtQdxbcPUN7nje"></sheet>
可观测性工具
(1) Metrics(指标)
- Prometheus + Node Exporter + kube-state-metrics
- Node Exporter → 节点资源
- kube-state-metrics → K8s 对象状态
- cAdvisor → 容器级指标
(2) Logs(日志)
- EFK / ELK(Elasticsearch + Fluentd + Kibana)
- 收集、聚合、搜索日志
- Loki + Promtail + Grafana
- 与 Grafana 集成,更轻量
(3) Tracing(调用链)
- SkyWalking / Jaeger / Zipkin
- 分布式追踪
- 找到慢请求、依赖链瓶颈
- http://demo.skywalking.apache.org/
(4) 可视化与告警
- Grafana:可视化指标和日志
- Alertmanager:告警管理
- Kiali / SkyWalking UI:服务拓扑和调用链可视化
kube-prometheus-stack
简介
kube-prometheus-stack 是 Prometheus Operator 官方提供的 Helm Chart
主要目的是 快速在 Kubernetes 集群中部署完整的监控解决方案
核心组件包括:
- Prometheus:指标采集和存储
- Alertmanager:告警管理
- Grafana:可视化和 Dashboard
- Node Exporter:节点级别指标
- kube-state-metrics:Kubernetes 对象状态指标
- Prometheus Operator:管理 Prometheus、Alertmanager、ServiceMonitor、PodMonitor 的 CRD
<sheet sheet-id="jSWBfC" token="Jb02sok7Gh06XWtQdxbcPUN7nje"></sheet>
可观测性实现原理
- Node Exporter → 节点指标 → Prometheus
- kube-state-metrics → K8s 对象状态指标 → Prometheus
- ServiceMonitor / PodMonitor → 自定义应用指标 → Prometheus
- PrometheusRule → 告警规则 → Alertmanager
- Alertmanager → 根据规则发送告警(Webhook、Email、Slack…)
- Grafana → Prometheus 查询指标 → 可视化展示
安装kube-prometheus-stack
- 添加官方helm仓库
#添加官方helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
#拉取安装包
helm pull prometheus-community/kube-prometheus-stack --version v76.4.1注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
[root@master ~]# tar -xv -f kube-prometheus-stack-76.4.0.tgz
[root@master ~]# cd kube-prometheus-stack
#Prometheus持久化配置
[root@master ~]# vim values.yaml
4329 storageSpec:
4330 ## Using PersistentVolumeClaim
4331 ##
4332 volumeClaimTemplate:
4333 spec:
4334 storageClassName: nfs-storage
4335 accessModes: ["ReadWriteOnce"]
4336 resources:
4337 requests:
4338 storage: 5Gi
#创建监控命名空间
[root@master ~]# kubectl create ns monitor
[root@master ~]# cd ../
[root@master ~]# helm install prometheus-monitor ./kube-prometheus-stack \
--set prometheus.prometheusSpec.retention="90d" \
--set grafana.adminPassword="admin123" \
--set grafana.ingress.enabled=true \
--set grafana.ingress.hosts[0]="grafana.lanqicheng.top" \
--set grafana.ingress.ingressClassName="nginx" \
--set prometheus.ingress.enabled=true \
--set prometheus.ingress.hosts[0]="prometheus.lanqicheng.top" \
--set prometheus.ingress.ingressClassName="nginx" -n monitor注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
Prometheus 告警规则
- 告警规则是什么
Prometheus 告警规则(Alerting Rule)是一组 YAML 定义,告诉 Prometheus:
- 什么时候触发一个告警(基于 PromQL 表达式)
- 触发后生成一个告警事件,发送给 Alertmanager
- Alertmanager 再决定是否通知(钉钉、飞书、邮件、webhook 等)
- 告警规则基本结构(案例讲解,不需要配置到集群监控里面)
groups:
- name: example.rules # 规则组的名字
interval: 30s # 评估周期,多久计算一次表达式
rules:
- alert: HighCPUUsage
expr: rate(container_cpu_usage_seconds_total{image!=""}[5m]) > 0.8
for: 2m
labels:
severity: warning
team: ops
annotations:
summary: "Pod CPU 使用率过高"
description: "Pod {{ $labels.pod }} 在过去5分钟内 CPU 使用率大于 80%"注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
# 查看告警规则
[root@master ~]# kubectl get prometheusrule -n monitor
# 查看规则详情
[root@master ~]# kubectl describe prometheusrule prometheus-monitor-kube-pr-kubernetes-resources -n monitor
# 直接获取 YAML 查看所有规则细节
[root@master ~]# kubectl get prometheusrule prometheus-monitor-kube-pr-kubernetes-resources -n monitor -o yaml注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
2.1.5 核心组件监听地址修改
- Kube-proxy 监控数据监听地址
kubectl edit configmap kube-proxy -n kube-system
kind: KubeProxyConfiguration
logging:
flushFrequency: 0
options:
json:
infoBufferSize: "0"
text:
infoBufferSize: "0"
verbosity: 0
metricsBindAddress: "0.0.0.0" #修改监听地址成0.0.0.0
mode: ""
nftables:
masqueradeAll: false
masqueradeBit: null
minSyncPeriod: 0s
syncPeriod: 0s注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- command:
- kube-controller-manager
- --allocate-node-cidrs=true
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --bind-address=192.168.50.209 #修改成当前服务器节点IP地址
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-cidr=10.244.0.0/16
- --cluster-name=kubernetes
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.96.0.0/12
- --use-service-account-credentials=true注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
vim /etc/kubernetes/manifests/kube-scheduler.yaml
- command:
- kube-scheduler
- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
- --bind-address=192.168.50.209 #修改成当前服务器节点IP地址
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
CloudAlert 睿象云
睿象云集成 Prometheus



配置 AlertManager 路由
- 编辑 kube-prometheus-stack 的 helm 包的 values.yaml 文件,找到 alertmanager 配置部分,添加 receivers和 route。
[root@master ~]# cd kube-prometheus-stack
[root@master ~]# vi values.yaml
...
534 route:
535 group_by: ['namespace', 'alertname']
536 group_wait: 30s
537 group_interval: 5m
538 repeat_interval: 1h
539 receiver: 'team-X-pager' # 默认指向睿象云接收器
540 routes:
541 - receiver: 'null' # 静默某些不需要的告警
542 matchers:
543 - alertname = "Watchdog"
- team = "ops"
544 receivers:
545 - name: 'null'
546 - name: 'team-X-pager'
547 webhook_configs:
548 - url: 'http://api.aiops.com/alert/api/event/prometheus/02ecba4aec434a7985c3bca0fcd4754c'
549 send_resolved: true
...注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
[root@master ~]# cd ../
[root@master ~]# helm upgrade prometheus-monitor ./kube-prometheus-stack \
--set prometheus.prometheusSpec.retention="90d" \
--set grafana.adminPassword="admin123" \
--set grafana.ingress.enabled=true \
--set grafana.ingress.hosts[0]="grafana.lanqicheng.top" \
--set grafana.ingress.ingressClassName="nginx" \
--set prometheus.ingress.enabled=true \
--set prometheus.ingress.hosts[0]="prometheus.lanqicheng.top" \
--set prometheus.ingress.ingressClassName="nginx" -n monitor执行结果:
- 成功后应以该命令实际输出、生成的文件或目标服务状态为准;失败时先阅读终端报错,再核对命令参数和运行环境。
关键参数:
注意事项:
[client]
host=mysql
port=3306
user=exporter
password=123456metadata: labels: spec: selector: matchLabels: template: metadata: labels: spec: containers: args: ports: volumeMounts: volumes: secret: ---
metadata: labels: spec: selector: ports:
**注意事项:**
metadata:
labels:
spec:
selector:
matchLabels:
namespaceSelector:
matchNames:
endpoints:注意事项:
metadata: labels: spec: groups: rules: labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
**注意事项:**
metadata: labels: spec: selector: matchLabels: template: metadata: labels: spec: containers: ports: --- metadata: labels: spec: ports: selector:
**注意事项:**
metadata:
labels:
spec:
selector:
matchLabels:
namespaceSelector:
matchNames:
endpoints:注意事项:
metadata: labels: spec: groups: rules:
labels: annotations:
expr: | / labels: annotations:
expr: | / labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
labels: annotations:
**注意事项:**
主要分成两类:
例如:

#创建一个目录进行镜像的构建,把下载的jar放到创建目录
---
############################################
############################################
whitelistObjectNames:
rules:
############################################
############################################
############################################
############################################
############################################
############################################
############################################
############################################
#构建镜像
#推送镜像到仓库
#更新zzy-admin服务关键参数:
| 参数 | 说明 | |
|---|---|---|
-p | 核心 | 递归创建目录;父目录不存在时一并创建,目录已经存在也不报错。 |
config.yaml | 普通 | 配置文件路径,命令会读取这个文件里的配置。 |
-t | 普通 | 为构建结果设置镜像名称和标签,值为 harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter。 |
harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter | 普通 | harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter 是 Docker build 的目标或参数;它决定当前动作实际处理的镜像、容器、网络、数据卷或 Compose 服务。 |
. | 普通 | Docker 构建上下文,表示当前目录;Dockerfile 中需要的文件必须位于这个目录及其子目录内。 |
-n | 普通 | 指定 Kubernetes 命名空间 zzyl,命令只在该命名空间内查找或修改资源。 |
注意事项:
metadata: labels: spec: ports: selector:
**注意事项:**
metadata:
labels:
spec:
selector:
matchLabels:
namespaceSelector:
matchNames:
endpoints:
#创建
#查看注意事项:
本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。