第五篇:配置 Prometheus + Grafana 监控系统资源
python-flask项目开发-部署-监控全过程:
- flask开发完整过程总结:https://blog.csdn.net/qq_38444844/article/details/151928286?spm=1011.2415.3001.5331
- 项目源码:https://gitee.com/loveTianWen/Forum-platform/tree/master
- 第一篇: 使用Docker部署flask项目(Flask + DB 容器化)https://blog.csdn.net/qq_38444844/article/details/155862905?sharetype=blogdetail&sharerId=155862905&sharerefer=PC&sharesource=qq_38444844&spm=1011.2480.3001.8118
- 第二篇: 部署 Kubernetes 集群(Ubuntu 24.04.3)
https://blog.csdn.net/qq_38444844/article/details/156615128?spm=1011.2415.3001.5331 - 第三篇: 将 Flask 应用部署到 Kubernetes 集群中,实现自动化管理https://blog.csdn.net/qq_38444844/article/details/157064314?spm=1011.2415.3001.5331
- 第四篇:在Kubernetes上的Flask论坛项目,集成Prometheus+Grafana监控https://blog.csdn.net/qq_38444844/article/details/157440739?spm=1011.2415.3001.5331
前提:开启Prometheus 和 Grafana 访问通道
Prometheus健康检查仪表盘
1 启动端口转发并绑定所有网卡(防止 IPv6 问题)
kubectl port-forward -n monitoring svc/monitoring-kube-prometheus-prometheus --address 0.0.0.0 9090:9090
2 访问Prometheus Targets
http://192.168.56.111:9090/targets
Grafana 仪表板
1 启动端口转发并绑定所有网卡,终端窗口打开
kubectl port-forward --address 0.0.0.0 -n monitoring svc/monitoring-grafana 3000:80
2 访问Grafana
http://192.168.56.111:3000/
1、Grafana改为中文界面(可选)
- 点击右下角的头像,选择Profile,在Language选项中选择简体中文并保存


2、在Prometheus中执行PromQL 表达式进行测试
- Prometheus :http://192.168.56.111:9090/graph
执行PromQL 表达式进行测试
测试1:节点 CPU 使用率
rate(node_cpu_seconds_total{mode="idle"}[5m])
测试2:Kubelet 是否存活
up{job="kubernetes-kubelet"}
测试3:Grafana 是否被采集
up{job="monitoring-grafana"}
测试4:Controller Manager 是否被采集
up{job="kubernetes-kube-controller-manager"}
3、fix-monitor-final.yaml
- 最终版本fix-monitor-final.yaml
cat > fix-monitor-final.yaml << 'EOF'
# ==========================================
# 全局配置:镜像拉取密钥
# ==========================================
global:
imagePullSecrets:
- name: acr-secret
# ==========================================
# 组件镜像配置 (全部使用你的阿里云加速源)
# ==========================================
prometheusOperator:
enabled: true
admissionWebhooks:
enabled: false
tls:
enabled: false
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-operator
tag: v0.77.0
prometheusConfigReloader:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-config-reloader
tag: v0.77.0
thanos:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-thanos-thanos
tag: v0.36.1
kube-state-metrics:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/registry.k8s.io-kube-state-metrics-kube-state-metrics
tag: v2.12.0
prometheus-node-exporter:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-node-exporter
tag: v1.8.2
alertmanager:
enabled: true
alertmanagerSpec:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-alertmanager
tag: v0.27.0
grafana:
enabled: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: "10.4.3"
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: "1.28.0"
# 修复 Grafana 自身监控:强制指定端口
serviceMonitor:
enabled: true
additionalEndpoints:
- port: 80
path: /metrics
scheme: http
# ==========================================
# Prometheus 核心配置
# ==========================================
prometheus:
enabled: true
prometheusSpec:
# 镜像配置
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-prometheus
tag: v2.50.1
# 允许 ServiceMonitor 选择所有命名空间 (关键)
serviceMonitorSelectorNilUsesHelmValues: false
serviceMonitorNamespaceSelector: {}
# 资源限制
resources:
requests:
memory: 512Mi
cpu: 500m
limits:
memory: 2Gi
cpu: 1000m
# ==========================================
# 【核心修复】手动注入 Scrape Configs
# 绕过 ServiceMonitor 自动发现的坑,直接告诉 Prometheus 去哪获取数据
# ==========================================
additionalScrapeConfigs:
# 1. 抓取 Kubelet (通过 Kubernetes API 代理)
- job_name: 'kubelet'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
# 2. 抓取 Controller Manager (直接连接 Master IP)
- job_name: 'kube-controller-manager'
scheme: https
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ['192.168.56.111:10257'] # Master IP 和端口
# 3. 抓取 Scheduler (直接连接 Master IP)
- job_name: 'kube-scheduler'
scheme: https
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ['192.168.56.111:10259'] # Master IP 和端口
# 4. 抓取 Etcd (直接连接 Master IP)
- job_name: 'kube-etcd'
scheme: https
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ['192.168.56.111:2379'] # Master IP 和端口
EOF
4、fix-grafana.yaml
- 最终版本:fix-grafana.yaml
cat > /home/ubuntu/fix-grafana.yaml << 'EOF'
grafana:
enabled: true
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
# 使用 Node IP + NodePort
url: http://192.168.56.111:9090
access: proxy
# 关键修改:去掉 isDefault: true,避免冲突
editable: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: "10.4.3"
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: "1.28.0"
EOF
5、grafana正常监控集群

