3

在 Kubernetes 上运行我的世界

 1 year ago
source link: https://www.51cto.com/article/745119.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在 Kubernetes 上运行我的世界

作者:张晓辉 2023-01-26 11:56:31
决定将服务器部署在 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 版本即可。

export INSTALL_K3S_VERSION=v1.23.8+k3s2
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 驱动

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。

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

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

kubectl apply -f - <<EOF
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: blob-fuse
provisioner: blob.csi.azure.com
allowVolumeExpansion: true
parameters:
  csi.storage.k8s.io/provisioner-secret-name: azure-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: azure-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default
EOF

创建 PVC

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

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minecraft-pvc
spec:
  storageClassName: blob-fuse
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
EOF

部署 Minecraft 服务器

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

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: minecraft
  name: minecraft
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minecraft
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: minecraft
    spec:
      containers:
      - image: itzg/minecraft-server:java17
        name: minecraft-server
        env:
        - name: EULA
          value: "TRUE"
        - name: ONLINE_MODE
          value: "FALSE"
        - name: DIFFICULTY
          value: peaceful
        - name: PVP
          value: "false"
        - name: UID
          value: "0"
        - name: GID
          value: "0"
        - name: MEMORY
          value: "4G"
        resources: {}
        ports:
        - containerPort: 25565
          protocol: TCP
        volumeMounts:
        - name: persistent-storage
          mountPath: /data
      volumes:
        - name: persistent-storage
          persistentVolumeClaim:
            claimName: minecraft-pvc
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: minecraft
  name: minecraft
spec:
  ports:
  - port: 25565
    protocol: TCP
    targetPort: 25565
  selector:
    app: minecraft
  type: NodePort
EOF

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

图片

self-hosting-minecraft

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK