⛏️

僕の考えた最強Minecraftサーバー構成 - Part1

2024/06/02に公開

こんにちは、おらです。
今回はぼくがかんがえたさいきょうのMinecraftサーバー構成について書いていきます。

タイトルにPart1と入れてるので多分Part2を作ります
Part1ではこの構成の何が良かったのかという点をインフラ面メインで話します。

ぼくがかんがえたさいきょうのMinecraftサーバー構成

はじめに構成を紹介しちゃいます。

使ってる技術

なんかそれっぽい図

構成図
こういうのの正しい書き方知らないのですごい見辛いかもです

図が示しているものについて軽く説明します。

  • 四角形
    • 雑なまとまり
  • 左右が2本線になっている四角形
    • アプリケーション, サービス, 的な
  • 端が四角い線
    • 通常のネットワーク接続
  • 端がひし形の線
    • Tailscale経由のネットワーク接続

軽く概要

家にある余ったパーツでサーバーを作ってます。
そこにProxmoxVEをインストールし、NFS, Mysqlを常駐させておくessentialsサーバーを立てます。
次に、Kubernetesクラスタを管理するための作業スペース用のworkspaceサーバーを立てます。
そうしたら、k8s-cp-01, k8s-wk-01の二つのサーバーを立てて、k3supでKubernetesクラスタを構築します。
その後、そのk8sクラスタでMinecraftサーバーを立てるためのあれこれを入れます。
最後に自宅のIPをそのまま公開するわけにはいかないので、間に挟むためのVPSをLinodeで借りて、そこにnginxサーバーを立ててTailscaleでminecraftサーバーとつなげば完成です。

いいとこ紹介

1. Tailscale

今回の構成ではすべてのサーバー&サービスがTailnetにつながっています。

https://tailscale.com/kb/1136/tailnet

Tailnetにつながっているおかげで、自宅ルータのポート開放等は一切必要なくなります。よって、家のサーバーを直接外部に公開する必要がなく、セキュリティ的にも安心です。
また、TailnetにつながっているおかげでいちいちサーバーのIPを確認する必要がなく、ホスト名を使ってアクセスできるのがすごく楽でした。

TailscaleのKubernetes operator

これがすごい便利でした。
いままで、Kubernetes内のサービスにアクセスするには、kubectl port-forwardを使ってローカルにポートフォワーディングをするか、LoadBalancerを使って外部に公開するかをしていました。
しかし、TailscaleのKubernetes operatorを使うと、Kubernetes内のサービスにTailscaleのIPでアクセスできるようになります。

なので、k8s内にあるMinecraftサーバー用のMysqlで作業したいときも、http://pve01-k8s-minecraft-phpmyadminでアクセスできるので、とても便利でした。

https://tailscale.com/kb/1236/kubernetes-operator

以下は、Tailscaleを使ったvelocityを公開するためのServiceの例です。

apiVersion: v1
kind: Service
metadata:
  namespace: minecraft
  name: minecraft-proxy
  labels:
    app: minecraft-proxy
  annotations:
    tailscale.com/hostname: pve01-k8s-minecraft-proxy
spec:
  ports:
    - name: java
      protocol: TCP
      port: 25577
      targetPort: 25577
    - name: be
      protocol: UDP
      port: 19132
      targetPort: 19132
    - name: votifier
      protocol: TCP
      port: 8192
      targetPort: 8192
  selector:
    app: minecraft-proxy
  type: LoadBalancer
  loadBalancerClass: tailscale

spec.typeLoadBalancerにして、spec.loadBalancerClasstailscaleにするだけで、TailscaleのIPでアクセスできるようになります。
またannotations.tailscale.com/hostnameに好きなホスト名を指定することもできます。

2. k3sup

これまたすんごいべんりでした。
https://github.com/alexellis/k3sup

k3s[1]を60秒以内でセットアップしてくれるツールです。
サーバーにsshできる状態でk3supを実行すると、勝手にsshして、k3sをインストール、セットアップ、実行してくれます。

いままではk8sのセットアップというと、自分でいろいろと入れないといけなかったり、通信できなくて詰まったりと、結構面倒だった印象だったので、k3supを初めて使ったときは本当に感動しました。
👇過去の戦闘履歴
https://zenn.dev/ddpn08/articles/66ecbdfa8e0a36

以下は、k3supを使ってk3sをインストールする例です。

openssl rand -base64 64 > token

export DATASTORE="mysql://user:pass@tcp(pve01-essentials:3306)/k8s"
export SERVER1="pve01-k8s-cp-01"
export AGENT1="pve01-k8s-wk-01"
export TOKEN=$(cat token)

k3sup install --user root --ip $SERVER1 --datastore="${DATASTORE}" --token=${TOKEN}
k3sup join --user root --server-ip $SERVER1 --ip $AGENT1 

k8s用のUbuntuサーバーを立てたらこのコマンドを実行すればあとは勝手にクラスタの1部になってくれます。
ここまでくるとUbuntuサーバーを立てるステップも高速にしたいですよね...

3. CloudInit

CloudInitはその名の通り、クラウドのインスタンスを初期化するためのツールです。
ProxmoxではこのCloudInitを使うことができます。

CloudInitを使うと

  • ユーザー名 & パスワード
  • SSH公開鍵
  • IPアドレス
  • ホスト名
  • パッケージのインストール

等々、様々な部分を自動化することができます。
いままでは、いちいちUbuntuServerのISOをダウンロードし、VMを作成してからインストールして、SSH公開鍵を登録して、パッケージをインストールして...といった手順を踏んでいましたが、CloudInitを使うことでこれらをスキップできます。
神ですね。

さいごに

今回は、ぼくがかんがえたさいきょうのMinecraftサーバー構成についてインフラ面メインで書いてみました。
といっても、趣味レベルでしかインフラ触ったことないので何か間違ってたりもっと良い方法があったりするかもです。
何かありましたらぜひコメント欄で教えていただけると嬉しいです。

あと、ゆるいマイクラサーバーを最近復旧(1年くらい放置していた)したので是非遊びに来てください
どなたでも大歓迎です。

https://sasa.run/

脚注
  1. 軽量版kubernetesみたいなものです。軽量版といっても自分が使う範囲の機能はカバーしているので今のところ困ったことはありません。おうちサーバーであんまりスペックも高くないので、k3sがちょうどよい感じです。 ↩︎

Discussion