boardserver · 棋牌类实时游戏服务端

boardserver 是 yldm 集群 game 类目下的一个棋牌(board)游戏服务端。

它是一个基于 Gin(GIN_MODE=release)的 Go 服务,以 Deployment 形式运行于 game 命名空间,对外暴露 HTTP/WebSocket(8080)与 Prometheus 指标(9090)。从 ConfigMap 可见它带有 60 tick / 20 send 的游戏循环参数、Consul 服务注册、Redis PubSub 与 PostgreSQL 持久化,通过 Cloudflare Tunnel + traefik Ingress 以 board.yldm.tech 对玩家提供带 sticky-session 的实时连接。以下事实均来自该应用 manifest。

部署形态

  • Name
    命名空间
    Description
    game(kustomization namespace: game,namePrefix: game-,故实际资源名为 game-boardserver-*)
  • Name
    工作负载
    Description
    Deployment,replicas: 2,RollingUpdate(maxSurge: 1 / maxUnavailable: 0)
  • Name
    镜像
    Description
    ghcr.io/yldm-tech/boardserver:2.3.1(tag 由 kustomization images: 管理,argocd-image-updater semver 写回目标),imagePullPolicy: Always,pull secret ghcr-secret
  • Name
    端口
    Description
    http 8080(容器内 Gin / WebSocket)、metrics 9090(Prometheus)
  • Name
    资源
    Description
    requests 250m CPU / 256Mi,limits 500m CPU / 512Mi
  • Name
    调度
    Description
    无 nodeSelector;podAntiAffinity preferred(weight 100,topologyKey: kubernetes.io/hostname,按 app=boardserver 打散两副本到不同节点)
  • Name
    探针
    Description
    startupProbe /health(失败 12 次),livenessProbe /health(周期 15s),readinessProbe /health/ready(周期 5s)
  • Name
    优雅退出
    Description
    preStop sleep 15s,terminationGracePeriodSeconds: 30(配合 maxUnavailable: 0 做无损滚动)
  • Name
    存储
    Description
    无 PVC;仅以 ConfigMap 挂载 base-config(/root/configs/base)与 boardserver-configboard.yaml(/root/configs/services/games/board.yaml)只读

配置与依赖

运行配置来自 ConfigMap boardserver-configboard.yaml,字段大量用 ${ENV:default} 占位由容器环境变量覆盖。游戏循环参数:tick_rate: 60send_rate: 20max_players: 100world_width/height: 2000。数据库驱动 postgres(连接池 max_idle 10 / max_open 25),Redis 默认 db: 3、key 前缀 board:,并启用 Redis PubSub(worker_pool_size: 10,带死信队列 retention 168h)。另挂载共享 ConfigMap base-config(本目录未定义,属外部共享基础配置)。

依赖的外部组件:

依赖地址 / 说明
PostgreSQLDB_HOST=pgbouncer.postgres.svc.cluster.local(经 pgbouncer 连接池);库名等走 secret
Redishost/port/password 走 secret,REDIS_DB=3(用于缓存与 PubSub)
ConsulCONSUL_ENABLED=true,CONSUL_ADDR=consul.consul.svc.cluster.local:8500,以服务名 boardserver、tags game/board/v1 注册,健康检查 /health 每 10s

敏感配置由 ExternalSecret boardserver-secret 从 ClusterSecretStore vault-backend 拉取,合成 K8s Secret boardserver-db-secret(refreshInterval: 1h),被 Deployment 以 secretKeyRef 注入:

remoteRef.key提供的字段
yldm/production/boardserverdb_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/database管理员 user / password(注入为 DB_ADMIN_USER / DB_ADMIN_PASSWORD)

非敏感环境变量直接写在 Deployment 内:ENVIRONMENT=productionMETRICS_ENABLED=true(METRICS_PORT=9090)、限流 RATE_LIMIT_GLOBAL=1000 / RATE_LIMIT_BURST=2000、日志 LOG_LEVEL=info / LOG_FORMAT=json / LOG_OUTPUT=stdout

访问与监控

集群内由两个 ClusterIP Service 暴露(均 port: 80 → targetPort: 8080):普通 Service boardserver 与 headless boardserver-headless(clusterIP: None)。经 namePrefix 后实际名为 game-boardserver / game-boardserver-headless

对外通过 Ingress boardserver-ingress(ingressClassName: traefik)以 board.yldm.tech 提供服务,后端指向 game-boardserver:80。关键注解:

  • TLS 由 cert-manager letsencrypt-prod 签发(secret boardserver-tls-cert),强制 SSL 跳转。
  • DNS 经 external-dns 写 CNAME 到 Cloudflare Tunnel(2b822c22-...cfargotunnel.com,cloudflare-proxied: true)。
  • WebSocket 支持:websocket-services: game-boardserver,proxy read/send/connect 超时拉到 3600
  • Sticky session:cookie 亲和(boardserver-session,max-age 10800),保证 WebSocket 连接黏在同一副本。
  • 限流 limit-rps: 100,proxy-body-size: 10m

指标方面,Pod 带 prometheus.io/scrape: trueprometheus.io/port: 9090prometheus.io/path: /metrics 注解(注解式抓取,本目录无 ServiceMonitor / PrometheusRule)。

弹性与可用性:

  • Name
    HPA
    Description
    boardserver-hpa,minReplicas: 2 / maxReplicas: 8,CPU 利用率目标 70%、内存 80%
  • Name
    VPA
    Description
    boardserver-vpa,updateMode: "Off"(仅推荐不自动改),区间 CPU 100m–1 / 内存 128Mi–1Gi
  • Name
    PDB
    Description
    boardserver,minAvailable: 1

返回 game 服务总览

评论