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 分发并带死信队列。
applications/platform/scheduler/ 下的 K8s 清单,描述的是它在集群里的技术形态。部署形态
- Name
- 命名空间
- Description
- platform(kustomization 设置
namespace: platform、namePrefix: 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,limitscpu: 200m/memory: 256Mi
- Name
- 存储
- Description
- 无 PVC,仅挂载 ConfigMap(
base-config与scheduler-config)为只读配置卷
- Name
- 拉取凭证
- Description
imagePullSecrets: ghcr-secret(GHCR 私有镜像)
配置与依赖
配置走「base 继承 + 服务覆盖」两层:容器挂载 base-config ConfigMap 到 /root/configs/base,再用本服务的 scheduler-config(configmap.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_seconds | 60 | 调度器扫描周期 |
tracing.service_name | yldm-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=production、SERVER_MODE=release、SWAGGER_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-vpa,updateMode: "Off"(仅推荐不自动改),范围 cpu 25m–500m / memory 32Mi–512Mi
- Name
- PDB
- Description
scheduler,maxUnavailable: 1,配合双副本,保证节点 drain 时至少留一个 Pod
- Name
- 健康检查
- Description
- liveness
/health/live(initialDelay 30s / period 10s),readiness/health/ready(initialDelay 15s / period 5s / timeout 5s)
返回 platform 总览