aidict · app 命名空间的 HTTP 微服务

aidict 是 yldm 集群里 app 类目下的一个无状态 HTTP 微服务,镜像来自 ghcr.io/yldm-tech/aidict,监听 8080 端口并暴露 /health/live/health/ready/metrics 等标准端点。它通过 ExternalSecret 从 Vault 取数据库与 JWT 凭证,连接 Postgres(经 pgbouncer)和 Redis,并把自己注册进 Consul 做服务发现。

部署形态

aidict 由 ApplicationSet yldm-services 生成的 Application app-aidict 部署,对应 applications/app/aidict/,kustomization 设置 namespace: appnamePrefix: app-

  • Name
    命名空间
    Description
    app
  • Name
    工作负载类型
    Description
    Deployment(无状态,无 PVC)
  • Name
    镜像与版本
    Description
    ghcr.io/yldm-tech/aidict,kustomization images: 块当前 tag 为 2.5.0(argocd-image-updater 的 semver 回写目标,是实际部署版本;deployment.yaml 内联的 2.3.1 会被 kustomize 覆盖)。
  • Name
    副本数
    Description
    2(kustomization replicas 与 deployment replicas 均为 2)
  • Name
    调度
    Description
    nodeSelector: workload=app;并配 podAntiAffinity(preferred,权重 100,按 app=aidict 标签 + kubernetes.io/hostname 拓扑打散两副本)。priorityClassName: production-medium
  • Name
    端口
    Description
    容器端口 8080(name http
  • Name
    资源
    Description
    requests 50m CPU / 64Mi,limits 200m CPU / 256Mi
  • Name
    滚动策略
    Description
    maxUnavailable: 0 + maxSurge: 1,配合 imagePullSecrets: ghcr-secret 拉私有镜像

deployment 被打上 reloader.stakater.com/auto: "true" 注解,配置或 secret 变更时由 Reloader 自动触发滚动。

配置与依赖

容器以 CONFIG_FILE=configs/services/aidict.yaml 启动,配置来自两个 ConfigMap 挂载:共享的 base-config 挂到 /root/configs/base,服务专属的 aidict-config 以 subPath 挂到 /root/configs/services/aidict.yaml

aidict-config 继承 base/production.yaml 并覆盖关键字段:

database:
  database: ${DB_NAME:yldm_aidict}
redis:
  db: ${REDIS_DB:5}
tracing:
  service_name: yldm-aidict
pubsub:
  prefix: yldm:aidict
  redis:
    db: ${REDIS_PUBSUB_DB:1}
  dead_letter:
    key: yldm:aidict:deadletter
consul: {}

运行依赖:

  • Name
    数据库 (Postgres)
    Description
    通过 DB_HOST=pgbouncer.postgres.svc.cluster.local 连接,走 pgbouncer 连接池;默认库名 yldm_aidict。其余 DB_PORT/DB_NAME/DB_USER/DB_PASSWORD 来自 secret。
  • Name
    Redis
    Description
    主机/端口/密码/库号均来自 secret;业务库 REDIS_DB 默认 5,pubsub 单独用 REDIS_PUBSUB_DB(默认 1),死信键 yldm:aidict:deadletter
  • Name
    Consul
    Description
    CONSUL_ENABLED=trueCONSUL_ADDR=consul.consul.svc.cluster.local:8500,以 SERVER_NAME=aidict 注册服务发现。
  • Name
    JWT
    Description
    JWT_SECRET / JWT_EXPIRES_IN / JWT_REFRESH_EXPIRES_IN 来自 secret,说明该服务自带鉴权。

凭证通过 ExternalSecret aidict-db-secret 从 ClusterSecretStore vault-backend 拉取,刷新间隔 1h,生成同名 Secret。绝大多数 key(db**、redis*_、jwt__)来自 Vault 路径 yldm/production/aidict,另有 DB_ADMIN_USER / DB_ADMIN_PASSWORD 取自共享路径 yldm/database。其余固定 env:ENV/ENVIRONMENT=productionSERVER_MODE=releaseSERVER_PORT=8080SWAGGER_AUTO_GEN=false

访问与监控

Service app-aidict 是默认 ClusterIP 类型,把集群内 80 端口转发到 Pod 的 8080(name http)。仓库内没有该服务的 Ingress,即它当前只在集群内部可达,未直接对外暴露。

健康检查:livenessProbe 打 /health/live(初始延迟 30s,周期 10s),readinessProbe 打 /health/ready(初始延迟 15s,周期 5s,超时 5s)。

  • Name
    ServiceMonitor
    Description
    有。app-aidict 每 30s 抓 http 端口的 /metrics,并把 pod 名、namespace、app 标签 relabel 成 pod/namespace/service
  • Name
    PrometheusRule
    Description
    有。aidict.rules 覆盖 Pod 掉线(up==0,critical)、副本不足、HTTP 5xx 错误率(warning >3% / critical >5%)、P95 延迟(warning >0.5s / critical >1s)、频繁重启、CPU/内存超 80% 等告警。
  • Name
    HPA
    Description
    有。aidict-hpa 按 CPU 70% / 内存 80% 利用率在 2–5 副本间伸缩。
  • Name
    VPA
    Description
    有。aidict-vpaupdateMode: "Off"(仅给推荐,不自动改),区间 25m–500m CPU / 32Mi–512Mi。
  • Name
    PDB
    Description
    有。maxUnavailable: 1(符合本仓库对该规模服务的 PDB 约定,避免 minAvailable 卡住节点 drain)。

评论