游戏、网关等服务借助Docker容器化并使用Kubernetes部署、更新等

news/2024/12/22 13:09:59/

本文首发在这里
请先看完

  • 实现负责消息转发、推送的网关服务
  • 负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间

Docker_5">Docker容器化

Build and Push
docker build -t panshiqu/game_server:latest -t panshiqu/game_server:1 -t panshiqu/game_server:1.0 --build-arg SERVER=game_server .
docker build -t panshiqu/gate_server:latest -t panshiqu/gate_server:1 -t panshiqu/gate_server:1.0 --build-arg SERVER=gate_server .docker push panshiqu/game_server:latest
docker push panshiqu/game_server:1
docker push panshiqu/game_server:1.0
docker push panshiqu/gate_server:latest
docker push panshiqu/gate_server:1
docker push panshiqu/gate_server:1.0# 记得调整Import,这样才能编出两个不同的版本
docker build -t panshiqu/game_server:client --target client-final .
docker build -t panshiqu/gate_server:client --target client-final .
docker push panshiqu/game_server:client
docker push panshiqu/gate_server:client
验证
# 创建网络使用别名发现服务
docker network create serverdocker run --network server --network-alias dice --name game_server -p 60001:60001 --rm panshiqu/game_server:1.0
docker run --network server --name gate_server -p 60006:60006 -e JWT_KEY=ZGVmYXVsdF9rZXk= --rm panshiqu/gate_server:1.0cd ~/go/src/github.com/panshiqu/server/game_server/game/dice/client
go run main.godocker run --network server --rm -it panshiqu/game_server:client ./dice_client -ip dice

Kubernetes_40">Kubernetes容器编排

部署
kubectl apply -f https://raw.githubusercontent.com/panshiqu/server/main/k8s/dice.yamlkubectl create secret generic jwt --from-literal=key=ZGVmYXVsdF9rZXk=kubectl apply -f https://raw.githubusercontent.com/panshiqu/server/main/k8s/gate.yamlminikube service gate --url # Mac DockerDesktop minikube print the port
cd ~/go/src/github.com/panshiqu/server/game_server/game/dice/client
go run main.go -port 60006kubectl run dice -it --rm --restart Never --image panshiqu/gate_server:client
./dice_client -ip $GATE_SERVICE_HOST
EFK_Elasticsearch__Fluentd__Kibana_58">EFK (Elasticsearch + Fluentd + Kibana)

方案取自以下官方文档

  • 日志架构
  • Fluentd
  • 快速开始系列:其中Elasticsearch和Kibana
kubectl create -f https://download.elastic.co/downloads/eck/2.14.0/crds.yamlkubectl apply -f https://download.elastic.co/downloads/eck/2.14.0/operator.yamlcat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:name: quickstart
spec:version: 8.15.0nodeSets:- name: defaultcount: 1config:node.store.allow_mmap: false
EOF
{% raw %}
kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}'
{% endraw %}
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:name: quickstart
spec:version: 8.15.0count: 1elasticsearchRef:name: quickstart
EOFkubectl port-forward service/quickstart-kb-http 5601# 复制修改自:https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch-rbac.yaml
curl -s -O https://raw.githubusercontent.com/panshiqu/server/main/k8s/fluentd-daemonset-elasticsearch-rbac.yaml
kubectl apply -f fluentd-daemonset-elasticsearch-rbac.yaml # 请修改密码 FLUENT_ELASTICSEARCH_PASSWORD# Open https://localhost:5601
更新

游戏优雅停服细节说明

  • 请先查看资源配置中对preStop的注释
  • 首次收到SIGTERM信号,先标记停服后等待所有房间主动解散,没有房间则无需等待
  • 此时服务发现不再分配本服务但允许定向连接,可以进入旧房间但不允许创建新房间
  • 可对本服所有客户端定时持续广播房间将由系统解散,请主动解散后创建新房间(待实现)
  • 再次收到SIGTERM信号,触发解散现有房间