拓展:
- cluster 变量
# 去 Prometheus 里找所有 job="kube-state-metrics" 的指标,然后提取它们的 cluster 标签值。
label_values(up{job="kube-state-metrics"}, cluster)

监控问题总结:
- 导致 无数据 的原因并非单一问题,而是由 配置冲突、DNS 解析失败 和 Sidecar 机制干扰 共同导致的连锁反应
Prometheus + Grafana 监控体系全链路故障排查
在部署 kube-prometheus-stack 后,虽然 Pod 都启动了,但监控大盘显示 “No Data” 或部分组件DOWN。
主要经历了三个阶段的问题:
1 组件级故障:Kubelet、Controller Manager、Scheduler等核心组件监控目标状态为 DOWN。
2 配置级故障:ServiceMonitor 标签选择器与 Service 实际标签不匹配。
3 连接级故障:Grafana 无法查询 Prometheus 数据(DNS 解析失败/内部网络不通)。
| 阶段 | 故障现象 | 核心原因 (优化版) | 排查/解决方向 (实战版) |
|---|---|---|---|
| 1. 组件级故障 | Kubelet、Controller Manager、Scheduler 等核心组件状态显示 DOWN,Target 列表为空 | 抓取配置错误或权限不足: 1. 组件监听地址非 0.0.0.0 (仅监听 localhost)。2. ServiceAccount 权限缺失或 TLS 证书验证失败。 3. kube-proxy 未正确转发指标端口。 |
1. 检查组件启动参数 --bind-address=0.0.0.0。2. 验证 ClusterRole/Binding 是否包含 nodes/proxy 权限。3. 在 Prometheus Pod 内 curl -k https://<node-ip>:10250/metrics 测试连通性。 |
| 2. 配置级故障 | 监控大盘部分数据缺失,ServiceMonitor 发现目标为空,或 Target 状态为 UP 但无数据 | 标签选择器不匹配 (Label Mismatch):ServiceMonitor 的 selector.matchLabels 与目标 Service/Pod 的 labels 不一致,导致服务发现失败。 |
1. 使用 kubectl get service --show-labels 对比实际标签。2. 检查 ServiceMonitor 的 namespaceSelector 是否限制了命名空间。3. 在 Prometheus UI 的 Status → Service Discovery 查看匹配详情。 |
| 3. 连接/配置冲突故障 | Grafana 面板显示 “No Data”、“Dashboard loading…” 或 DNS 解析超时 (i/o timeout) |
1. Sidecar 自动覆盖 (高频坑): Grafana Sidecar 自动注入内部域名配置,覆盖了手动指定的 NodeIP 配置。 2. 多默认数据源冲突: 同时存在 Prometheus 和 prometheus-1 且均标记为 isDefault,导致查询路由错误。3. 纯网络/DNS 故障: CoreDNS 异常或 NetworkPolicy 阻断。 |
1. 检查数据源列表:确认是否有多余的自动数据源,URL 是否为错误的内部域名。 2. 禁用 Sidecar 注入:设置 grafana.sidecar.datasources.enabled: false。3. 清理旧配置:在 YAML 中使用 deleteDatasources 显式删除冲突项。4. 强制重建:修改配置后必须 delete pod 触发重载,仅 helm upgrade 往往无效。 |
问题1:Grafana 没数据



