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 接入。

部署形态

  • 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-configrpg.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)。

依赖的中间件(均经环境变量注入):

依赖地址说明
PostgreSQLpgbouncer.postgres.svc.cluster.localDB_HOST/DATABASE_HOST 写死指向 pgbouncer,端口/库名/账号来自 Secret
Redis来自 Secret REDIS_HOSTREDIS_DB=5,密码来自 Secret
Consulconsul.consul.svc.cluster.local:8500CONSUL_ENABLED=true 服务注册

敏感配置由 ExternalSecret rpgserver-secret 从 ClusterSecretStore vault-backend 拉取,生成 Secret rpgserver-db-secret(refreshInterval 1h)。remoteRef key 分布在三处 Vault 路径:

Vault key取出的字段
yldm/production/rpgserverdb_host / db_port / db_name / db_user / db_password / redis_db
yldm/production/commonredis_host / redis_port / redis_password / jwt_secret / jwt_expires_in / jwt_refresh_expires_in
yldm/databaseuser / 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

监控与可用性:

配置
MetricsPod 注解 prometheus.io/scrape=true,port 9090,path /metrics(无独立 ServiceMonitor 文件,靠注解抓取)
HPArpgserver-hpa,min 2 / max 8,CPU 70% + Memory 80%
VPArpgserver-vpa,updateMode Off(仅推荐,不自动改),min 200m/256Mi,max 2/2Gi
PDBrpgserver,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 服务总览

评论