media · platform 媒体与文件服务

media 是 platform 命名空间下的一个 Go 微服务(SERVER_NAME=media),通过统一的 production-services ApplicationSet 生成 Application platform-media,对外暴露 HTTP 8080,挂载文件上传相关配置(storage 段),并把自己注册到 Consul。它是无状态的 Deployment(文件落地依赖配置中的 storage.base_path,manifest 内未声明 PVC),按 CPU/内存自动伸缩。

部署形态

  • Name
    命名空间
    Description
    platform(kustomization 设 namespace: platform + namePrefix: platform-)
  • Name
    工作负载
    Description
    Deployment(revisionHistoryLimit: 2,滚动更新 maxUnavailable: 0 / maxSurge: 1)
  • Name
    镜像
    Description
    ghcr.io/yldm-tech/media:2.3.1(tag 由 argocd-image-updater semver 写回,勿手动 pin)
  • Name
    副本数
    Description
    2(kustomization replicas 与 deployment 均为 2,HPA 下限同样为 2)
  • Name
    调度
    Description
    nodeSelector: workload=app;podAntiAffinity 软反亲和(weight 100,按 app=media 打散到不同 kubernetes.io/hostname)
  • Name
    优先级
    Description
    priorityClassName production-medium(通过 kustomize patch 注入)
  • Name
    端口
    Description
    容器 8080(name http);Service 以 8090 → targetPort 8080 暴露
  • Name
    资源
    Description
    requests 50m CPU / 64Mi;limits 200m CPU / 256Mi
  • Name
    探针
    Description
    liveness GET /health/live(initialDelay 30s);readiness GET /health/ready(initialDelay 15s,timeout 5s)

镜像拉取使用 ghcr-secret;Deployment 带 reloader.stakater.com/auto: "true" 注解(由 kustomize patch 注入),ConfigMap 变更可触发自动滚动。

配置与依赖

容器以环境变量 CONFIG_FILE=configs/services/media.yaml 读取配置,该文件来自 ConfigMap media-config(经 namePrefix 后为 platform-media-config),挂载到 /root/configs/services/media.yaml;另有共享的 base-config 挂到 /root/configs/base

media.yaml 在继承 base/production.yaml 的基础上覆盖以下要点:

配置项
database.database${DB_NAME:yldm_media}
redis.db${REDIS_DB:10}
tracing.service_nameyldm-media
pubsub.prefixyldm:media(死信键 yldm:media:deadletter,pubsub redis db ${REDIS_PUBSUB_DB:1})
storage.base_path${STORAGE_BASE_PATH:uploads}
storage.max_file_size10485760(10 MiB)
storage.allowed_extensionsjpg / jpeg / png / gif / pdf / doc / docx / xls / xlsx / zip

数据库与中间件凭证来自 ExternalSecret media-db-secret(ClusterSecretStore vault-backend,refreshInterval: 1h),生成同名 Secret 注入容器 env。绝大多数键取自 Vault 路径 yldm/production/media(db_host/db_port/db_name/db_user/db_passwordredis_host/redis_port/redis_password/redis_db/redis_pubsub_dbjwt_secret/jwt_expires_in/jwt_refresh_expires_in);DB_ADMIN_USER/DB_ADMIN_PASSWORD 来自共享路径 yldm/database(user/password)。注释说明此 Secret 用于实现服务级数据库凭证隔离。

服务注册依赖 Consul:CONSUL_ENABLED=trueCONSUL_ADDR=consul.consul.svc.cluster.local:8500。其余 env 包含 ENV/ENVIRONMENT=productionSERVER_MODE=releaseSWAGGER_AUTO_GEN=falseSERVER_PORT=8080SERVER_NAME=media

访问与监控

  • Name
    Service
    Description
    ClusterIP(默认类型),platform-media 暴露端口 8090 → targetPort 8080;无 Ingress(manifest 目录内无 ingress 文件)
  • Name
    ServiceMonitor
    Description
    是。抓 http 端口 /metrics,interval 30s,relabel 出 pod/namespace/service(取自 app label)
  • Name
    PrometheusRule
    Description
    是,group media.rules
  • Name
    HPA
    Description
    media-hpa,min 2 / max 5,CPU 目标 70% 利用率、内存 80% 利用率
  • Name
    VPA
    Description
    media-vpa,updateMode: Off(仅建议不强制),min 25m/32Mi,max 500m/512Mi
  • Name
    PDB
    Description
    media,maxUnavailable: 1

PrometheusRule 覆盖的告警:Pod 不可用(MediaPodDown,up==0 持续 1m,critical)、副本不足(MediaInsufficientPods,运行副本 < 1 持续 2m,critical)、HTTP 5xx 错误率分级(>3% warning / >5% critical)、P95 延迟分级(>0.5s warning / >1s critical)、频繁重启(MediaPodRestarting)、CPU 与内存用量超 limits 80%(MediaHighCPU / MediaHighMemory,持续 10m warning)。告警 PromQL 以 job="media" 与命名空间 platform 为筛选条件。

返回 platform 总览

评论