Jan 3, 2025
Jan 3, 2025
N/A Views
MD

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
Found a mistake? Update the entry.
Share this article: