You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于已有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:50:34