在 Kubernetes 上运行我的世界

    作者:匿名更新于: 2023-02-11 21:34:55

      决定将服务器部署在 Azure 上,开一个 8c16g 的虚拟机并安装 k3s。数据呢,通过 blog-csi-driver 持久化存储在 Azure 的 Blob Storage 上。

      假期给小朋友装上了叨叨许久的 Minecraft(我的世界),为了体验安装的是 开源启动器 HMCL。其实这游戏我也关注比较久了,不过感觉太耗时间。但被小朋友拉上一起玩,便研究了下自建服务器。GitHub 发现已经有人做好了 Minecraft 服务端容器镜像,先是在 HomeLab 上用 Docker 部署,通过多人连线就能玩起来了。

      由于不会玩几下被小朋友给打死,后来才发现还有“和平模式”。无聊转而研究下如何在公有云上部署:

      我的 HomeLab 常年运行,由于没有重要的数据,不管是对硬件稳定性和数据备份都没有投入,担心游戏数据丢失被埋怨。放在公有云上使用公有云的对象存储,避免数据丢失

      偶尔外出时玩的话,还需要 VPN 连回家才能玩

      他有朋友一起玩时还能方便联机

      最主要的原因还是去年加入微软 MVP 时,有送 Azure 的 credit,不用实属浪费

      基于上面的原因,决定将服务器部署在 Azure 上,开一个 8c16g 的虚拟机并安装 k3s。数据呢,通过 blog-csi-driver 持久化存储在 Azure 的 Blob Storage 上。

      开始吧!

      安装 k3s

      运行下面的命令进行安装,1.23 版本即可。

      复制

      1.  export INSTALL_K3S_VERSION=v1.23.8+k3s2

      2.  curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

      k3s 安装之后,需要安装 blob storage 的 CSI 驱动。根据 文档说明 驱动要使用 v0.9.0 以上的版本,才能使用 存储账户 做动态配置。

      安装 CSI 驱动

      复制

      1.  curl -skSL https://raw.githubusercontent.com/kubernetes-sigs/blob-csi-driver/v1.19.0/deploy/install-driver.sh | bash -s v1.19.0 blobfuse-proxy --

      创建 StorageClass

      先登录到 Azure Portal 在 存储账户 中创建账户,记得区域的选择和虚拟机相同;网络权限中选择只允许虚拟网络的访问。创建完成后,在账户的 访问秘钥 中可以获取到 key。

      执行下面的命令,使用前面的账户名和 key 创建 secert。

      复制

      1.  kubectl create secret generic azure-secret --from-literal azurestorageaccountname=[ACCOUNT HERE] --from-literal azurestorageaccountkey=[KEY HERE] --type=Opaque

      接下来就是使用该 secret 创建 StorageClass。

      复制

      1.  kubectl apply -f - <

      2.  ---

      3.  apiVersion: storage.k8s.io/v1

      4.  kind: StorageClass

      5.  metadata:

      6.  name: blob-fuse

      7.  provisioner: blob.csi.azure.com

      8.  allowVolumeExpansion: true

      9.  parameters:

      10.  csi.storage.k8s.io/provisioner-secret-name: azure-secret

      11.  csi.storage.k8s.io/provisioner-secret-namespace: default

      12.  csi.storage.k8s.io/node-stage-secret-name: azure-secret

      13.  csi.storage.k8s.io/node-stage-secret-namespace: default

      14.  EOF

      创建 PVC

      有了 StorageClass 之后,就可以创建 PersistentVolumeClaim 了,指定使用上面的 StorageClass ​​blob-fuse​​。

      复制

      1.  kubectl apply -f - <

      2.  apiVersion: v1

      3.  kind: PersistentVolumeClaim

      4.  metadata:

      5.  name: minecraft-pvc

      6.  spec:

      7.  storageClassName: blob-fuse

      8.  accessModes:

      9.  - ReadWriteMany

      10.  resources:

      11.  requests:

      12.  storage: 100Gi

      13.  EOF

      部署 Minecraft 服务器

      使用 Deployment 进行部署,并创建 NodePort Service。镜像使用 ​​itzg/minecraft-server:java17​​,相关的配置可以参考 官方的文档(我怕再被打,启用了和平模式)。

      复制

      1.  kubectl apply -f - <

      2.  apiVersion: apps/v1

      3.  kind: Deployment

      4.  metadata:

      5.  creationTimestamp: null

      6.  labels:

      7.  app: minecraft

      8.  name: minecraft

      9.  spec:

      10.  replicas: 1

      11. selector:

      12.  matchLabels:

      13.  app: minecraft

      14.  strategy: {}

      15.  template:

      16.  metadata:

      17.  creationTimestamp: null

      18.  labels:

      19.  app: minecraft

      20.  spec:

      21.  containers:

      22.  - image: itzg/minecraft-server:java17

      23.  name: minecraft-server

      24.  env:

      25.  - name: EULA

      26.  value: "TRUE"

      27.  - name: ONLINE_MODE

      28.  value: "FALSE"

      29.  - name: DIFFICULTY

      30.  value: peaceful

      31.  - name: PVP

      32.  value: "false"

      33.  - name: UID

      34.  value: "0"

      35.  - name: GID

      36.  value: "0"

      37.  - name: MEMORY

      38.  value: "4G"

      39.  resources: {}

      40.  ports:

      41.  - containerPort: 25565

      42.  protocol: TCP

      43.  volumeMounts:

      44.  - name: persistent-storage

      45.  mountPath: /data

      46.  volumes:

      47.  - name: persistent-storage

      48.  persistentVolumeClaim:

      49.  claimName: minecraft-pvc

      50.  ---

      51.  apiVersion: v1

      52.  kind: Service

      53.  metadata:

      54.  labels:

      55.  app: minecraft

      56.  name: minecraft

      57.  spec:

      58.  ports:

      59.  - port: 25565

      60.  protocol: TCP

      61.  targetPort: 25565

      62.  selector:

      63.  app: minecraft

      64.  type: NodePort

      65.  EOF

      测试

      启动客户端,在多人游戏中添加服务器:地址是虚拟机的公共 IP,端口是 Service 的 NodePort。

      

    self-hosting-minecraft

      接下来就可以愉快的玩耍了。

      来源: 云原生指北

        >>>>>>点击进入计算专题

云计算 更多推荐

课课家教育

未登录