使用Kubernetes搭建Factorio多人游戏服务器 (使用Docker和Kubernetes构建) 的步骤

请用中文来简述这篇文章。

这是Speee Advent Calendar 2017的第13天! 已经过了一半的时间了。
如果可以的话,请订阅。

前天是@yt-tanabe举办的SpeeeKaigi的制作方式(以及工程师文化)主题活动。

今天是@Tei1988使用Kubernetes进行Factorio游戏的日子。
通过阅读这篇文章,您可以学会使用Kubernetes构建Factorio游戏的多人服务器。

首先,Factorio是什么?

有一名玩家在某颗星球上不慎坠落,他利用该星球的资源制造了一枚火箭,并飞向太空等待援助,这是一个故事性的游戏。

官方网站、Steam、预告片

我們正在利用資源來製造火箭,但我們周圍只有鐵礦石和銅礦石等原材料,因此我們需要進行精煉和組合,製造更複雜的零件,例如齒輪和電子電路板。

需要制造火箭所需的零件数量庞大且种类繁多,因此手工制作是不可能的。
因此,我们建立工厂,并通过传送带输送材料,实现生产自动化。

建立多个工厂并实现生产自动化,观察材料不断组合并在传送带上流动,能够体验到一种神秘的成就感。

改進工廠運營率,或者為其他工廠作出調整,改變工廠佈局和資源配置的方式,這與程式編寫中的重構有類似之處。這是一款很好的遊戲,所有人,無論是否經常接觸程式碼,都能夠意識到重構的重要性。

事情的开始

“Factorio可以进行多人游戏。大家一起合作,发射火箭。
公司内已经有几个人拥有了这款游戏,并且决定要进行多人游戏。
那么,我们就需要让它支持多人游戏。
既然如此,我决定在记录步骤的同时,写一篇文章。”

在多人游戏中,有两种方法可供选择。

    需要一个人担任服务器角色,其他人连接到该服务器来构建游戏服务器。

1种方法构成简单,但是服务器的角色每次都必须参与,给人带来了很大的负担。

因此,这次我们选择了第二种方法。

建立游戏服务器

Factorio提供了一个没有图形功能的、无头的游戏服务器。

另外,有志在dtandersen/factorio中提供了一个只需启动即可的Docker镜像。因此,我们决定使用这个Docker镜像。

我的下一个问题是在哪里部署。
最近我非常喜欢Kubernetes,甚至在Speee DEVELOPER BLOG上写了一篇题为”我 ❤️ Kubernetes”的文章,所以我决定将其部署在GKE上。

以下是部署的步骤,请参考:

スクリーンショット 2017-12-12 19.39.03.png

那么,我们来亲自试玩一下Factorio的多人游戏吧。在启动Factorio之后,从菜单中选择“多人游戏 > 连接服务器”,然后输入指定的静态IP地址:34197。那么,你能登录成功吗?

顺便说一句,即使Factorio服务器由于某种原因崩溃,Kubernetes的自动部署可以帮助恢复Pod,所以基本上不需要进行任何额外的操作。

最后

我们现在正处于热烈地安装着Mods并和大约7个人一起开心地玩耍的阶段。矿石的种类增多了,所需生产物的种类也增加了,工厂变得非常复杂,不仅这样,重构工厂也变得更有趣了。在进行语音聊天的同时进行游戏会更加顺利。

只需告诉他们IP地址,他们就能立即加入,所以邀请进行多人游戏也非常轻松。

那么,祝你在工厂有一个愉快的生活。

明天,对新技术有着浓厚兴趣并撰写了类似于“尝试将SlackStatus与GoogleCalendar同步”以及“非工程师实现内部维基上的热力图”之类的文章的@nagayamacho3似乎要揭示圣诞老人的真正身份。请期待!

给你一点额外的东西。

(Bonus for you.)

让我们尝试引入Factorio的一个精彩之处 – 模组。

安装Mod

通过安装Mods,可以让Factorio的乐趣更加丰富。

一些玩家在进行多人游戏后,发现普通的Factorio已经无法满足他们的需要,于是决定引入Mods来增加乐趣。

在客户端上,可以从游戏界面安装Mod。只需点击想要安装的Mod,即可完成安装。
而在服务器端,则需要直接将Mod放入特定文件夹中。

由于Mods是与客户端共享的,所以将Mods复制到客户端是最快捷的方法。

这一次,我们决定将Mods添加到Docker镜像中。
另外,我们也决定不再使用ConfigMap来存储配置文件,而是将其包含在镜像中。

创建包含Mods的Docker映像的步骤如下。

    1. 克隆Tei1988/k8s-factorio的mods分支。

 

    1. 将Mods复制到files/mods文件夹中,不要忘记mod-list.json文件。

 

    1. 如果需要的话,还可以修改files/config/文件夹下的设置。

 

    1. 使用docker build -t gcr.io/项目ID/factorio:mods命令构建镜像。

 

    使用docker push gcr.io/项目ID/factorio:mods命令推送镜像。

完成了Docker镜像的创建。

接下来,在部署到Kubernetes之前,请删除保存的数据。
如果你想要继续之前的保存进度,请创建一个本地备份,例如复制保存数据到本地或复制pd-factorio磁盘等。
重新创建pd-factorio磁盘会导致保存数据被删除。

最后,将创建的Docker镜像部署到Kubernetes。
我认为您可以使用以下命令进行部署。

    1. 请执行以下操作,以便正确替换IP和项目名称后运行:

将cat k8s.yml.sample文件的内容传递给sed命令,将””替换为”確保した静的IP”,然后将其输出传递给下一个sed命令,将””替换为”プロジェクトID”,最后将结果写入k8s.yml文件。

执行kubectl apply -f k8s.yml命令来应用k8s.yml文件。