跳转至

项目环境变更日志

本文档记录项目开发过程中对本地环境、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 同步,请勿在站点侧修改)