| 服务组 | 状态 | 说明 |
|---|---|---|
monitoring-grafana |
❌ 0/1 UP | Grafana 自身监控目标挂了 |
alertmanager |
❌ 0/2 UP | 告警管理器挂了 |
apiserver, coredns, kubelet 等 |
✅ 部分或全部 UP | Kubernetes 核心组件监控正常! |
prometheus, node-exporter, kube-state-metrics |
✅ 全部 UP | 监控系统自身和节点导出器正常! |
Prometheus 组件没问题,它能抓到一部分数据(比如节点、Kubelet),但抓不到 Grafana、Alertmanager、Controller Manager 等服务的数据。
这说明:
✅ Prometheus 运行正常
✅ 网络部分通(能抓到 kubelet 和 node-exporter)
❌ 但某些服务的 ServiceMonitor 配置错误,或者这些服务本身的指标端点不可达
问题:
在 Prometheus (/targets) 页面,kubelet, kube-controller-manager,kube-scheduler 等 Job 显示 0/UP 或红色 DOWN 状态。 只有 node-exporter 和部分基础指标是绿色的。
原因: ServiceMonitor 不存在或未被启用,导致Kubelet 和 Controller Manager 没有数据
方法:开启监控组件
kube-prometheus-stack默认为了兼容性,关闭了对控制平面组件(Controller/Scheduler/Etcd)的监控。
在kube-prometheus-stack 中,默认情况下: Kubelet 的监控是通过 kubelet.serviceMonitor
控制的。 Controller Manager / Scheduler / Etcd 等控制平面组件的监控是通过kubeControllerManager.serviceMonitor, kubeScheduler.serviceMonitor,etcd.serviceMonitor 控制的。 这些默认是 关闭的,除非你在 Helm values 中显式开启它们!
第一步:备份旧配置(以防万一)
cp fix-monitor-final.yaml fix-monitor-final.yaml.bak
第二步:重新优化fix-monitor-final.yaml配置文件
- 新增:开启 K8s 核心组件监控的配置,ServiceMonitor , Kubelet, Controller, Scheduler, Etcd 监控
cat > fix-monitor-final.yaml << 'EOF'
# 1. 全局配置 (镜像拉取密钥)
global:
imagePullSecrets:
- name: acr-secret
# 2. Prometheus Operator 配置 (镜像 + 禁用TLS/Webhook)
prometheusOperator:
enabled: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-operator
tag: v0.77.0
admissionWebhooks:
enabled: false
tls:
enabled: false
# 3. 组件镜像配置 (全部指向阿里云仓库)
prometheusConfigReloader:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-config-reloader
tag: v0.77.0
thanos:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-thanos-thanos
tag: v0.36.1
kube-state-metrics:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/registry.k8s.io-kube-state-metrics-kube-state-metrics
tag: v2.12.0
prometheus-node-exporter:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-node-exporter
tag: v1.8.2
#开启 K8s 核心组件监控的配置
# 4. Prometheus 核心配置 (镜像 + 开启监控目标)
prometheus:
enabled: true
prometheusSpec:
# --- 镜像配置 ---
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-prometheus
tag: v2.50.1
# --- 【关键】开启 K8s 核心组件监控 ---
# 允许 ServiceMonitor 选择所有命名空间
serviceMonitorSelectorNilUsesHelmValues: false
serviceMonitorNamespaceSelector: {}
# 资源限制 (防止 OOM)
resources:
requests:
memory: 512Mi
cpu: 500m
limits:
memory: 2Gi
cpu: 1000m
# 5. 【关键】开启 Kubelet, Controller, Scheduler, Etcd 监控
kubelet:
enabled: true
serviceMonitor:
enabled: true
scheme: https
tlsConfig:
insecureSkipVerify: true
bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
kubeControllerManager:
enabled: true
serviceMonitor:
enabled: true
port: https
scheme: https
tlsConfig:
insecureSkipVerify: true
kubeScheduler:
enabled: true
serviceMonitor:
enabled: true
port: https
scheme: https
tlsConfig:
insecureSkipVerify: true
kubeEtcd:
enabled: true
serviceMonitor:
enabled: true
port: https
scheme: https
tlsConfig:
insecureSkipVerify: true
# 如果你的 etcd 监听在本地,通常不需要改 targets,默认会尝试连接 master 节点
# 如果连接失败,可能需要取消下面注释并填入你的 master IP
# targets:
# default:
# - https://192.168.56.111:2379
# 6. Alertmanager 配置
alertmanager:
enabled: true
alertmanagerSpec:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-alertmanager
tag: v0.27.0
# 7. Grafana 配置 (镜像 + 侧边栏)
grafana:
enabled: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: "10.4.3"
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: "1.28.0"
# 确保 Grafana 自身也被监控
serviceMonitor:
enabled: true
EOF
第三步:执行升级命令
- 重新部署fix-monitor-final.yaml
helm upgrade monitoring ./kube-prometheus-stack-81.6.9.tgz \
--namespace monitoring \
-f fix-monitor-final.yaml \
--timeout 10m0s \
--wait \
--debug
kubectl get pods -n monitoring
问题2:ServiceMonitor的标签选择器与 Service 的实际标签不匹配
- 在 K8s master 上,查看 kube-system 命名空间下是有 kubelet、controller-manager 和 scheduler 的 Service:
kubectl get svc -n kube-system | grep -E "kubelet|controller-manager|scheduler"

