☸️

KubernetesでMinecraftサーバーを構築してみた

2022/06/23に公開

こんにちは。
この前、自分の運営しているマインクラフトサーバーをk8sで構築し直しました。
今回はそのときに詰まったことや学んだこと等を紹介していきます。
https://dn5.run/service/sasa/

自己紹介

だだっこぱんだっていいます。k8s初心者で今回始めてさわりました。
高校3年です。ホントは受験勉強しないといけないのになぜかk8sの学習をしてしまいました。
ちょっと後悔してます。

環境

ProxmoxVE 7.2
Ubuntu 22.04 (LXC)
Kubernetes v1.24.2

Kubernetesをセットアップ

ProxmoxのLXCを使ってクラスタを作成しました。
手順は以下の記事とスクラップに書いてます。
https://zenn.dev/ddpn08/articles/d85176619f3fdd
https://zenn.dev/ddpn08/scraps/c91feddd3c3edd

ArgoCDを入れたりKubernetes-Dashboardを入れたり色々しました。

詰まったポイントその1 | 通信できない

はじめはCNIにCalicoを使用していたのですが、外への通信が一切できなくてつまりました。
原因はBGPというものにあるらしく、家はごく普通のルータを使っているのでBGPに対応していなく通信できなかったらしい(まだ良くわかっていない)。
Flannelに変更したら問題なく通信できるようになりました。

CloudflareAccessでいい感じにした

CloudflareAccess経由でArgoCDやKubernetes-Dashboardに接続できるようにしました。

https://github.com/dn5-run/k8s/blob/main/setup/access/argo-tunnel.yml
https://github.com/dn5-run/k8s/blob/main/setup/access/nginx.yml

https://twitter.com/ddPn08/status/1538140023232790528

データベース

MinecraftのCoreProtectやDynmap用のデータベースもk8sに移します。
うちのサーバーではMysqlを2つとMongodbを1つ使っているのでそれらを立ち上げます。
データはnfs経由で読み込みます。
pvとかpvcとかはじめはややこしく感じましたが、特に詰まることもなくすんなりと行きました。

強いて言うならphpMyAdminの環境変数にMYSQL_ROOT_PASSWORDが必要なのを知らず永遠と嘆いていたことくらい。(かなしかった)

https://github.com/dn5-run/k8s/tree/main/manifests/sasa/database

Minecraftを構築

ようやくMinecraftに入っていきます。
まずはプロキシかた立ち上げていきます。

Velocity

イメージはこれを使いました。
https://hub.docker.com/r/itzg/bungeecord

BungeeCordと書いていますがVelocityも使えるようです。

https://github.com/dn5-run/k8s/blob/main/manifests/sasa/minecraft/proxy/deployment.yml

ServiceはtypeをLoadBalancerに
ポートがデフォルトじゃないですが特にお気になさらず。

https://github.com/dn5-run/k8s/blob/main/manifests/sasa/minecraft/proxy/service.yml

各Minecraftサーバー

イメージは定番のこれです。
https://hub.docker.com/r/itzg/minecraft-server

https://github.com/dn5-run/k8s/blob/main/manifests/sasa/minecraft/main/deployment.yml

詰まったことその2 | サーバーが重い

全部いい感じにいった!と思い、早速起動してしばらく放置していたのですがどうやらハチャメチャにサーバーが重くなった模様。
TPSが常時10前後というなんとまあまともにプレイできない状態になっていました。

まず試したのがspec.containers[].resourcesをしっかり書いてみるということ。
これで多少は良くなったのですがそれでもまだすぐに落ちてしまう...

なんでかなーと思いながらサーバーのログを眺めていると、起動時に気になる行が

[init] Setting initial memory to 1G and max to 1G

1G!?!?!
と思い、dockerイメージのreadmeを読むと...

MEMORY: "1G" by default, can be used to adjust both initial (Xms) and max (Xmx) memory heap settings of the JVM

何も設定しないとメモリの最大値が1GBに設定されるらしい。

これに気が付かず2日くらい意味もなく1G制限された重いサーバーを走らせていました。

まとめ

なんやかんやで無事、マイクラサーバーをk8s運用に切り替えられました。今のところめちゃめちゃいい感じに動いています。

なんか詰まったこともっとあったようなきがするので思い出したら書き足します。
何か間違った情報を記載していましたら教えていただけると幸いです。

Discussion