基于已有Kubernetes CronJob,如何创建监控数据库表的邮件通知任务?
实现Kubernetes CronJob监控数据库表并发送通知的步骤
1. 编写数据库检查与通知的Python脚本
参考你已有的Python脚本结构,编写核心逻辑:连接数据库查询tbl_scheduled_upgrades表,计算scheduled_date与当前日期的差值,当差值等于14天时触发通知。
示例脚本(适配PostgreSQL,可根据你的数据库类型调整):
import os import psycopg2 from datetime import datetime, timedelta import smtplib from email.mime.text import MIMEText def main(): # 从环境变量读取配置 db_host = os.getenv("DB_HOST") db_port = os.getenv("DB_PORT", "5432") db_user = os.getenv("DB_USER") db_password = os.getenv("DB_PASSWORD") db_name = os.getenv("DB_NAME") smtp_server = os.getenv("SMTP_SERVER") smtp_port = os.getenv("SMTP_PORT", "587") smtp_user = os.getenv("SMTP_USER") smtp_password = os.getenv("SMTP_PASSWORD") notify_recipients = os.getenv("NOTIFY_RECIPIENTS").split(",") # 计算两周后的目标日期 target_date = datetime.now().date() + timedelta(days=14) try: # 连接数据库 conn = psycopg2.connect( host=db_host, port=db_port, user=db_user, password=db_password, dbname=db_name ) cur = conn.cursor() # 查询符合条件的未完成升级任务 query = """ SELECT id, upgrade_name, scheduled_date FROM tbl_scheduled_upgrades WHERE DATE(scheduled_date) = %s AND status != 'completed' """ cur.execute(query, (target_date,)) records = cur.fetchall() if records: # 构造通知内容 content = f"发现{len(records)}个即将在两周后执行的升级任务:\n\n" for rec in records: content += f"ID: {rec[0]}, 升级名称: {rec[1]}, 执行日期: {rec[2].strftime('%Y-%m-%d')}\n" # 发送邮件通知 msg = MIMEText(content) msg["Subject"] = "【升级任务提醒】两周后将有系统升级执行" msg["From"] = smtp_user msg["To"] = ",".join(notify_recipients) with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(smtp_user, smtp_password) server.send_message(msg) print("通知发送成功") else: print("没有符合条件的升级任务") cur.close() conn.close() except Exception as e: print(f"执行出错: {str(e)}") raise if __name__ == "__main__": main()
2. 打包脚本为Docker镜像
参考你已有CronJob使用的镜像基础(比如python:3.9-slim),编写Dockerfile:
FROM python:3.9-slim WORKDIR /app COPY check_upgrades.py . RUN pip install psycopg2-binary CMD ["python", "check_upgrades.py"]
构建并推送镜像到你的私有镜像仓库(替换为你的仓库地址):
docker build -t your-registry/check-upgrades:v1 . docker push your-registry/check-upgrades:v1
3. 编写CronJob YAML配置
参考已有CronJob的结构,配置调度规则、环境变量(敏感信息用Secret存储):
apiVersion: batch/v1 kind: CronJob metadata: name: upgrade-notifier labels: app: upgrade-monitor spec: # 每天凌晨2点执行一次,可根据需求调整Cron表达式 schedule: "0 2 * * *" jobTemplate: spec: template: spec: containers: - name: check-upgrades image: your-registry/check-upgrades:v1 env: - name: DB_HOST value: "your-db-service-name" - name: DB_PORT value: "5432" - name: DB_NAME value: "your-db-name" - name: DB_USER valueFrom: secretKeyRef: name: db-secrets key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secrets key: password - name: SMTP_SERVER value: "your-smtp-server" - name: SMTP_USER valueFrom: secretKeyRef: name: notify-secrets key: smtp-username - name: SMTP_PASSWORD valueFrom: secretKeyRef: name: notify-secrets key: smtp-password - name: NOTIFY_RECIPIENTS value: "user1@example.com,user2@example.com" restartPolicy: OnFailure
4. 部署与验证
- 确保Secret已创建(如果已有数据库/通知相关的Secret,直接复用即可):
# 创建数据库Secret示例 kubectl create secret generic db-secrets --from-literal=username=db-user --from-literal=password=db-pass # 创建通知Secret示例 kubectl create secret generic notify-secrets --from-literal=smtp-username=smtp-user --from-literal=smtp-password=smtp-pass
- 部署CronJob:
kubectl apply -f upgrade-notifier-cronjob.yaml
- 手动触发一次Job验证逻辑:
kubectl create job --from=cronjob/upgrade-notifier test-upgrade-notifier
- 查看Pod日志确认执行结果:
kubectl logs -f <pod-name>
注意事项
- 对齐已有CronJob的配置风格,比如使用ConfigMap存配置文件、特定的镜像版本、重启策略等,减少维护成本。
- 通知方式可替换为Slack、企业微信等,只需修改Python脚本中的通知逻辑部分。
- Cron表达式可根据需求调整,比如每天多次执行、每周执行等。
内容的提问来源于stack exchange,提问作者cojocaru robert
相关产品推荐
相关产品推荐