问题根源:
执行 kubectl get svc -n kube-system 后看到: Service存在:monitoring-kube-prometheus-kubelet、controller-manager、scheduler 的Service 都已经创建成功(是 Helm 生成的)。
但Prometheus 没抓到数据:这说明 ServiceMonitor的标签选择器(Selector)与 Service 的实际标签不匹配,或者 端口名称(Port Name)不匹配。
特别是Kubelet,ServiceMonitor 要求标签必须包含 app.kubernetes.io/name: kubelet 和k8s-app: kubelet,但自动生成的 Service 可能缺少这些标签,或者端口名不是 https-metrics。
方法:手动修正标签与端口
既然自动生成的 Service 标签不对,手动给现有的 Service 打上正确的标签,不需要重新部署 Helm。 预期输出应该包含 app.kubernetes.io/name=kubelet 和 k8s-app=kubelet。
第一步:修复Kubelet Service标签
1. 给 Kubelet Service 添加缺失的标签
kubectl label svc monitoring-kube-prometheus-kubelet -n kube-system \
app.kubernetes.io/name=kubelet \
k8s-app=kubelet \
--overwrite
2. 确认标签已加上
kubectl get svc monitoring-kube-prometheus-kubelet -n kube-system --show-labels
第二步:修复 Controller Manager 和 Scheduler 的标签
1. 修复 Controller Manager 标签
# ServiceMonitor 寻找的标签通常是: app=kube-prometheus-stack-kube-controller-manager
kubectl label svc monitoring-kube-prometheus-kube-controller-manager -n kube-system \
app=kube-prometheus-stack-kube-controller-manager \
release=monitoring \
--overwrite
2. 修复 Scheduler 标签
kubectl label svc monitoring-kube-prometheus-kube-scheduler -n kube-system \
app=kube-prometheus-stack-kube-scheduler \
release=monitoring \
--overwrite
3. 确认标签
kubectl get svc -n kube-system | grep -E "controller|scheduler"
检查并修复端口名称
检查 Kubelet 的端口名
kubectl get svc monitoring-kube-prometheus-kubelet -n kube-system -o jsonpath='{.spec.ports}'
检查 Controller/Scheduler 的端口名
kubectl get svc monitoring-kube-prometheus-kube-controller-manager -n kube-system -o jsonpath='{.spec.ports}'
kubectl get svc monitoring-kube-prometheus-kube-scheduler -n kube-system -o jsonpath='{.spec.ports}'
第三步:强制刷新 Prometheus 配置
1 获取 Prometheus Pod 名字
POD_NAME=$(kubectl get pods -n monitoring -l app.kubernetes.io/name=kube-prometheus-stack-prometheus -o jsonpath="{.items[0].metadata.name}")
2 删除 Pod (StatefulSet 会自动重建它)
kubectl delete pod $POD_NAME -n monitoring
3 等待新 Pod 启动
kubectl wait --for=condition=Ready pod/$POD_NAME -n monitoring --timeout=120s
- 访问 prometheus 的 http://192.168.56.111:9090/targets,查看Kubernetes 节点上的 kubelet 组件指标是否正常




