この記事は
この記事を読めば、7 Days to Dieのマルチプレイ用サーバをKubernetesで構築することができます。
そもそも7Days to Dieって?
ゾンビを倒したり、拠点を作ったり、ご飯を作ったり、野菜を育てたり、クエストをこなしたりして、荒廃した世界を生き残るゲームです。
また、定期的にゾンビが大量に襲ってくるので、拠点で迎え撃つタワーディフェンス的な要素もあります。
リアルなマインクラフトと呼ばれることもあるようで、素材を集めてクラフトして、3Dマップ上で自由度高く拠点を作っていくことができます。
ことの始まり
やさぐれゆむ さんの 【7 Days to Die】一ヶ月公園生活【ゆっくり実況】の動画シリーズを見て、興味が湧いたので調べてみたところ、7 Days to Die はマルチプレイが可能でした。
そこで、いつも夜な夜なFactorioで遊んでいる同僚と一緒にプレイすることにしました。
さて、マルチプレイができるようにしなければなりません。
せっかくなので、手順などを残すついでに、記事を書くことにしました。
マルチプレイにも方法が二種類あります。
- 誰か一人がサーバ役になって、他の人がそこへ接続する
- ゲームサーバを構築する
1の方法は手軽なのですが、サーバ役の人がいなければゲームを進められないため今回は採用しませんでした。
今回は2の方法を選択しました。
ちなみに、ゲーム自体は2013年頃に発売したゲームなのですが、まだ更新もされています。
ゲームサーバを構築する
7 Days to Dieは、Linux向けのheadlessなゲームサーバを用意してくれています。
これは、SteamCMDを経由してインストールすることが可能です。
今回は、Kubernetesにデプロイすることにしました。
マニフェストは、Tei1988/k8s-7d2dのリポジトリにまとめました。
クローンしてきたら、 k8s/services/tcp.yaml.example
と k8s/services/udp.yaml.example
内の <ExternalIP>
の部分を各自の環境に応じて修正して、ファイル名から .example
を削除してください。
その後、以下のようにマニフェストをクラスタに適用します。
cd k8s
kubectl kustomize . | kubectl apply -f -
Podが立ち上がるときにInitContainerでゲームのダウンロードもしくはアップデートを行います。
初回起動時はゲームのダウンロードが必要で、結構な容量をダウンロードしてくるので、立ち上がるのに割と時間がかかります。
また、起動時にはアセットの読み込みなどが走るため、readinessProbeを長めに設定している関係で、リポジトリのマニフェストだと5分ぐらい待つ必要があります。いい感じに調整してください。
Dockerイメージにしてしまうことも考えたのですが、容量が大きくなってしまうのであきらめて、PersistentVolumeClaimで確保したディスクにインストールしています。
Podが立ち上がったら、 7 Days to Die を起動して、JOIN GAME > Connect to IP... と進んでいき、 <ExternalIP>
を置き替えたIPを入力して CONNECT を押せば、ログインできる、ハズです。
おわりに
マルチプレイでいつでも入れる状態にしていると、いつの間にかとんでもない建築物ができていたりして、とても面白かったですね。
また、一緒にやる場合はボイスチャットをしながらプレイすると捗ります。
ではでは。
おまけ
7 Days to DieはModにも対応しています。
Modを入れるためのPersistentVolumeClaimも作ってあるので、7 Days to Die のPodが立ち上がっていないときに何かしらのPodにマウントしてファイルを配置したり、コンテナ起動中に kubectl cp
や kubectl exec
などを使って /7d2d/mods
にファイルを配置すれば次回起動時にModが適応された状態で遊べます。
うまく立ち上がらない場合
もしかしたら、ノードのメモリが足らないかもしれないです。
起動するだけで4GBほど必要で、3人でログインして赤い日になると5GB~6GB近くまで行きます。
(定期的に跳ねているのはPreemptible Nodeを使っているのでノードが落ちた時に、Podが二個になっているためだと思われます。)
専用のVPSサーバとかを借りてdocker-composeとかで構築してしまったほうが。。。げほごほ。
はい、なんでもありません。