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: app 与 namePrefix: app-。
- Name
- 命名空间
- Description
- app
- Name
- 工作负载类型
- Description
- Deployment(无状态,无 PVC)
- Name
- 镜像与版本
- Description
ghcr.io/yldm-tech/aidict,kustomizationimages:块当前 tag 为2.5.0(argocd-image-updater 的 semver 回写目标,是实际部署版本;deployment.yaml 内联的2.3.1会被 kustomize 覆盖)。
- Name
- 副本数
- Description
- 2(kustomization
replicas与 deploymentreplicas均为 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=true,CONSUL_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=production、SERVER_MODE=release、SERVER_PORT=8080、SWAGGER_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-vpa为updateMode: "Off"(仅给推荐,不自动改),区间 25m–500m CPU / 32Mi–512Mi。
- Name
- PDB
- Description
- 有。
maxUnavailable: 1(符合本仓库对该规模服务的 PDB 约定,避免minAvailable卡住节点 drain)。