scheduler · 集群内的任务调度服务

scheduler 是部署在 platform 命名空间的后端服务(镜像 ghcr.io/yldm-tech/scheduler),监听 8080 端口、暴露 /health/live/health/ready 健康检查与 /metrics 指标端点。从配置可以看出它由三部分组成:一个调度器(scheduler.interval_seconds: 60 周期扫描)、一个 worker 池(worker.pool_size 默认 5,轮询取任务执行),以及一个 HTTP/API 服务。任务状态持久化在 MySQL(库名 yldm_scheduler),任务事件通过 Redis pubsub 分发并带死信队列。

部署形态

  • Name
    命名空间
    Description
    platform(kustomization 设置 namespace: platformnamePrefix: platform-,资源名形如 platform-scheduler-*
  • Name
    工作负载
    Description
    Deployment,replicas: 2,滚动更新策略 maxUnavailable: 0 / maxSurge: 1(升级时不减容、最多多起一个),revisionHistoryLimit: 2
  • Name
    镜像与版本
    Description
    ghcr.io/yldm-tech/scheduler:2.3.1,tag 由 argocd-image-updater 按 semver 写回 kustomization 的 images: 块管理,不要手动 pin
  • Name
    调度
    Description
    nodeSelector: workload=app,落在 app 工作负载节点;priorityClassName: production-medium;podAntiAffinity 以 topologyKey: kubernetes.io/hostname 偏好(preferred,权重 100)把两个副本打散到不同节点
  • Name
    端口
    Description
    容器 containerPort: 8080(name http);Service 以 port: 80 → targetPort: 8080 暴露
  • Name
    资源
    Description
    requests cpu: 50m / memory: 64Mi,limits cpu: 200m / memory: 256Mi
  • Name
    存储
    Description
    无 PVC,仅挂载 ConfigMap(base-configscheduler-config)为只读配置卷
  • Name
    拉取凭证
    Description
    imagePullSecrets: ghcr-secret(GHCR 私有镜像)

配置与依赖

配置走「base 继承 + 服务覆盖」两层:容器挂载 base-config ConfigMap 到 /root/configs/base,再用本服务的 scheduler-configconfigmap.yaml)覆盖到 /root/configs/services/scheduler.yaml,env CONFIG_FILE 指向后者。两个 ConfigMap 都带 reloader.stakater.com/auto: "true" 注解(kustomization patch 注入),配置变更后 Reloader 会自动滚动 Pod。

服务配置(scheduler.yaml)的要点:

配置项说明
database.database${DB_NAME:yldm_scheduler}任务持久化库
redis.db${REDIS_DB:8}主 Redis 逻辑库
redis.pubsub db${REDIS_PUBSUB_DB:1}pubsub 专用库,前缀 yldm:scheduler,死信 key yldm:scheduler:deadletter
worker.pool_size${WORKER_POOL_SIZE:5}worker 并发数
worker.poll_interval_seconds${WORKER_POLL_INTERVAL:5}worker 轮询间隔
worker.task_timeout_seconds${WORKER_TASK_TIMEOUT:1800}单任务超时 30 分钟
scheduler.interval_seconds60调度器扫描周期
tracing.service_nameyldm-scheduler链路追踪服务名

敏感凭证由 ExternalSecret scheduler-db-secret 从 ClusterSecretStore vault-backend 同步(refreshInterval: 1h),生成同名 K8s Secret 供 Deployment 以 secretKeyRef 注入。绝大多数键取自 Vault 路径 yldm/production/scheduler(DB 连接、Redis 连接、JWT_SECRET 及过期配置等),实现了「服务独立 Secret、数据库凭证隔离」;另外 DB_ADMIN_USER / DB_ADMIN_PASSWORD 取自共享路径 yldm/database

依赖项:

  • Name
    MySQL
    Description
    通过 DB_HOST / DB_PORT / DB_NAME / DB_USER / DB_PASSWORD 连接,任务库 yldm_scheduler;另持有 DB_ADMIN_* 管理凭证
  • Name
    Redis
    Description
    REDIS_* 连接,库 8 做缓存/队列、库 1 做 pubsub
  • Name
    Consul
    Description
    CONSUL_ENABLED=true,向 consul.consul.svc.cluster.local:8500 注册服务(SERVER_NAME=scheduler,端口 8080)
  • Name
    SMTP(可选)
    Description
    配置预留邮件 SMTP(SMTP_*,默认发件 noreply@yldm.tech),未提供则不启用

env 还设置了运行模式 ENV / ENVIRONMENT=productionSERVER_MODE=releaseSWAGGER_AUTO_GEN=false

访问与监控

Service 为默认 ClusterIP(仅集群内访问),无 Ingress,外部不直接暴露。

  • Name
    ServiceMonitor
    Description
    scheduler,按 app=scheduler 选择,30s 抓取 http 端口 /metrics,并 relabel 出 pod / namespace / service 标签
  • Name
    PrometheusRule
    Description
    规则组 scheduler.rules 覆盖:Pod 掉线(up==0,critical)、副本不足、HTTP 5xx 错误率(>3% warning / >5% critical)、P95 延迟(>0.5s warning / >1s critical)、频繁重启、CPU/内存用量超 limit 80%
  • Name
    VPA
    Description
    scheduler-vpaupdateMode: "Off"(仅推荐不自动改),范围 cpu 25m–500m / memory 32Mi–512Mi
  • Name
    PDB
    Description
    schedulermaxUnavailable: 1,配合双副本,保证节点 drain 时至少留一个 Pod
  • Name
    健康检查
    Description
    liveness /health/live(initialDelay 30s / period 10s),readiness /health/ready(initialDelay 15s / period 5s / timeout 5s)

返回 platform 总览

评论