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 由 kustomizationimages:管理,argocd-image-updater semver 写回目标),imagePullPolicy: Always,pull secretghcr-secret
- Name
- 端口
- Description
http8080(容器内 Gin / WebSocket)、metrics9090(Prometheus)
- Name
- 资源
- Description
- requests
250mCPU /256Mi,limits500mCPU /512Mi
- Name
- 调度
- Description
- 无 nodeSelector;
podAntiAffinitypreferred(weight 100,topologyKey: kubernetes.io/hostname,按app=boardserver打散两副本到不同节点)
- Name
- 探针
- Description
- startupProbe
/health(失败 12 次),livenessProbe/health(周期 15s),readinessProbe/health/ready(周期 5s)
- Name
- 优雅退出
- Description
preStopsleep 15s,terminationGracePeriodSeconds: 30(配合maxUnavailable: 0做无损滚动)
- Name
- 存储
- Description
- 无 PVC;仅以 ConfigMap 挂载
base-config(/root/configs/base)与boardserver-config的board.yaml(/root/configs/services/games/board.yaml)只读
配置与依赖
运行配置来自 ConfigMap boardserver-config 的 board.yaml,字段大量用 ${ENV:default} 占位由容器环境变量覆盖。游戏循环参数:tick_rate: 60、send_rate: 20、max_players: 100、world_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(本目录未定义,属外部共享基础配置)。
依赖的外部组件:
| 依赖 | 地址 / 说明 |
|---|---|
| PostgreSQL | DB_HOST=pgbouncer.postgres.svc.cluster.local(经 pgbouncer 连接池);库名等走 secret |
| Redis | host/port/password 走 secret,REDIS_DB=3(用于缓存与 PubSub) |
| Consul | CONSUL_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/boardserver | 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) |
非敏感环境变量直接写在 Deployment 内:ENVIRONMENT=production、METRICS_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签发(secretboardserver-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: true、prometheus.io/port: 9090、prometheus.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 服务总览