# 可选借助此命令将本地打包的镜像载入minikube
# minikube image load panshiqu/game_server:1.3# 可选在修改镜像前后通过调整partition来执行金丝雀发布,用以先更新并验证单个服务,值=replicas-1
# kubectl patch statefulsets dice -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":1}}}}'kubectl set image statefulsets dice game=panshiqu/game_server:1.3kubectl rollout status statefulsets dice# 验证测试不通过可以回滚
# kubectl rollout undo statefulsets dice# kubectl patch statefulsets dice -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'

网关得益于设计成重启几乎没有代价,客户端只会感到可能因为网络不好而触发了重连

kubectl set image deployments gate gate=panshiqu/gate_server:1.3

部署AB服,客户端老转新服将没有明确的时间限制

# 默认启用A服
kubectl apply -f https://raw.githubusercontent.com/panshiqu/server/main/k8s/dice-ab.yamlkubectl set image statefulsets dice-b game=panshiqu/game_server:1.3# 扩容开B服
kubectl scale statefulsets dice-b --replicas=2# 启用B服
kubectl patch service dice -p '{"spec":{"selector":{"group":"b"}}}'# 缩容停A服
kubectl scale statefulsets dice-a --replicas=0

http://www.ppmy.cn/news/1527426.html

相关文章

kubernetes架构

kubernetes cluster由master和node组成&#xff0c;节点上运行着若干kubernetes服务Master节点&#xff1a; master是kubernetes cluster的大脑&#xff0c;运行着的Daemon服务包括kube-apiserver&#xff0c;kube-scheduler,kube-controller-manager&#xff0c;etcd和Pod网络…

Docker基本概念详解及优势分析

Docker作为现代开发环境中不可或缺的工具&#xff0c;极大地简化了应用程序的开发、测试和部署流程。本篇文章将介绍Docker的基本概念&#xff0c;包括其架构、优势及常用命令&#xff0c;帮助您快速入门。 Docker是一个基于Go语言开发的开源应用容器引擎&#xff0c;遵循Apach…

预测日前电价:回顾最先进的算法、最佳实践和公开基准——阅读笔记

Forecasting day-ahead electricity prices: A review of state-of-the-art algorithms, best practices and an open-access benchmark 预测日前电价&#xff1a;回顾最先进的算法、最佳实践和公开基准 Applied Energy (2021) 摘要&#xff1a;电价预测在过去二十年间已经得到…

国产化中间件正在侵蚀开源中间件

开源中间件的发展趋势表明&#xff0c;它们将继续在技术创新和生态建设中发挥重要作用&#xff0c;尤其是在云计算、大数据等新兴技术领域。开源中间件如Apache Kafka、RabbitMQ、ActiveMQ和RocketMQ等在市场上有着广泛的应用。它们在技术社区中得到了良好的支持&#xff0c;并…

【数据结构OJ】DS线性表—多项式相加

题目描述 对于一元多项式p(x)p0p1xp2x2…pnxn&#xff0c;每个项都有系数和指数两部分&#xff0c;例如p2x2的系数为p2,指数为2。 编程实现两个多项式的相加。 例如5x2x23x3&#xff0c;-5-x6x24x4&#xff0c;两者相加结果&#xff1a;8x23x34x4 其中系数5和-5都是x的0次方…

2-91基于matlab的LQR倒立摆控制仿真

基于matlab的LQR倒立摆控制仿真。对于xAxBu 和yCxdu标准方程&#xff0c;文件qiuk中用LQR函数求解控制数组K&#xff0c;将K值带入fangzhen文件中&#xff08;文件中已代入&#xff09;&#xff0c;得到倒立摆稳定曲线。程序已调通&#xff0c;可直接运行。 下载源程序请点链接…

Android Studio下载Gradle失败问题解决

问题说明 使用 Android Studio 构建程序报错如下 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.5.1-bin.zip. Reason: java.net.SocketTimeoutException: Connect timed out问题解决 下载对应版本的压缩包 gradle-7.5.1…

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…