engagement · platform 微服务
engagement 运行在 platform 命名空间,是一个监听 :8080 的 HTTP 微服务,通过 yldm-services ApplicationSet 由 ArgoCD 同步,镜像由 argocd-image-updater 按 semver 策略写回 kustomization。
从 manifest 可确认的技术角色:它对外暴露 HTTP API,依赖独立的 MySQL 与 Redis,使用 JWT 做鉴权,向 Consul 注册自身,启用了基于 Redis 的 pubsub(含死信队列),并集成了 Linear。具体业务语义未在仓库中描述,本页只陈述可验证的技术事实。
部署形态
无状态 Deployment,2 副本,调度到带 workload: app 标签的节点;副本之间用软反亲和(podAntiAffinity preferred,topologyKey: kubernetes.io/hostname)尽量分散到不同主机。滚动更新采用 maxUnavailable: 0 / maxSurge: 1,先起新 Pod 再停旧 Pod。容器带 production-medium 优先级,并通过 Stakater Reloader 注解(reloader.stakater.com/auto: "true")在 ConfigMap/Secret 变更时自动重启。
- Name
- 命名空间
- Description
- platform(kustomization namePrefix: platform-)
- Name
- 工作负载
- Description
- Deployment,replicas 2,revisionHistoryLimit 2
- Name
- 镜像
- Description
- ghcr.io/yldm-tech/engagement:2.3.1(tag 由 argocd-image-updater 管理)
- Name
- 端口
- Description
- containerPort 8080,name http
- Name
- 调度
- Description
- nodeSelector workload: app;软反亲和按 hostname 分散
- Name
- 优先级
- Description
- priorityClassName production-medium
- Name
- 资源
- Description
- requests 50m / 64Mi,limits 200m / 256Mi
- Name
- 拉取凭证
- Description
- imagePullSecrets: ghcr-secret
- Name
- 存储
- Description
- 无持久卷,仅挂载两个 ConfigMap(base-config、engagement-config)只读
健康探针:liveness GET /health/live(initialDelay 30s,period 10s),readiness GET /health/ready(initialDelay 15s,period 5s,timeout 5s),均打在 8080。
配置与依赖
容器以 CONFIG_FILE=configs/services/engagement.yaml 启动,运行模式为 production / release。配置分两层挂载:共享的 base-config 挂到 /root/configs/base,服务专属的 engagement-config(engagement.yaml)以 subPath 挂到 /root/configs/services/engagement.yaml。服务配置继承 base/production.yaml 并覆盖:数据库名默认 yldm_engagement、Redis 业务库 1、tracing service_name yldm-engagement、pubsub 前缀 yldm:engagement(独立 pubsub Redis 库,死信键 yldm:engagement:deadletter)。
外部服务依赖:配置中声明了对 user 服务的调用,默认 http://prod-user:80/api/v1/internal,通过 X-Service-Token 头鉴权,timeout 3s、cache_ttl 60s、stale_ttl 300s。运行时还向 Consul 注册:CONSUL_ENABLED=true,CONSUL_ADDR=consul.consul.svc.cluster.local:8500,服务名 engagement。
密钥全部来自 ExternalSecret engagement-db-secret,经 ClusterSecretStore vault-backend(refresh 1h)从 Vault 拉取并以环境变量注入:
| 来源 Vault key | 注入的字段 |
|---|---|
yldm/production/engagement | DB_HOST/PORT/NAME/USER/PASSWORD、REDIS_HOST/PORT/PASSWORD/DB/PUBSUB_DB、JWT_SECRET、JWT_EXPIRES_IN、JWT_REFRESH_EXPIRES_IN |
yldm/database | DB_ADMIN_USER、DB_ADMIN_PASSWORD |
yldm/linear | LINEAR_API_KEY、LINEAR_TEAM_ID、LINEAR_LABELS、LINEAR_PROJECTS |
数据库凭证走服务独立的 Secret,实现凭证隔离。DB 与 Redis 的主机/端口/密码均由 Secret 注入,manifest 中不含明文。
访问与监控
集群内通过 Service platform-engagement(ClusterIP,默认类型)暴露:port 80 → targetPort 8080,name http。无 Ingress,仅供集群内访问。
- Name
- Service
- Description
- ClusterIP,80 → 8080(http)
- Name
- ServiceMonitor
- Description
- 有,抓 http 端口 /metrics,interval 30s,relabel 出 pod/namespace/service 标签
- Name
- PrometheusRule
- Description
- 有,engagement.rules 共 8 条告警
- Name
- HPA
- Description
- min 2 / max 5,CPU 70% 与 memory 80% 双指标
- Name
- VPA
- Description
- updateMode Off(仅推荐),min 25m/32Mi,max 500m/512Mi
- Name
- PDB
- Description
- maxUnavailable 1
PrometheusRule 覆盖:Pod 宕机(up == 0,critical)、副本不足、HTTP 5xx 错误率(warning >3% / critical >5%)、P95 延迟(warning >0.5s / critical >1s)、Pod 频繁重启、CPU 与内存使用超 limit 的 80%。告警依赖应用导出 http_requests_total 与 http_request_duration_seconds_bucket 指标。
返回 platform 总览