Minecraft Serverは機能豊富なhelm chartが用意されているので、Kubernetes上にインストールすると運用が楽です。
本記事では検証環境としてKind (Kubernetes in Docker)上にMinecraft Serverをインストールするメモを記します。
Kind Clusterの作成
brew install kind
kind create cluster
$ kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane 39s v1.32.0 192.168.107.2 <none> Debian GNU/Linux 12 (bookworm) 6.12.5-orbstack-00287-gf8da5d508983 containerd://1.7.24
MetalLBのインストール
筆者はDocker RuntimeとしてOrbStackを使用しています。OrbStackであればtype=LoadBalancerのServiceに対して、Macのホストからルーティング可能になります。
kind上でtype=LoadBalancerのServiceでExternal IPが払い出されるようにMetal LBをインストールします。
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
kubectl wait --namespace metallb-system \
--for=condition=ready pod \
--selector=app=metallb \
--timeout=90s
次のコマンドでDocker NetworkのIPv4のSubnetを取得します。
SUBNET=$(docker network inspect -f '{{(index (index .IPAM.Config 1) "Subnet")}}' kind)
確認します。
$ echo $SUBNET
192.168.107.0/24
Tip
取得できない場合はSUBNET=$(docker network inspect -f '{{(index (index .IPAM.Config 0) "Subnet")}}' kind)を試してください。
MetalLBが払い出すIPのレンジを設定します。この例では192.168.107.200-192.168.107.250を対象にします。
cat <<EOF > metallb.yaml
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: example
namespace: metallb-system
spec:
addresses:
- $(echo $SUBNET | cut -d. -f1-3).200-$(echo $SUBNET | cut -d. -f1-3).250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: empty
namespace: metallb-system
---
EOF
kubectl apply -f metallb.yaml
Minecraft Serverのインストール
事前準備ができたのでいよいよMinecraft Serverをインストールします。
https://github.com/itzg/minecraft-server-charts/tree/master/charts/minecraft のhelm chartを使用します。
ServerのIPは以下のIPで固定します。
MINECRAFT_IP=$(echo $SUBNET | cut -d. -f1-3).222
$ echo $MINECRAFT_IP
192.168.107.222
helm-values.yamlを作成します。ここではVanilla Serverをインストールしますが、typeに"VANILLA", "FORGE", "PAPER"などが選択可能です。選択可能なtypeはこちらを参照してください。
cat <<EOF > helm-values.yaml
---
minecraftServer:
eula: "TRUE"
type: "VANILLA"
version: "1.21.4"
difficulty: easy
gameMode: creative
overrideServerProperties: true
serviceType: LoadBalancer
loadBalancerIP: $MINECRAFT_IP
externalTrafficPolicy: Local
memory: 4096M
rcon:
enabled: true
resources:
requests:
memory: 3.5Gi
persistence:
dataDir:
enabled: true
Size: 8Gi
---
EOF
Tip
筆者はOracle Cloud Infrastructure Container Engine for Kubernetes(OKE)上で運用しています。
OKE上のhelm-values.yamlはこちらを参照してください。
helmでMinecraft Serverをインストールします。
helm upgrade --install \
-n minecraft minecraft itzg/minecraft \
-f helm-values.yaml \
--create-namespace \
--wait
しばらくするとPodがReadyになり、LoadBalancerも指定したExternal IPで作成されます。
$ kubectl get pod,svc -n minecraft
NAME READY STATUS RESTARTS AGE
pod/minecraft-minecraft-58746c5689-lcwxw 1/1 Running 0 66s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minecraft-minecraft LoadBalancer 10.96.5.89 192.168.107.222 25565:32239/TCP 66s
service/minecraft-minecraft-rcon ClusterIP 10.96.218.111 <none> 25575/TCP 66s
helmコマンドでもstatusを確認できます。
$ helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
minecraft minecraft 1 2025-01-03 16:47:39.39652 +0900 JST deployed minecraft-4.23.3 SeeValues
このServerに対してクライアントから接続します。
無事接続できました。
アンインストールは次のコマンドで行えます。kind上であれば、試行錯誤で試せますね。
helm uninstall -n minecraft minecraft --wait