rpgserver · game 命名空间下的 RPG 游戏后端服务
rpgserver 是运行在 game 命名空间的 RPG 游戏服务端,镜像为 ghcr.io/yldm-tech/rpgserver,以 GIN_MODE=release 运行(Gin 框架),监听 HTTP 8080 提供游戏 API 与 WebSocket,并在 9090 暴露 Prometheus metrics。它向 Consul 注册服务发现,使用 PostgreSQL 持久化、Redis 做缓存与 PubSub,对外通过 rpg.yldm.tech 经 Cloudflare Tunnel 接入。
2.3.1)由 argocd-image-updater 按 semver 策略写回 kustomization.yaml 的 images: 块,不要手动 pin。部署形态
- Name
- 命名空间
- Description
- game(kustomize 设置 namespace: game,namePrefix: game-,故生成的资源名形如 game-rpgserver)
- Name
- 工作负载类型
- Description
- Deployment,RollingUpdate 策略(maxSurge: 1, maxUnavailable: 0)
- Name
- 镜像与版本
- Description
- ghcr.io/yldm-tech/rpgserver:2.3.1(imagePullPolicy: Always,imagePullSecret: ghcr-secret)
- Name
- 副本数
- Description
- replicas: 2(HPA 接管,min 2 / max 8)
- Name
- 端口
- Description
- 容器 8080(http)、9090(metrics)
- Name
- 调度
- Description
- podAntiAffinity(preferred,topologyKey kubernetes.io/hostname,按 app=rpgserver 分散),无 nodeSelector
- Name
- 资源
- Description
- requests 512Mi/500m,limits 1Gi/1000m
- Name
- 存储
- Description
- 无 PVC,配置以 ConfigMap 只读挂载
容器挂载两个 ConfigMap:base-config 挂到 /root/configs/base(共享基础配置,由本仓库其他资源提供),rpgserver-config 的 rpg.yaml 以 subPath 挂到 /root/configs/services/games/rpg.yaml。
探针:startupProbe 与 livenessProbe 走 GET /health:8080(startup failureThreshold 12 / period 5s),readinessProbe 走 GET /health/ready:8080。preStop 执行 sleep 15,terminationGracePeriodSeconds 30,配合滚动更新平滑下线。
配置与依赖
rpgserver-config(ConfigMap)中的 rpg.yaml 用环境变量插值,关键游戏参数:tick_rate 30、send_rate 10、max_players 1000、世界尺寸 10000×10000。服务注册段启用 Consul(service_name rpgserver,tags game/rpg/v1,check_path /health)。数据库段 driver postgres、migration_dir migrations/rpg、max_open_conns 25。Redis 段 db 5、prefix rpg:、pool_size 20,并配置 redis PubSub(prefix rpg:pubsub:,dead_letter 保留 168h)。
依赖的中间件(均经环境变量注入):
| 依赖 | 地址 | 说明 |
|---|---|---|
| PostgreSQL | pgbouncer.postgres.svc.cluster.local | DB_HOST/DATABASE_HOST 写死指向 pgbouncer,端口/库名/账号来自 Secret |
| Redis | 来自 Secret REDIS_HOST | REDIS_DB=5,密码来自 Secret |
| Consul | consul.consul.svc.cluster.local:8500 | CONSUL_ENABLED=true 服务注册 |
敏感配置由 ExternalSecret rpgserver-secret 从 ClusterSecretStore vault-backend 拉取,生成 Secret rpgserver-db-secret(refreshInterval 1h)。remoteRef key 分布在三处 Vault 路径:
| Vault key | 取出的字段 |
|---|---|
| yldm/production/rpgserver | db_host / db_port / db_name / db_user / db_password / redis_db |
| yldm/production/common | redis_host / redis_port / redis_password / jwt_secret / jwt_expires_in / jwt_refresh_expires_in |
| yldm/database | user / password(映射为 DB_ADMIN_USER / DB_ADMIN_PASSWORD) |
其余如 SERVER_PORT、GIN_MODE、ENVIRONMENT、METRICS、RATE_LIMIT_GLOBAL(1000)/BURST(2000)、LOG_LEVEL/FORMAT/OUTPUT 等为明文 env。
访问与监控
集群内有两个 ClusterIP Service:rpgserver(port 80 → targetPort 8080)和 rpgserver-headless(clusterIP None,同端口映射,用于直连各 Pod)。加 namePrefix 后实际名为 game-rpgserver / game-rpgserver-headless。
对外通过 Ingress rpgserver-ingress 暴露,host rpg.yldm.tech,ingressClassName traefik,TLS 证书由 cert-manager letsencrypt-prod ClusterIssuer 签发(secret rpgserver-tls-cert)。external-dns 写 Cloudflare 代理的 CNAME 指向 cfargotunnel.com(Cloudflare Tunnel)。为支撑 WebSocket,配置了长 proxy 超时(3600s)、cookie 亲和性(session-cookie rpgserver-session,max-age 10800)与 limit-rps 100。注意:Ingress 后端写的是 game-rpgserver:80。
监控与可用性:
| 项 | 配置 |
|---|---|
| Metrics | Pod 注解 prometheus.io/scrape=true,port 9090,path /metrics(无独立 ServiceMonitor 文件,靠注解抓取) |
| HPA | rpgserver-hpa,min 2 / max 8,CPU 70% + Memory 80% |
| VPA | rpgserver-vpa,updateMode Off(仅推荐,不自动改),min 200m/256Mi,max 2/2Gi |
| PDB | rpgserver,minAvailable 1 |
注意事项
CLAUDE.md 中 game 类目的专门踩坑段针对的是 dnf-server(mysql 中间件不重连等),与 rpgserver 无关,此处不套用。
按本仓库约定,PDB 的 minAvailable: 1 在单副本服务上会卡住节点 drain(应改用 maxUnavailable: 1),但 rpgserver 是 2 副本(HPA 下限也是 2),minAvailable: 1 在此是安全的。
镜像/版本由 argocd-image-updater 自动写回;若涉及破坏性升级(CRD、配置或数据迁移),需在同一 PR 内同步 manifest,不要只 bump tag。
返回 game 服务总览