返回首页

运维接口管理

系统架构与数据流向

游戏服务全生命周期管理:代码提交镜像构建完成→配置同步→环境部署→运行监控→故障恢复的完整链路

CI (研发负责) CD (运维负责) 容器镜像仓库 Harbor / ACR Git 配置仓库 Kustomize 定制多环境 Flask API 运维管理接口 ArgoCD GitOps 控制器 Kubernetes 集群 游戏服务运行环境 数据存储层 MySQL + Redis 云服务 COS / CDN 拉取镜像 监听变更 修改配置 同步部署 kubectl 操作 CDN 操作

API 接口架构总览

核心管理接口 /argocd-sync /onlyRestart /reset /healthcheck /get-dbs /test/* 数据管理接口 /preclear /restore /sql-update 专用功能接口 /hefu /cdn /cdn-query 底层支撑组件 GitCloner 配置管理 MysqlCrud 数据库管理 RedisCrud 缓存管理 Argocd_sync 部署同步 cdn_refresh 内容分发

运维API功能说明、使用场景和调用方式:

接口名称 路径 功能描述与适用场景 使用频率 接口参数
时间调整接口
核心功能
/reset 功能:调整游戏服务器内部时间,修改faketime配置并重启相关组件
场景:跨天活动测试、时间相关功能验证、节日活动调试
中频
必填:project, env, setupTime
选填:isStop(默认1), isStart(默认1), isSync(默认0)
版本更新接口
高频使用
/argocd-sync 功能:通过ArgoCD API同步Git配置变更到K8s集群,实现GitOps自动化部署
场景:版本发布、配置更新、镜像升级、紧急修复部署
高频
必填:project, env
选填:isStop(默认0), isStart(默认0), isBackup(默认0), operator, checklog(默认0), isHot(默认0)
服务重启接口
高频使用
/onlyRestart 功能:重启游戏服务组件,支持优雅停止和自动备份,可调整debug和日志级别
场景:配置生效、服务异常恢复、内存释放、日常维护、调试模式切换
高频
必填:project, env
选填:isStop(默认0), isStart(默认0), isBackup(默认0), checklog(默认0), debug(true/false), loglevel(notice/info/debug)
清档接口
谨慎操作
/preclear 功能:清理MySQL和Redis数据,初始化区服配置,执行清档SQL脚本
场景:测试环境清档、数据重置、环境初始化、问题修复
中频
必填:project, env
选填:isClear(默认0), isBackup(默认1), isRestart(默认0), isReserved(默认0)
SQL更新接口
核心功能
/sql-update 功能:执行数据库结构更新、数据修复SQL,支持增量更新和版本升级
场景:版本升级、数据库结构变更、数据修复、配置更新
中频
必填:project, env
选填:isUpdate(默认0), isStop(默认0), isStart(默认0), version
数据恢复接口
紧急恢复
/restore 功能:从备份文件恢复MySQL和Redis数据,支持指定时间点恢复
场景:故障恢复、数据回滚、误操作恢复、环境迁移
低频
必填:project, env
选填:isStop(默认0), isStart(默认0), isRestore(默认0), version
数据库查询接口
运维工具
/get-dbs 功能:查询数据库连接信息、表结构、数据统计,获取环境配置详情
场景:运维排查、数据检查、环境诊断、监控告警
中频
必填:project, env
选填:dbkey, table, isBackup
合服接口
专业操作
/hefu 功能:执行游戏服务器合区操作,数据迁移和整合,处理玩家数据冲突
场景:服务器合区、玩家基数合并、资源整合、运营策略
低频
必填:project, env
选填:isStop(默认0), isStart(默认0), isBackup(默认0), ids, isHefu(默认0)
CDN管理接口
内容分发
/cdn
/cdn-query
功能:管理CDN内容刷新和预热,查询CDN刷新状态和缓存情况
场景:游戏资源更新、热更新、配置表发布、客户端文件分发
中频
/cdn必填:project, action, paths
/cdn选填:flushType
/cdn-query必填:action, taskId
健康检查接口
监控必备
/healthcheck 功能:检查游戏服务健康状态,验证数据库连接、服务响应、资源使用情况
场景:监控告警、故障排查、服务可用性检测、自动化巡检
高频
必填:project, env

🔥 接口调用规范

  • 并发控制:每个环境同时只能执行一个操作,通过文件锁机制防止冲突
  • 参数校验:所有接口都会验证 project 和 env 参数的合法性
  • 操作日志:每次调用都会记录到 /tmp/gametool.log 和接口调用记录
  • 错误处理:统一的异常处理机制,返回详细的错误信息和状态码
  • 钉钉通知:重要操作会自动发送钉钉消息,包含操作结果和关键信息
  • 默认值说明:选填参数若不传递则使用括号内默认值,0表示不执行该操作,1表示执行
🌐

接入层 - API Gateway

生命周期管理入口:统一处理开发、测试、部署、运维全阶段的操作请求

Flask Web Framework 核心

轻量级 Python Web 框架,提供 RESTful API 接口服务。通过装饰器模式定义路由,支持请求参数验证和响应格式化。

Python 3.9 Flask Gunicorn WSGI
并发控制机制

基于文件锁的并发控制,防止同一环境的操作冲突。每个接口操作创建独立的锁文件,确保操作的原子性。

File Lock Decorator Pattern
进程管理

Supervisor 守护进程管理,支持自动重启、日志轮转。配置多 Worker 进程处理并发请求。

Supervisor Multi-Worker
🎮

控制层 - Business Logic

生命周期核心控制:编排配置变更、版本发布、环境切换、数据管理等关键流程

GitCloner 配置管理 关键

管理 Kustomize 配置仓库,支持动态修改 YAML 配置文件。实现配置版本控制、自动提交推送,是 GitOps 的基础。

GitPython PyYAML Kustomize
ArgoCD 集成

通过 ArgoCD API 实现应用同步控制。监听 Git 仓库变更,自动触发 K8s 资源更新,实现声明式部署。

ArgoCD API JWT Auth Webhook
服务编排控制

管理游戏服务启停顺序,实现优雅关闭。通过多线程并发监控 Pod 日志,确保服务状态正确。

ThreadPoolExecutor SSH Remote
⚙️

执行层 - Infrastructure

生命周期基础支撑:提供容器运行、数据存储、网络通信等服务运行的底层保障

Kubernetes 编排 基础

游戏服务容器化运行平台。通过 SSH 远程执行 kubectl 命令,管理 GameServerSet、Deployment、Service、ConfigMap 等资源。

K8s API kubectl NodePort
数据持久化

MySQL 存储游戏数据,Redis 提供高速缓存。支持自动备份、恢复、清档、增量更新等数据管理操作。

MySQL 5.7+ Redis 6.0+ redis-dump-go
云服务集成

<company2> <storage1> 存储游戏资源文件,CDN 加速内容分发。支持资源预热、刷新,优化玩家访问体验。

<storage1> API CDN API <storage1>cli

运维场景与解决方案

实际运维中的典型场景和技术实现细节 - 新运维人员胜任该岗位的必知必会(4个场景5个故障)

🔧

场景一:新增游戏组件

当游戏需要新增战斗服务器组件时,需要在多个配置点进行修改,确保新组件能被正确管理。

# 1. 修改 Flask 应用配置,添加新组件到服务列表
app.config['server'] = (
    'gforge-gateway', 
    'gforge-game', 
    'gforge-battle',  # 新增战斗服务
    'gforge-chat',
    ...
)

# 2. 在 Git 仓库中添加 K8s 部署配置
# overlays/dev/deploy-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gforge-battle
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: gforge-battle
        image: <registry1>/<company1>/gforge-battle
        env:
        - name: SERVER_ID
          value: "battle"

# 3. 添加初始化 SQL(如需要)
# init_db_sql/init_server_battle.sql
CREATE TABLE IF NOT EXISTS `battle_room` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `room_id` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
🎯

场景二:扩展 API 功能

添加新的运维接口时,需要遵循现有的装饰器模式和错误处理机制,确保接口的一致性和可靠性。

# 添加新的 API 接口示例:游戏活动管理
@app.route('/activity-manage', methods=["POST"])
@file_lock()  # 使用文件锁装饰器防止并发
def activity_manage():
    ''' 管理游戏活动的开启和关闭 '''
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    _results = {}
    
    # 获取请求参数
    project = flask.request.values.get('project')
    env = flask.request.values.get('env')
    activity_id = flask.request.values.get('activity_id')
    action = flask.request.values.get('action')  # start/stop
    
    try:
        # 参数验证
        if not project in current_app.config['project']:
            raise CommandExecutionError(
                error_info=f"project参数有误"
            )
        
        # 获取环境配置
        namespace = current_app.config[project]['env_namespace'][env]
        host = current_app.config[project]['env_node'][env]
        
        # 初始化配置管理器
        ins = GitCloner(project, env)
        mysql_info, redis_info = ins.get_config()
        
        # 执行活动管理逻辑
        ins_mysql = MysqlCrud(host, namespace, mysql_info)
        
        if action == 'start':
            # 更新活动状态
            sql = f"UPDATE activity SET status=1 WHERE id={activity_id}"
            flag, msg = ins_mysql.execute_sql(sql)
            _results['activity_start'] = msg
            
            # 清理相关缓存
            ins_redis = RedisCrud(host, namespace, redis_info)
            ins_redis.delete_pattern(f"activity:{activity_id}:*")
            
        # 发送通知
        send_dingtalk(
            project=project, 
            env=env,
            success=True,
            活动ID=activity_id,
            操作=action
        )
        
    except CommandExecutionError as e:
        _results['error'] = e.error_info
        return json.dumps({
            "status_code": 500,
            "message": "error",
            "data": _results
        })
    
    return json.dumps({
        "status_code": 200,
        "message": "Success",
        "data": _results
    })
📊

场景三:环境配置扩展

新增游戏环境时,需要在配置字典中添加完整的环境映射关系,包括命名空间、节点地址、Git目录等。

# 添加新环境配置示例:压测环境2
app.config['<project1>'] = {
    # 添加命名空间映射
    "env_namespace": {
        ...,
        "yace2": "<project1>-yace2"  # 新增压测环境2
    },
    
    # 添加节点IP映射
    "env_node": {
        ...,
        "yace2": "<IP1>"  # 指定K8s节点
    },
    
    # Git仓库子目录
    "env_git_subdir": {
        ...,
        "yace2": "yace2"  # 对应Git目录
    },
    
    # ArgoCD应用名称
    "env_appname": {
        ...,
        "yace2": "<project1>-yace2"
    },
    
    # COS资源目录
    "env_cosdir": {
        ...,
        "yace2": "yace"  # 复用压测资源
    }
}

# 添加环境中文名称(用于钉钉通知)
app.config['alertname']['yace2'] = "压测环境2(yace2)"
🔍

场景四:故障快速定位

当服务部署失败时,系统会自动收集相关日志和事件信息,帮助快速定位问题原因。

# 服务启动失败时的诊断逻辑
if not flag:  # 启动失败
    app.logger.error(f"启动时检测日志'{loginfo}'失败")
    
    # 1. 获取 K8s 事件
    cmd = f"""kubectl get events -n {namespace} \
        --field-selector 'involvedObject.namespace={namespace},\
        reason=~Failed' -o json"""
    flag, get_event = execute_remote_command(host=host, command=cmd)
    
    if flag:
        reason = json.loads(get_event)
        if reason['items']:
            # 优先使用K8s事件信息
            msg = reason['items'][0]['message']
        else:
            # 2. 获取Pod最新日志
            cmd = f"""kubectl logs {pod_name} -c {server} \
                -n {namespace} --tail=20"""
            flag, logs = execute_remote_command(host=host, command=cmd)
            
            # 3. 提取错误信息
            error_lines = [
                line for line in logs.split('\n') 
                if 'ERROR' in line or 'FATAL' in line
            ]
            msg = '\n'.join(error_lines[-5:])  # 最后5条错误
    
    # 4. 保存诊断信息到日志
    diagnostic_info = {
        'pod': pod_name,
        'namespace': namespace,
        'error': msg,
        'time': datetime.now()
    }
    app.logger.error(f"诊断信息: {json.dumps(diagnostic_info)}")
    
    raise CommandExecutionError(error_info=msg)
📋

故障一:游戏配置表传输异常

配置表在CI阶段异步上传到COS,通过PVC挂载到容器。常见问题:传输不完整、版本不匹配导致游戏启动失败。

# 1. 检查PVC挂载目录
kubectl exec -it pod-name -c container-name -- ls -la /data/config/

# 2. 比对配置文件版本
kubectl exec -it pod-name -c container-name -- cat /data/config/version.txt

# 3. 查看COS同步日志
kubectl logs pod-name -c sidecar-container

# 解决方案:联系开发重新触发CI或手动同步配置
处理流程:
1. 确认配置表版本号与镜像tag是否匹配
2. 检查COS桶中配置文件更新时间
3. 联系开发重新上传或调整CI流程
🏷️

故障二:新环境版本标签适配问题

新环境搭建时,CI阶段未及时适配正确的版本tag,导致部署非预期版本或启动失败。

# 1. 检查当前部署的镜像版本
kubectl get deployment -n namespace -o yaml | grep image:

# 2. 查看Git仓库配置的版本
cat overlays/env/kustomization.yaml | grep newTag

# 3. 修正版本标签
解决步骤:
1. 确认应部署的正确版本号
2. 修改Git仓库中kustomization.yaml的newTag
3. 提交变更并等待ArgoCD同步
4. 或手动调用 /argocd-sync 接口强制更新
⏱️

故障三:组件停止超时强杀

游戏组件停止超时未响应时,不得已需强制杀进程,需先与主程序确认无风险后,再用 crictl 相关命令处理容器级问题。

# 1. 获取超时Pod的宿主机IP
kubectl get pod pod-name -n namespace -o jsonpath='{.status.hostIP}'

# 2. SSH到宿主机,查找容器ID
ssh root@host-ip
crictl ps | grep pod-name

# 3. 强制停止容器
crictl stopp container-id
crictl rmp container-id

# 4. 备份容器日志(重要)
cp -rf /var/log/pods/namespace_pod-name* /tmp/

注意事项:
- 强杀前务必备份日志用于问题定位
- 一定、务必、千万要跟服务端程序确认过可以操作
- 确认数据已保存,避免数据丢失
🔄

故障四:ArgoCD资源类型变更

当资源类型、结构或元数据发生不兼容变更时,需要在ArgoCD WebUI中删除旧资源再重新同步新类型。

# 操作流程(必须按顺序执行)
1. ArgoCD WebUI操作:
   - 进入应用详情页面
   - 选择要变更的资源(如Deployment)
   - 点击Delete删除旧资源
   - 等待资源完全清理

2. Git仓库更新:
   - 修改YAML文件kind字段
   - 提交并推送到远程仓库

3. 重新同步:
   - ArgoCD自动检测到变更
   - 或手动触发Sync同步
   - 调用接口: /argocd-sync?project=<project1>&env=dev

注意:只修改kind重新同步argo是解决不了问题的,必须先删除旧资源
⚠️

故障五:环境初始化遗漏

新环境初始化步骤遗漏导致的各类问题:区服ID缺失、域名解析错误、跨站问题、安全组配置遗漏等。

# 初始化检查清单
1. 初始化:
   - 区服ID是否正确配置
   - 域名配置是否完整或遗漏
   - cdn跨域白名单是否添加

2. 网络连通性:
   - 安全组规则检查
   - 发版平台到游戏环境连通性
   - CI平台到镜像仓库连通性
   - CI到ArgoCD同步接口连通性

# 常用测试命令
telnet target-host target-port
curl -v http://argo-api/sync
nslookup domain-name

解决方案:
- 按环境初始化SOP逐项检查
- 补充遗漏的安全组规则
- 开通必要端口

操作指南

常用运维操作、故障排查

🚨 高频故障排查 - 责任重大

  • 配置表版本不匹配:游戏组件启动失败查看日志!检查PVC挂载/data/config/目录,对比版本号与镜像tag,第一时间@CI负责开发重新上传正确版本
  • 新环境镜像tag错误:版本部署失败!核查kustomization.yaml的newTag字段,@负责该环境的开发,确认正确版本并修复CI配置
  • 组件停止超时:⚠️危险操作 - 使用crictl强杀前必须@项目组主程确认可以强杀,可能导致玩家数据无法存档造成回档!
  • ArgoCD资源类型变更:部署失败!必须先在WebUI删除旧资源,重新添加。直接同步修改会失败
  • 网络连通性问题:各种超时报错!排查安全组规则,检查域名解析配置

📋 关键日志查看

  • 运维接口日志:tail -f /tmp/gametool.log
  • 接口调用记录:cat record_interface.txt
  • 错误日志过滤:grep -i error /tmp/gametool.log
  • 特定环境:grep "env=dev" /tmp/gametool.log
  • K8s操作:kubectl logs pod-name -c container
  • 容器日志备份:/var/log/pods/namespace_pod*
  • 接口被锁定:/tmp/.*_env.lock确认无其他操作后谨慎删除

⚡ 紧急处理SOP

  • 立即备份:调用/onlyRestart?isBackup=1
  • 确认故障范围:检查影响的环境和组件
  • 快速回档:使用最近备份调用/restore接口
  • 验证恢复:调用/healthcheck确认服务状态
  • 通知相关方:更新故障进展和预计恢复时间
  • 复盘记录:记录故障原因和处理经验

✅ 新环境验收清单

  • 数据库初始化:区服ID、域名配置完整性
  • 网络连通性:安全组规则、端口开通状态
  • CI/CD链路:镜像推送、ArgoCD同步接口
  • 服务状态:Pod启动、健康检查通过
  • 配置表同步:PVC挂载、版本一致性
  • 监控告警:日志采集、异常告警配置