Skip to content

Kubernetes上のminecraftのセットアップ

Posted on:September 23, 2023 at 10:30 AM
kube-manifests/minecraft at main · TOSUKUi/kube-manifests
Contribute to TOSUKUi/kube-manifests development by creating an account on GitHub.
kube-manifests/minecraft at main · TOSUKUi/kube-manifests favicon https://github.com/TOSUKUi/kube-manifests/tree/main/minecraft
kube-manifests/minecraft at main · TOSUKUi/kube-manifests

インフラ構成の概要

nfsセットアップ

nfs server clientのインストール

sudo apt update
sudo apt install nfs-kernel-server nfs-common

nfs でexportするディレクトリを設定

sudo vim /etc/exports

以下の変更を適用

/var/nfs/kubeがexportされる pods service nodesのcidrをすべて設定したのはとりあえずという感じ

# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
~~~~~
#
+ /var/nfs/kube 10.1.0.0/16(rw,sync,no_subtree_check) 10.2.0.0/16(rw,sync,no_subtree_check) 192.168.5.0/24(rw,sync,no_subtree_check)

これで/var/nfs/kubeをnfsマウントできる準備が整った

kubernetesの設定

persistent volumes周りの設定

/var/nfs/kube/minecraftをターゲットにしてpvを作成

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: minecraft-pv
  namespace: minecraft
spec:
  capacity:
    storage: 120Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: worker2
    path: /var/nfs/kube/minecraft

そのpvをターゲットにしたpvcを作成

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minecraft-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 120Gi
  storageClassName: ""
  volumeMode: Filesystem
  volumeName: minecraft-pv

pvを500Giとかにして、pvcを100GBに設定して、/var/nfs/kube/を、ターゲットにして、 複数のpvcからアクセスできないかも考えたが、1つのpvは1つのpvcに占有されるので無理だった

deploymentの設定

難易度normal、メモリ制限4GB、ボリュームはminecraft-pvcを/dataにマウントする設定

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minecraft
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minecraft
      version: v1
  template:
    metadata:
      labels:
        app: minecraft
        version: v1
    spec:
      serviceAccountName: minecraft
      containers:
      - image: itzg/minecraft-server
        name: minecraft
        ports:
        - containerPort: 25565
        env:
        - name: EULA
          value: "TRUE"
        - name: INIT_MEMORY
          value: "1G"
        - name: MAX_MEMORY
          value: "4G"
        - name: DIFFICULTY
          value: "normal"
        volumeMounts:
        - mountPath: "/data"
          name: world
      volumes:
      - name: world
        persistentVolumeClaim:
          claimName: minecraft-pvc

ネットワーク周りの設定

port 25566で受け付けたい。25565ではないのはなんとなくセキュアな気がするから。

まずistioでport25566を受付可能な状態にするため、 以下のファイルを作成

istio-extra-ports.yaml

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-with-extra-ports
spec:
  profile: demo
  components:
    ingressGateways:
      - namespace: istio-system
        name: istio-ingressgateway
        enabled: true
        k8s:
          service:
            ports:
              - port: 15021
                targetPort: 15021
                name: status-port
                protocol: TCP
              - port: 80
                targetPort: 8080
                name: http2
                protocol: TCP
              - port: 443
                targetPort: 8443
                name: https
                protocol: TCP
              - port: 15012
                targetPort: 15012
                name: tcp-istiod
                protocol: TCP
              - port: 15443
                targetPort: 15443
                name: tls
                protocol: TCP
              - port: 25566
                targetPort: 25566
                name: tcp-minecraft
                protocol: TCP

UDPは開ける意味がほぼないので開けていない

istioctlで上の設定をインストールする

istioctl install -f istio-extra-ports.yaml

これでport 25566がtcpで受付できるようになった

quote: https://learncloudnative.com/blog/2022-08-01-istio-gateway

istio gatewayでport 25566をminecraftに流す

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: minecraft-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 25566
      name: tcp
      protocol: TCP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: minecraft
spec:
  hosts:
  - "*"
  gateways:
  - minecraft-gateway
  tcp:
  - match:
    - port: 25566
    route:
    - destination:
        host: minecraft
        port:
          number: 25565

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: minecraft
  labels:
    app: minecraft
    service: minecraft
spec:
  ports:
  - name: minecraft
    protocol: TCP
    port: 25565
    targetPort: 25565
  selector:
    app: minecraft

これで25566をminecraftのpodにに流すネットワーク設定が完成した

実際に動かす

上記のmanifestが入ったディレクトリをapplyするだけ

kubectl create namespace minecraft
kubectl apply -f minecraft -n minecraft

懸案事項

実はこのあとmod serverを動かしたのだが、DiskI/Oが重くなるとnfsでは捌ききれないようでラグが頻発した。

そういった場合はlocal-storageによるボリュームを作成すると解決する。

ただ、それでもコンテナとボリュームは分離したいので、今後はパフォーマンスが高いと言われるiscsiを試してみる予定