Kubelet 监控组件恢复正常
✅ Kubelet Metrics: 3/3 UP (所有节点的 /metrics 端点都正常)
✅ Kubelet Cadvisor: 3/3 UP (容器资源监控正常)
✅ Kubelet Probes: 3/3 UP (探针监控正常)
问题3:修改 Prometheus 数据源地址
- Grafana 仪表盘依然显示No data,但Prometheus的 数据采集 没问题,说明问题转移到了 数据查询 或 标签匹配 上


错误信息:
“Provisioned data source”
This data source was added by config and cannot be modified using the UI. Please contact your server admin to update this data source.
这个数据源是通过配置文件 Helm Chart 自动创建的,不能在 Grafana 网页直接修改!
方法:通过 Helm 修改 Grafana中的Prometheus 数据源地址
1 列出 monitoring 命名空间下所有已安装的 Helm Release(发布版本)
helm list -n monitoring
2 获取当前 Helm 配置
helm get values monitoring -n monitoring > prom-values.yaml
3 修改配置文件
vim prom-values.yaml
4 找到并修改 grafana 部分
url: http://monitoring-kube-prometheus-prometheus.monitoring:9090
改为:
url: http://192.168.56.111:9090
问题: prom-values.yaml中没有,grafana 的 url:
http://monitoring-kube-prometheus-prometheus.monitoring:9090原因:Helm Chart 的默认配置中,Grafana 的数据源是通过“服务发现”自动生成的(即使用 Kubernetes 内部域名monitoring-kube-prometheus-prometheus.monitoring),并没有在prom-values.yaml里显式写出这个 URL
方法:强制修改,需要在 grafana 配置块中,显式添加一个 datasources 配置项来覆盖默认行为
- prom-values-fixed.yaml
cat > prom-values-fixed.yaml << 'EOF'
alertmanager:
alertmanagerSpec:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-alertmanager
tag: v0.27.0
enabled: true
global:
imagePullSecrets:
- name: acr-secret
grafana:
enabled: true
# 新增部分:强制指定数据源 URL,覆盖默认的自动发现
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://192.168.56.111:9090
access: proxy
isDefault: true
editable: true
# 新增部分结束
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: 10.4.3
serviceMonitor:
additionalEndpoints:
- path: /metrics
port: 80
scheme: http
enabled: true
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: 1.28.0
kube-state-metrics:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/registry.k8s.io-kube-state-metrics-kube-state-metrics
tag: v2.12.0
prometheus:
enabled: true
prometheusSpec:
additionalScrapeConfigs:
- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
job_name: kubelet
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- replacement: kubernetes.default.svc:443
target_label: __address__
- replacement: /api/v1/nodes/${1}/proxy/metrics
source_labels:
- __meta_kubernetes_node_name
target_label: __metrics_path__
scheme: https
tls_config:
insecure_skip_verify: true
- job_name: kube-controller-manager
scheme: https
static_configs:
- targets:
- 192.168.56.111:10257
tls_config:
insecure_skip_verify: true
- job_name: kube-scheduler
scheme: https
static_configs:
- targets:
- 192.168.56.111:10259
tls_config:
insecure_skip_verify: true
- job_name: kube-etcd
scheme: https
static_configs:
- targets:
- 192.168.56.111:2379
tls_config:
insecure_skip_verify: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-prometheus
tag: v2.50.1
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 512Mi
serviceMonitorNamespaceSelector: {}
serviceMonitorSelectorNilUsesHelmValues: false
prometheus-node-exporter:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/prom-node-exporter
tag: v1.8.2
prometheusConfigReloader:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-config-reloader
tag: v0.77.0
prometheusOperator:
admissionWebhooks:
enabled: false
enabled: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-prometheus-operator-prometheus-operator
tag: v0.77.0
tls:
enabled: false
thanos:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/quay.io-thanos-thanos
tag: v0.36.1
EOF
helm upgrade monitoring prometheus-community/kube-prometheus-stack \
-n monitoring \
-f prom-values-fixed.yaml
验证是否成功等待所有 Pod 变成 Running:
kubectl get pods -n monitoring | grep grafana

