僕の考えた最強Minecraftサーバー構成 - Part1
こんにちは、おらです。
今回はぼくがかんがえたさいきょうの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につながっています。
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
でアクセスできるので、とても便利でした。
以下は、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.type
をLoadBalancer
にして、spec.loadBalancerClass
をtailscale
にするだけで、TailscaleのIPでアクセスできるようになります。
またannotations.tailscale.com/hostname
に好きなホスト名を指定することもできます。
2. k3sup
これまたすんごいべんりでした。
k3s[1]を60秒以内でセットアップしてくれるツールです。
サーバーにsshできる状態でk3supを実行すると、勝手にsshして、k3sをインストール、セットアップ、実行してくれます。
いままではk8sのセットアップというと、自分でいろいろと入れないといけなかったり、通信できなくて詰まったりと、結構面倒だった印象だったので、k3supを初めて使ったときは本当に感動しました。
👇過去の戦闘履歴
以下は、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年くらい放置していた)したので是非遊びに来てください
どなたでも大歓迎です。
-
軽量版kubernetesみたいなものです。軽量版といっても自分が使う範囲の機能はカバーしているので今のところ困ったことはありません。おうちサーバーであんまりスペックも高くないので、k3sがちょうどよい感じです。 ↩︎
Discussion