magicbox · app 类别下的后端 HTTP 服务
magicbox 是运行在 app 命名空间的后端 HTTP 服务,监听 8080 端口并暴露 /metrics、/health/live、/health/ready,对外通过 ClusterIP Service 的 80 端口接入。
从 manifest 可确认它是一个无状态服务:没有 PVC,没有 StatefulSet,凭据全部由 ExternalSecret 从 Vault 注入,并向 Consul 注册自身。镜像由 ghcr.io/yldm-tech/magicbox 提供,标签由 argocd-image-updater 写回到 kustomization 的 images: 块。这里只描述 manifest 中可验证的技术事实,不推断其业务用途。
部署形态
- Name
- 命名空间
- Description
- app(kustomization 设
namespace: app、namePrefix: app-,生成资源app-magicbox-*)
- Name
- 工作负载类型
- Description
- Deployment,
revisionHistoryLimit: 2,滚动更新maxUnavailable: 0/maxSurge: 1
- Name
- 镜像与版本
- Description
ghcr.io/yldm-tech/magicbox,kustomizationimages:锁定newTag: 2.4.0(覆盖 deployment.yaml 内联的2.2.38,以images:为部署版本的权威来源)
- Name
- 副本数
- Description
- 2(kustomization
replicas.count: 2,与 deploymentreplicas: 2一致)
- Name
- 调度
- Description
nodeSelector: workload=app;通过 kustomization patch 注入priorityClassName: production-medium与按app=magicbox标签、topologyKey: kubernetes.io/hostname的软性podAntiAffinity(preferred,权重 100),使两副本尽量分散到不同节点
- Name
- 端口
- Description
- 容器
containerPort: 8080(namehttp);Service 以 80 端口转发至 8080
- Name
- 资源
- Description
- requests
cpu 50m/memory 64Mi,limitscpu 200m/memory 256Mi
- Name
- 存储
- Description
- 无持久卷,仅挂载两个 ConfigMap(
base-config挂到/root/configs/base、magicbox-config以 subPath 挂为/root/configs/services/magicbox.yaml),均readOnly
- Name
- 健康探针
- Description
- livenessProbe
GET /health/live(initialDelay 30s,period 10s);readinessProbeGET /health/ready(initialDelay 15s,period 5s,timeout 5s)
- Name
- 镜像拉取
- Description
imagePullSecrets: ghcr-secret
配置与依赖
容器以环境变量驱动:ENV / ENVIRONMENT = production、SERVER_MODE = release、SERVER_PORT = 8080、SERVER_NAME = magicbox、SWAGGER_AUTO_GEN = false,配置文件路径 CONFIG_FILE = configs/services/magicbox.yaml。
ConfigMap magicbox-config 提供 magicbox.yaml,继承 base 生产配置并覆盖:数据库 database: ${DB_NAME:yldm_magic_box}、Redis db: ${REDIS_DB:1}、tracing service_name: yldm-magicbox、pubsub 前缀 yldm:magicbox(死信键 yldm:magicbox:deadletter、Redis db ${REDIS_PUBSUB_DB:1}),以及空的 consul: {} 块。kustomization 通过 patch 给 Deployment 加 reloader.stakater.com/auto: "true" 注解,ConfigMap 变更会触发自动滚动重启。
数据库连接固定指向 pgbouncer.postgres.svc.cluster.local(DB_HOST),即经 PgBouncer 连接池访问 PostgreSQL;Consul 服务注册开启,CONSUL_ENABLED = true、CONSUL_ADDR = consul.consul.svc.cluster.local:8500。
敏感凭据由 ExternalSecret magicbox-db-secret 经 ClusterSecretStore vault-backend 同步(refreshInterval: 1h),落地为同名 Secret 供 valueFrom.secretKeyRef 引用:
| Secret key | Vault remoteRef.key | property |
|---|---|---|
| DB_PORT / DB_NAME / DB_USER / DB_PASSWORD | yldm/production/magicbox | db_port / db_name / db_user / db_password |
| REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_DB / REDIS_PUBSUB_DB | yldm/production/magicbox | redis_host / redis_port / redis_password / redis_db / redis_pubsub_db |
| JWT_SECRET / JWT_EXPIRES_IN / JWT_REFRESH_EXPIRES_IN | yldm/production/magicbox | jwt_secret / jwt_expires_in / jwt_refresh_expires_in |
| DB_ADMIN_USER / DB_ADMIN_PASSWORD | yldm/database | user / password |
注意 deployment 中 DB_HOST 并非取自 Secret,而是直接硬编码为 PgBouncer 地址;DB_ADMIN_USER / DB_ADMIN_PASSWORD 来自共享路径 yldm/database,其余应用专属凭据来自 yldm/production/magicbox。
remoteRef.key 省略了 secret/ 挂载前缀(store 会自动补上);用 vault CLI 手写对应键时需带前缀,即 vault kv put secret/yldm/production/magicbox ...。访问与监控
Service magicbox 为默认 ClusterIP 类型,按 app: magicbox 选择 Pod,port: 80 → targetPort: 8080(端口名 http)。manifest 中没有 Ingress,因此该服务仅在集群内可达,对外暴露需经其他入口(本目录未定义)。
- Name
- ServiceMonitor
- Description
magicbox,抓取http端口的/metrics,interval: 30s,并将 pod / namespace / service 标签做 relabel
- Name
- PrometheusRule
- Description
magicbox.rules(interval: 30s),覆盖:Pod 不可用(MagicboxPodDown、MagicboxInsufficientPods,critical)、HTTP 5xx 错误率(warning >3% / critical >5%)、P95 延迟(warning >0.5s / critical >1s)、Pod 频繁重启、CPU 与内存使用率超 80% 告警
- Name
- HPA
- Description
magicbox-hpa,minReplicas: 2/maxReplicas: 5,按 CPU 利用率 70% 与内存利用率 80% 扩缩
- Name
- VPA
- Description
magicbox-vpa,updateMode: "Off"(仅给建议不自动改),区间 cpu 25m–500m、memory 32Mi–512Mi
- Name
- PDB
- Description
magicbox,maxUnavailable: 1,避免节点 drain 时两副本同时被驱逐
返回 app 服务总览