问题4:Grafana 无法访问 Prometheus

错误信息:
Post "http://prometheus-k8s.monitoring.svc.cluster.local:9090/api/v1/query": dial tcp: lookup prometheus-k8s.monitoring.svc.cluster.local: i/o timeout
原因: Grafana 尝试通过 Kubernetes 内部 DNS 域名 prometheus-k8s.monitoring.svc.cluster.local 访问 Prometheus,但 DNS解析失败或网络超时。 就是Grafana Pod 找不到 Prometheus 服务!

方法:修改DNS 域名
- 把http://monitoring-kube-prometheus-prometheus.monitoring:9090 换成
http://192.168.56.111:9090 ,然后保存Save & test

问题4.1:无法远程获取 kube-prometheus-stack
错误信息:
Error: non-absolute URLs should be in form of repo_name/path_to_chart, got: kube-prometheus-stack
原因:
之前的部署方式是 本地离线安装(使用 ./kube-prometheus-stack-81.6.9.tgz),而不是从 Helm Repo 安装。 Helm 默认从远程仓库拉取 kube-prometheus-stack 图表。
但本地没有添加这个仓库
- 解决方法: Helm重新升级时,指定fix-grafana.yaml文件路径
fix-grafana.yaml (最终配置!)
cat > /home/ubuntu/fix-grafana.yaml << 'EOF'
grafana:
enabled: true
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
# 使用 Node IP + NodePort
url: http://192.168.56.111:9090
access: proxy
# 关键修改:去掉 isDefault: true,避免冲突
editable: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: "10.4.3"
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: "1.28.0"
EOF
- 执行Helm 升级 fix-grafana.yaml
helm upgrade monitoring kube-prometheus-stack \
-n monitoring \
-f fix-grafana.yaml \
--reuse-values
--reuse-values: 这个参数会保留你之前配置的所有镜像地址、Secrets 等,只修改刚才指定的 grafana.datasources 部分
问题4.2:grafana数据源冲突,指定Prometheus数据源(fix-grafana.yaml )
错误信息:
logger=provisioning t=... level=error msg="Failed to provision data sources"
error="Datasource provisioning error: datasource.yaml config is invalid.
Only one datasource per organization can be marked as default"
原因:
之前在 Grafana 里手动创建过或者通过 Sidecar 自动生成过一个 Prometheus数据源,并且那个数据源已经被标记为 isDefault: true。 现在你的新配置 (fix-grafana.yaml) 又强行塞进去一个 isDefault: true 的数据源。 Grafana 规定:每个组织只能有一个默认数据源。 冲突导致启动失败。
- fix-grafana.yaml配置文件中移除isDefault: true 标记,然后按照下面步骤重新执行即可
1 强制删除所有 Grafana Pod,重新拉起新配置
kubectl delete pod -n monitoring -l app.kubernetes.io/name=grafana --force --grace-period=0
2 等待几秒后执行升级
sleep 5
3 重新部署
helm upgrade monitoring /home/ubuntu/kube-prometheus-stack-81.6.9.tgz \
--namespace monitoring \
-f /home/ubuntu/fix-grafana.yaml \
--reuse-values \
--timeout 5m0s \
--wait
4 查看pod
kubectl get pods -n monitoring -l app.kubernetes.io/name=grafana -w
问题4.3:Grafana 数据源配置被 Sidecar 覆盖/冲突
- grafana删除旧的数据源配置

