项目环境变更日志¶
本文档记录项目开发过程中对本地环境、SSH远程主机、Kubernetes集群等所做的所有修改和操作,便于追踪和复盘。
目录¶
一、本地环境修改¶
1.1 Python依赖安装¶
操作时间:项目启动阶段
命令:
pip3 install python-dotenv requests pymysql prometheus-client pyyaml Pillow openai
变更说明:安装项目所需的所有Python依赖包
1.2 定时任务配置¶
操作时间:项目收尾阶段
命令:
# 添加定时任务(每天20:00执行)
(crontab -l 2>/dev/null; echo "0 20 * * * cd /home/rian/Documents/electricity_monitoring && python3 entry_electric_task.py >> /home/rian/Documents/electricity_monitoring/logs/ele_monitor.log 2>&1") | crontab -
# 验证
crontab -l
变更说明:配置Linux crontab定时任务,每天晚上20:00自动执行数据采集脚本
结果:定时任务已生效,日志输出到 logs/ele_monitor.log
1.3 日志目录创建¶
操作时间:项目启动阶段
命令:
mkdir -p /home/rian/Documents/electricity_monitoring/logs
变更说明:创建日志目录,用于存储任务执行日志
1.4 .env配置文件修改¶
操作时间:项目启动阶段
变更内容:
| 参数 | 修改前 | 修改后 | 说明 |
|---|---|---|---|
DB_HOST |
- | 192.168.0.2 |
MySQL服务器IP |
DB_PASSWORD |
- | Rain--4630 |
MySQL密码 |
ARK_API_KEY |
- | ark-d6eaad0e-xxx |
火山方舟API密钥 |
ARK_BASE_URL |
- | https://ark.cn-beijing.volces.com/api/v3 |
API地址 |
ARK_MODEL |
- | doubao-seed-2-0-mini-260428 |
豆包模型名称 |
PICS_DIR |
- | ./Pics |
图片扫描目录 |
MAX_SCAN_COUNT |
- | 1 |
每次扫描最大图片数 |
YEAR_CUMULATIVE_BASE |
- | 1973.56 |
年初累计基线 |
1.5 entry_electric_task.py修改¶
操作时间:项目中期
变更内容:移除PushGateway推送步骤,改为Electric Exporter方案
修改前:
# 推送Prometheus指标到PushGateway
electric_prom.push_current_month_metrics()
修改后:
# Electric Exporter将自动从MySQL抓取最新数据
说明:因PushGateway不支持自定义时间戳,改用Electric Exporter方案
二、Kubernetes集群操作¶
2.1 部署Electric Exporter¶
操作时间:项目中期
命令:
# 首次部署到server命名空间(后移至monitoring)
kubectl apply -f k8s/electric-exporter.yaml -n server
# 移至monitoring命名空间
kubectl delete -f k8s/electric-exporter.yaml -n server
kubectl apply -f k8s/electric-exporter.yaml -n monitoring
变更内容: - 创建ConfigMap:包含exporter.py代码和数据库连接配置 - 创建Secret:存储MySQL密码 - 创建Deployment:运行Electric Exporter Pod - 创建Service:暴露9105端口 - 创建ServiceMonitor:供Prometheus自动发现
结果:Electric Exporter在monitoring命名空间运行正常,Prometheus成功抓取指标
2.2 部署PushGateway(备选方案)¶
操作时间:项目初期
命令:
kubectl apply -f k8s/pushgateway.yaml -n monitoring
变更内容: - 创建Deployment:运行PushGateway - 创建Service:暴露9091端口 - 创建ServiceMonitor:供Prometheus抓取
结果:部署成功但因不支持自定义时间戳被弃用,保留为备选方案
2.3 升级kube-prometheus-stack¶
操作时间:项目中期(解决TSDB块加载问题)
命令:
helm upgrade prometheus kube-prometheus-stack/kube-prometheus-stack \
--version 45.16.0 \
-f /tmp/prom-upgrade-values.yaml \
-n monitoring
变更说明: - 从版本35.5.0升级到45.16.0 - Prometheus版本从v2.35.0升级到v2.42.0 - 支持additionalArgs等新字段
结果:升级成功,Prometheus版本更新到v2.42.0
2.4 创建NFS PV/PVC¶
操作时间:项目中期(持久化配置)
命令:
# MySQL持久化
kubectl apply -f pv/02-mysql-data-pv.yaml
# Prometheus持久化
kubectl apply -f pv/03-prometheus-data-pv.yaml
# Grafana持久化(后期添加)
kubectl apply -f pv/grafana-data-pv.yaml
变更内容:
- PV:mysql-data-nfs-pv,指向NFS /data/softdata/mysql
- PVC:mysql-data-nfs-pvc,10Gi容量
- PV:prometheus-data-nfs-pv,指向NFS /data/softdata/prometheus
- PVC:prometheus-data-nfs-pvc,20Gi容量
- PV:grafana-data-nfs-pv,指向NFS /data/softdata/grafana
- PVC:grafana-data-nfs-pvc,10Gi容量
2.5 修复Grafana持久化存储¶
操作时间:项目后期(解决配置丢失问题)
命令:
# 修改Grafana Deployment,将storage从emptyDir改为PVC
kubectl edit deployment prometheus-grafana -n monitoring
变更内容:
- 将volumes中的emptyDir替换为persistentVolumeClaim
- 指定PVC名称为grafana-data-nfs-pvc
结果:Grafana配置持久化,重启后配置不丢失
2.6 修复Prometheus TSDB损坏¶
操作时间:项目中期
命令:
# 1. 缩容Prometheus到0
kubectl scale sts prometheus-kube-prometheus-prometheus -n monitoring --replicas=0
# 2. 创建临时Pod清理数据
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: cleanup-prom
namespace: monitoring
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus-data-nfs-pvc
containers:
- name: cleanup
image: busybox
command: ["sh", "-c", "rm -rf /data/* && sleep 3600"]
volumeMounts:
- name: data
mountPath: /data
EOF
kubectl exec -it cleanup-prom -- rm -rf /data/*
# 3. 删除临时Pod
kubectl delete pod cleanup-prom
# 4. 恢复Prometheus副本数
kubectl scale sts prometheus-kube-prometheus-prometheus -n monitoring --replicas=1
变更说明:因导入历史数据块导致TSDB元数据损坏,清空所有数据重新初始化
结果:Prometheus恢复正常,所有targets正常抓取
2.7 恢复Prometheus Operator¶
操作时间:项目中期
命令:
# 之前为修改StatefulSet而暂停了Operator
kubectl scale deploy prometheus-kube-prometheus-operator -n monitoring --replicas=1
变更说明:Operator之前被缩容到0(用于临时修改StatefulSet),修改完成后恢复
结果:Operator正常reconcile,自动重建了Prometheus StatefulSet
2.8 修改IngressRouteTCP¶
操作时间:项目后期(恢复对外暴露)
命令:
# 检查现有IngressRouteTCP
kubectl get ingressroutetcp -n monitoring
# 修改grafana-ingress.yaml中的service port(从3000改为80)
kubectl apply -f kube-prometheus-stack/templates/grafana-ingress.yaml
# 重新apply所有IngressRoute
kubectl apply -f kube-prometheus-stack/templates/
变更内容:
- 修正Grafana IngressRoute的service port:3000 → 80(升级后svc的port变为80)
结果:Grafana、Prometheus、Alertmanager均通过traefik正常对外暴露
2.9 修改Grafana Deployment(密码配置)¶
操作时间:项目后期
命令:
# 修改Grafana Secret中的admin密码
kubectl patch secret prometheus-grafana -n monitoring -p '{"data":{"admin-password":"'"$(echo -n 'Rain--4630' | base64)"'"}}'
# 重启Grafana Pod
kubectl delete pod -l app=grafana -n monitoring
变更说明:将Grafana管理员密码改为Rain--4630
结果:Grafana登录密码恢复为用户指定的密码
2.10 清理server命名空间旧资源¶
操作时间:项目中期
命令:
kubectl delete deployment electric-exporter -n server
kubectl delete service electric-exporter -n server
kubectl delete servicemonitor electric-exporter -n server
kubectl delete configmap electric-exporter-config -n server
kubectl delete secret electric-exporter-secret -n server
变更说明:删除server命名空间的旧Electric Exporter部署,统一使用monitoring命名空间
三、NFS服务器操作¶
3.1 创建目录¶
操作时间:项目中期
命令(通过SSH执行):
# MySQL数据目录
mkdir -p /data/softdata/mysql
# Prometheus数据目录
mkdir -p /data/softdata/prometheus
# Grafana数据目录
mkdir -p /data/softdata/grafana
变更说明:在NFS服务器上创建三个持久化存储目录
3.2 修改目录权限¶
操作时间:项目中期
命令(通过SSH执行):
# Prometheus目录权限(Prometheus容器使用uid:1000, gid:2000)
chmod 777 /data/softdata/prometheus
chown 1000:2000 /data/softdata/prometheus
# MySQL目录权限
chmod 777 /data/softdata/mysql
# Grafana目录权限
chmod 777 /data/softdata/grafana
变更说明:解决Pod挂载NFS后权限不足的问题
3.3 重启NFS服务¶
操作时间:项目中期
命令(通过SSH执行):
systemctl restart nfs-server
变更说明:解决NFS stale file handle问题
四、Grafana配置操作¶
4.1 添加MySQL数据源¶
操作时间:项目中期
API调用:
curl -X POST http://localhost:3000/api/datasources \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Rain--4630' | base64)" \
-d '{
"name": "MySQL-Electric",
"type": "mysql",
"url": "mysql-svc.server.svc.cluster.local:3306",
"database": "electric_monitor",
"user": "root",
"password": "Rain--4630",
"access": "proxy",
"isDefault": false
}'
变更说明:添加MySQL数据源,用于Grafana直查数据库
结果:数据源创建成功,uid为aY8YGFEvz
4.2 导入监控大盘¶
操作时间:项目多次执行
API调用:
curl -X POST http://localhost:3000/api/dashboards/db \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:Rain--4630' | base64)" \
-d @grafana_dashboard.json
变更说明:导入家庭日用电量监控大盘
结果:Dashboard导入成功,uid为electric-power-dashboard,id为27
4.3 修改Dashboard配置¶
操作时间:项目后期(多次迭代)
变更内容:
| 版本 | 变更内容 |
|---|---|
| v1 | 初始版本,使用Prometheus数据源 |
| v2 | 切换为MySQL数据源,修复No data问题 |
| v3 | 修改单位显示(kWh→度,currencyCNY→元) |
| v4 | 移除K/M缩写(unit: none) |
| v5 | 启用柱状图数据标签 |
| v6 | 修复使用说明面板 |
五、Prometheus操作¶
5.1 检查Targets状态¶
操作时间:项目全程
命令:
kubectl port-forward svc/prometheus-kube-prometheus-prometheus -n monitoring 9090:9090 &
# 通过API检查
curl http://localhost:9090/api/v1/targets
变更说明:验证Prometheus是否成功抓取Electric Exporter指标
结果:56/72 targets up,Electric Exporter正常
5.2 尝试导入TSDB块(未成功)¶
操作时间:项目中期
命令:
# 创建TSDB块
promtool tsdb create-blocks-from openmetrics \
--start=2026-06-01T00:00:00Z \
--end=2026-07-24T23:59:59Z \
--input.file=/tmp/metrics.txt \
--output.dir=/tmp/blocks
# 复制到Prometheus数据目录
kubectl cp /tmp/blocks prometheus-kube-prometheus-prometheus-0:/prometheus/
# 修改块meta.json的maxTime
kubectl exec -it prometheus-kube-prometheus-prometheus-0 -- \
sed -i 's/"maxTime": [0-9]*/"maxTime": '"$((minTime + 7200000))"'/' /prometheus/01Hxxx/meta.json
变更说明:尝试导入历史数据块,但被Prometheus自动标记为obsolete并删除
结果:方案失败,改用MySQL直查方案
5.3 尝试修改启动参数(未成功)¶
操作时间:项目中期
命令:
# 通过Prometheus CRD添加参数(旧版本不支持)
kubectl edit prometheus prometheus-kube-prometheus-prometheus -n monitoring
变更说明:尝试添加--storage.tsdb.min-time参数,旧版本Operator不支持
结果:方案失败,Operator覆盖配置
变更汇总表¶
| 类别 | 操作数量 | 影响范围 |
|---|---|---|
| 本地环境 | 5项 | Python依赖、定时任务、配置文件 |
| K8s集群 | 10项 | Deployment、Service、PV/PVC、IngressRoute |
| NFS服务器 | 3项 | 目录创建、权限修改、服务重启 |
| Grafana | 3项 | 数据源、Dashboard导入、配置修改 |
| Prometheus | 3项 | Targets检查、TSDB导入尝试、参数修改尝试 |
文档版本:v1.0 最后更新:2026年7月
来源:
/home/rain/Documents/electricity_monitoring/docs/CHANGELOG.md| 最后更新:2026-07-24 22:06(由build/sync.py同步,请勿在站点侧修改)