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: appnamePrefix: app-,生成资源 app-magicbox-*
  • Name
    工作负载类型
    Description
    Deployment,revisionHistoryLimit: 2,滚动更新 maxUnavailable: 0 / maxSurge: 1
  • Name
    镜像与版本
    Description
    ghcr.io/yldm-tech/magicbox,kustomization images: 锁定 newTag: 2.4.0(覆盖 deployment.yaml 内联的 2.2.38,以 images: 为部署版本的权威来源)
  • Name
    副本数
    Description
    2(kustomization replicas.count: 2,与 deployment replicas: 2 一致)
  • Name
    调度
    Description
    nodeSelector: workload=app;通过 kustomization patch 注入 priorityClassName: production-medium 与按 app=magicbox 标签、topologyKey: kubernetes.io/hostname 的软性 podAntiAffinitypreferred,权重 100),使两副本尽量分散到不同节点
  • Name
    端口
    Description
    容器 containerPort: 8080(name http);Service 以 80 端口转发至 8080
  • Name
    资源
    Description
    requests cpu 50m / memory 64Mi,limits cpu 200m / memory 256Mi
  • Name
    存储
    Description
    无持久卷,仅挂载两个 ConfigMap(base-config 挂到 /root/configs/basemagicbox-config 以 subPath 挂为 /root/configs/services/magicbox.yaml),均 readOnly
  • Name
    健康探针
    Description
    livenessProbe GET /health/live(initialDelay 30s,period 10s);readinessProbe GET /health/ready(initialDelay 15s,period 5s,timeout 5s)
  • Name
    镜像拉取
    Description
    imagePullSecrets: ghcr-secret

配置与依赖

容器以环境变量驱动:ENV / ENVIRONMENT = productionSERVER_MODE = releaseSERVER_PORT = 8080SERVER_NAME = magicboxSWAGGER_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.localDB_HOST),即经 PgBouncer 连接池访问 PostgreSQL;Consul 服务注册开启,CONSUL_ENABLED = trueCONSUL_ADDR = consul.consul.svc.cluster.local:8500

敏感凭据由 ExternalSecret magicbox-db-secret 经 ClusterSecretStore vault-backend 同步(refreshInterval: 1h),落地为同名 Secret 供 valueFrom.secretKeyRef 引用:

Secret keyVault remoteRef.keyproperty
DB_PORT / DB_NAME / DB_USER / DB_PASSWORDyldm/production/magicboxdb_port / db_name / db_user / db_password
REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_DB / REDIS_PUBSUB_DByldm/production/magicboxredis_host / redis_port / redis_password / redis_db / redis_pubsub_db
JWT_SECRET / JWT_EXPIRES_IN / JWT_REFRESH_EXPIRES_INyldm/production/magicboxjwt_secret / jwt_expires_in / jwt_refresh_expires_in
DB_ADMIN_USER / DB_ADMIN_PASSWORDyldm/databaseuser / password

注意 deployment 中 DB_HOST 并非取自 Secret,而是直接硬编码为 PgBouncer 地址;DB_ADMIN_USER / DB_ADMIN_PASSWORD 来自共享路径 yldm/database,其余应用专属凭据来自 yldm/production/magicbox

访问与监控

Service magicbox 为默认 ClusterIP 类型,按 app: magicbox 选择 Pod,port: 80targetPort: 8080(端口名 http)。manifest 中没有 Ingress,因此该服务仅在集群内可达,对外暴露需经其他入口(本目录未定义)。

  • Name
    ServiceMonitor
    Description
    magicbox,抓取 http 端口的 /metricsinterval: 30s,并将 pod / namespace / service 标签做 relabel
  • Name
    PrometheusRule
    Description
    magicbox.rulesinterval: 30s),覆盖:Pod 不可用(MagicboxPodDownMagicboxInsufficientPods,critical)、HTTP 5xx 错误率(warning >3% / critical >5%)、P95 延迟(warning >0.5s / critical >1s)、Pod 频繁重启、CPU 与内存使用率超 80% 告警
  • Name
    HPA
    Description
    magicbox-hpaminReplicas: 2 / maxReplicas: 5,按 CPU 利用率 70% 与内存利用率 80% 扩缩
  • Name
    VPA
    Description
    magicbox-vpaupdateMode: "Off"(仅给建议不自动改),区间 cpu 25m–500m、memory 32Mi–512Mi
  • Name
    PDB
    Description
    magicboxmaxUnavailable: 1,避免节点 drain 时两副本同时被驱逐

返回 app 服务总览

评论