错误信息:
Post "http://prometheus-k8s.monitoring.svc.cluster.local:9090/api/v1/query":
dial tcp: lookup prometheus-k8s.monitoring.svc.cluster.local: i/o timeout
> Grafana 尝试通过 Kubernetes 内部 DNS 域名 prometheus-k8s.monitoring.svc.cluster.local 访问 Prometheus,但 DNS 解析失败或网络超时。 也就是说:Grafana Pod 找不到 Prometheus 服务!
原因:
虽然在 fix-grafana.yaml 中指定了url: http://192.168.56.111:9090但 Grafana 实际使用的 URL 是 http://prometheus-k8s.monitoring.svc.cluster.local:9090 —— 这是因为:
kube-prometheus-stack 的 Sidecar 机制会自动覆盖你手动配置的数据源!
使用 --reuse-values 升级时,Helm 会保留之前由 Operator/Sidecar 自动生成的数据源配置(包括那个错误的域名)
解决方案:强制覆盖数据源配置
删除旧的数据源配置(避免冲突)
确保我们的配置被正确应用(不被 Sidecar 覆盖)
修改 fix-grafana.yaml,明确指定 name 和 isDefault,更新你的配置文件,确保它不会被 Sidecar 覆盖:
cat > /home/ubuntu/fix-grafana.yaml << 'EOF'
grafana:
enabled: true
datasources:
datasources.yaml:
apiVersion: 1
deleteDatasources:
- name: prometheus-1 # 删除自动生成的错误数据源
orgId: 1
datasources:
- name: Prometheus # 明确命名为 "Prometheus"
type: prometheus
url: http://192.168.56.111:9090
access: proxy
isDefault: true # 设为默认,避免多个默认冲突
editable: true
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/grafana-grafana
tag: "10.4.3"
sidecar:
image:
registry: crpi-ua3er91ww0y2dq1i.cn-shenzhen.personal.cr.aliyuncs.com
repository: mirrors-yuan/kiwigrid-k8s-sidecar
tag: "1.28.0"
# 关键:禁用 sidecar 对 datasources 的自动管理
datasources:
enabled: false
EOF
echo "配置文件已更新:删除旧数据源 + 禁用 sidecar 自动管理"
1 删除所有 Grafana Pod,触发重建
kubectl delete pod -n monitoring -l app.kubernetes.io/name=grafana --force --grace-period=0
2 等待几秒后升级
sleep 5
3 重新部署
helm upgrade monitoring /home/ubuntu/kube-prometheus-stack-81.6.9.tgz \
--namespace monitoring \
-f /home/ubuntu/fix-grafana.yaml \
--reuse-values \
--timeout 5m0s \
--wait
更多推荐




所有评论(0)